[PATCH] services: bluetooth: Add missing config parameters

  • Done
  • quality assurance status badge
Details
4 participants
  • Demis Balbach
  • Josselin Poiret
  • Liliana Marie Prikler
  • Ludovic Courtès
Owner
unassigned
Submitted by
Demis Balbach
Severity
normal
Merged with
D
D
Demis Balbach wrote on 13 Dec 2021 20:20
(address . guix-patches@gnu.org)(name . Demis Balbach)(address . db@minikn.xyz)
20211213192014.8386-1-db@minikn.xyz
---
gnu/services/desktop.scm | 332 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 328 insertions(+), 4 deletions(-)

Toggle diff (349 lines)
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 64d0e85301..23b730d7d4 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -402,14 +402,338 @@ (define-record-type* <bluetooth-configuration>
bluetooth-configuration make-bluetooth-configuration
bluetooth-configuration?
(bluez bluetooth-configuration-bluez (default bluez))
- (auto-enable? bluetooth-configuration-auto-enable? (default #f)))
+
+ ;;; [General]
+ (name bluetooth-configuration-name (default "BlueZ"))
+ (class bluetooth-configuration-class (default "0x000000"))
+ (discoverable-timeout
+ bluetooth-configuration-discoverable-timeout (default 180))
+ (always-pairable? bluetooth-configuration-always-pairable? (default #f))
+ (pairable-timeout bluetooth-configuration-pairable-timeout (default 0))
+ (device-id bluetooth-configuration-device-id (default ""))
+ (reverse-service-discovery?
+ bluetooth-configuration-reverse-service-discovery (default #t))
+ (name-resolving? bluetooth-configuration-name-resolving? (default #t))
+ (debug-keys? bluetooth-configuration-debug-keys? (default #f))
+
+ ;;; Possible values:
+ ;;; 'dual, 'bredr, 'le
+ (controller-mode bluetooth-configuration-controller-mode (default 'dual))
+
+ ;;; Possible values:
+ ;;; 'off, 'single, 'multiple
+ (multi-profile bluetooth-configuration-multi-profile (default 'off))
+ (fast-connectable? bluetooth-configuration-fast-connectable? (default #f))
+
+ ;;; Possible values:
+ ;;; for LE mode: 'off, 'network/on, 'device
+ ;;; for Dual mode: 'off, 'network/on', 'device, 'limited-network, 'limited-device
+ ;;; Source: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/main.conf#n68
+ (privacy bluetooth-configuration-privacy (default 'off))
+
+ ;;; Possible values:
+ ;;; 'never, 'confirm, 'always
+ (just-works-repairing
+ bluetooth-configuration-just-works-repairing (default 'never))
+ (temporary-timeout bluetooth-configuration-temporary-timeout (default 30))
+ (refresh-discovery? bluetooth-configuration-refresh-discovery (default #t))
+
+ ;;; Possible values: 'true, 'false, <UUID>
+ ;;; Possible UUIDs:
+ ;;; d4992530-b9ec-469f-ab01-6c481c47da1c (BlueZ Experimental Debug)
+ ;;; 671b10b5-42c0-4696-9227-eb28d1b049d6 (BlueZ Experimental Simultaneous Central and Peripheral)
+ ;;; 15c0a148-c273-11ea-b3de-0242ac130004 (BlueZ Experimental LL privacy)
+ ;;; 330859bc-7506-492d-9370-9a6f0614037f (BlueZ Experimental Bluetooth Quality Report)
+ ;;; a6695ace-ee7f-4fb9-881a-5fac66c629af (BlueZ Experimental Offload Codecs)
+ ;;; Source: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/main.conf#n110
+ (experimental bluetooth-configuration-experimental (default 'false))
+ (remote-name-request-retry-delay
+ bluetooth-configuration-remote-name-request-retry-delay (default 300))
+
+ ;;; [BR]
+ (page-scan-type bluetooth-configuration-page-scan-type (default -1))
+ (page-scan-interval bluetooth-configuration-page-scan-interval (default -1))
+ (page-scan-window bluetooth-configuration-page-scan-window (default 'nil))
+ (inquiry-scan-type bluetooth-configuration-inquiry-scan-type (default 'nil))
+ (inquiry-scan-interval bluetooth-configuration-inquiry-scan-interval (default -1))
+ (inquiry-scan-window bluetooth-configuration-inquiry-scan-window (default 'nil))
+ (link-supervision-timeout bluetooth-configuration-link-supervision-timeout (default -1))
+ (page-timeout bluetooth-configuration-page-timeout (default -1))
+ (min-sniff-interval bluetooth-configuration-min-sniff-interval (default -1))
+ (max-sniff-interval bluetooth-configuration-max-sniff-interval (default -1))
+
+ ;;; [LE]
+ (min-advertisement-interval
+ bluetooth-configuration-min-advertisement-interval (default -1))
+ (max-advertisement-interval
+ bluetooth-configuration-max-advertisement-interval (default -1))
+ (multi-advertisement-rotation-interval
+ bluetooth-configuration-multi-advertisement-rotation-interval (default -1))
+ (scan-interval-auto-connect
+ bluetooth-configuration-scan-interval-auto-connect (default 'nil))
+ (scan-window-auto-connect
+ bluetooth-configuration-scan-window-auto-connect (default 'nil))
+ (scan-interval-suspend
+ bluetooth-configuration-scan-interval-suspend (default 'nil))
+ (scan-window-suspend
+ bluetooth-configuration-scan-window-suspend (default 'nil))
+ (scan-interval-discovery
+ bluetooth-configuration-scan-interval-discovery (default 'nil))
+ (scan-window-discovery
+ bluetooth-configuration-scan-window-discovery (default 'nil))
+ (scan-interval-adv-monitor
+ bluetooth-configuration-scan-interval-adv-monitor (default 'nil))
+ (scan-window-adv-monitor
+ bluetooth-configuration-scan-window-adv-monitor (default 'nil))
+ (scan-interval-connect
+ bluetooth-configuration-scan-interval-connect (default 'nil))
+ (scan-window-connect
+ bluetooth-configuration-scan-window-connect (default 'nil))
+ (min-connection-interval
+ bluetooth-configuration-min-connection-interval (default -1))
+ (max-connection-interval
+ bluetooth-configuration-max-connection-interval (default -1))
+ (connection-latency
+ bluetooth-configuration-connection-latency (default -1))
+ (connection-supervision-timeout
+ bluetooth-configuration-connection-supervision-timeout (default -1))
+ (autoconnect-timeout
+ bluetooth-configuration-autoconnect-timeout (default -1))
+ (adv-mon-allowlist-scan-duration
+ bluetooth-configuration-adv-mon-allowlist-scan-duration (default 300))
+ (adv-mon-no-filter-scan-duration
+ bluetooth-configuration-adv-mon-no-filter-scan-duration (default 500))
+ (enable-adv-mon-interleave-scan
+ bluetooth-configuration-enable-adv-mon-interleave-scan (default 1))
+
+ ;;; [GATT]
+ ;;; Possible values: 'yes, 'no, 'always
+ (cache bluetooth-configuration-cache (default 'always))
+
+ ;;; Possible values: 7 ... 16, 0 (don't care)
+ (key-size bluetooth-configuration-key-size (default 0))
+
+ ;;; Possible values: 23 ... 517
+ (exchange-mtu bluetooth-configuration-exchange-mtu (default 517))
+
+ ;;; Possible values: 1 ... 5
+ (att-channels bluetooth-configuration-att-channels (default 3))
+
+ ;;; [AVDTP]
+ ;;; Possible values: 'basic, 'ertm
+ (session-mode bluetooth-configuration-session-mode (default 'basic))
+
+ ;;; Possible values: 'basic, 'streaming
+ (stream-mode bluetooth-configuration-stream-mode (default 'basic))
+
+ ;;; [Policy]
+ (reconnect-uuids bluetooth-configuration-reconnect-uuids (default '()))
+ (reconnect-attempts bluetooth-configuration-reconnect-attempts (default 7))
+ (reconnect-intervals bluetooth-configuration-reconnect-intervals
+ (default (list 1 2 4 8 16 32 64)))
+ (auto-enable? bluetooth-configuration-auto-enable? (default #f))
+ (resume-delay bluetooth-configuration-resume-delay (default 2))
+
+ ;;; [AdvMon]
+ ;;; Possible values:
+ ;;; "0x00", "0xFF",
+ ;;; "N = 0x00" ... "N = 0xFF"
+ ;;; Source: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/main.conf#n286
+ (rssi-sampling-period bluetooth-configuration-rssi-sampling-period
+ (default "0xFF")))
(define (bluetooth-configuration-file config)
"Return a configuration file for the systemd bluetooth service, as a string."
(string-append
- "[Policy]\n"
- "AutoEnable=" (bool (bluetooth-configuration-auto-enable?
- config))))
+ "[General]"
+ "\nName = " (bluetooth-configuration-name config)
+ "\nClass = " (bluetooth-configuration-class config)
+ "\nDiscoverableTimeout = " (number->string
+ (bluetooth-configuration-discoverable-timeout
+ config))
+ "\nAlwaysPairable = " (bool (bluetooth-configuration-always-pairable?
+ config))
+ "\nPairableTimeout = " (number->string
+ (bluetooth-configuration-pairable-timeout
+ config))
+ (if (not (string-null? (bluetooth-configuration-device-id config)))
+ (string-append "\nDeviceID = " (bluetooth-configuration-device-id config))
+ "")
+ "\nReverseServiceDiscovery = " (bool
+ (bluetooth-configuration-reverse-service-discovery
+ config))
+ "\nNameResolving = " (bool (bluetooth-configuration-name-resolving? config))
+ "\nDebugKeys = " (bool (bluetooth-configuration-debug-keys? config))
+ "\nControllerMode = " (symbol->string
+ (bluetooth-configuration-controller-mode config))
+ "\nMultiProfile = " (symbol->string (bluetooth-configuration-multi-profile
+ config))
+ "\nFastConnectable = " (bool (bluetooth-configuration-fast-connectable? config))
+ "\nPrivacy = " (symbol->string (bluetooth-configuration-privacy config))
+ "\nJustWorksRepairing = " (symbol->string
+ (bluetooth-configuration-just-works-repairing config))
+ "\nTemporaryTimeout = " (number->string
+ (bluetooth-configuration-temporary-timeout config))
+ "\nRefreshDiscovery = " (bool (bluetooth-configuration-refresh-discovery config))
+ "\nExperimental = " (symbol->string (bluetooth-configuration-experimental config))
+ "\nRemoteNameRequestRetryDelay = " (number->string
+ (bluetooth-configuration-remote-name-request-retry-delay
+ config))
+ "\n[BR]"
+ (if (not (eq? -1 (bluetooth-configuration-page-scan-type config)))
+ (string-append
+ "\nPageScanType = "
+ (number->string (bluetooth-configuration-page-scan-type config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-page-scan-interval config)))
+ (string-append
+ "\nPageScanInterval = "
+ (number->string (bluetooth-configuration-page-scan-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-page-scan-window config)))
+ (string-append
+ "\nPageScanWindow = "
+ (number->string (bluetooth-configuration-page-scan-window config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-inquiry-scan-type config)))
+ (string-append
+ "\nInquiryScanType = "
+ (number->string (bluetooth-configuration-inquiry-scan-type config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-inquiry-scan-interval config)))
+ (string-append
+ "\nInquiryScanInterval = "
+ (number->string (bluetooth-configuration-inquiry-scan-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-inquiry-scan-window config)))
+ (string-append
+ "\nInquiryScanWindow = "
+ (number->string (bluetooth-configuration-inquiry-scan-window config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-link-supervision-timeout config)))
+ (string-append
+ "\nLinkSupervisionTimeout = "
+ (number->string (bluetooth-configuration-link-supervision-timeout config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-page-timeout config)))
+ (string-append
+ "\nPageTimeout = "
+ (number->string (bluetooth-configuration-page-timeout config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-min-sniff-interval config)))
+ (string-append
+ "\nMinSniffInterval = "
+ (number->string (bluetooth-configuration-min-sniff-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-max-sniff-interval config)))
+ (string-append
+ "\nMaxSniffInterval = "
+ (number->string (bluetooth-configuration-max-sniff-interval config))) "")
+
+ "\n[LE]"
+ (if (not (eq? -1 (bluetooth-configuration-min-advertisement-interval config)))
+ (string-append
+ "\nMinAdvertisementInterval = "
+ (number->string (bluetooth-configuration-min-advertisement-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-max-advertisement-interval config)))
+ (string-append
+ "\nMaxAdvertisementInterval = "
+ (number->string (bluetooth-configuration-max-advertisement-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-multi-advertisement-rotation-interval config)))
+ (string-append
+ "\nMultiAdvertisementRotationInterval = "
+ (number->string
+ (bluetooth-configuration-multi-advertisement-rotation-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-interval-auto-connect config)))
+ (string-append
+ "\nScanIntervalAutoConnect = "
+ (number->string (bluetooth-configuration-scan-interval-auto-connect config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-window-auto-connect config)))
+ (string-append
+ "\nScanWindowAutoConnect = "
+ (number->string (bluetooth-configuration-scan-window-auto-connect config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-interval-suspend config)))
+ (string-append
+ "\nScanIntervalSuspend = "
+ (number->string (bluetooth-configuration-scan-interval-suspend config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-window-suspend config)))
+ (string-append
+ "\nScanWindowSuspend = "
+ (number->string (bluetooth-configuration-scan-window-suspend config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-interval-discovery config)))
+ (string-append
+ "\nScanIntervalDiscovery = "
+ (number->string (bluetooth-configuration-scan-interval-discovery config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-window-discovery config)))
+ (string-append
+ "\nScanWindowDiscovery = "
+ (number->string (bluetooth-configuration-scan-window-discovery config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-interval-adv-monitor config)))
+ (string-append
+ "\nScanIntervalAdvMonitor = "
+ (number->string (bluetooth-configuration-scan-interval-adv-monitor config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-window-adv-monitor config)))
+ (string-append
+ "\nScanWindowAdvMonitor = "
+ (number->string (bluetooth-configuration-scan-window-adv-monitor config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-interval-connect config)))
+ (string-append
+ "\nScanIntervalConnect = "
+ (number->string (bluetooth-configuration-scan-interval-connect config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-scan-window-connect config)))
+ (string-append
+ "\nScanWindowConnect = "
+ (number->string (bluetooth-configuration-scan-window-connect config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-min-connection-interval config)))
+ (string-append
+ "\nMinConnectionInterval = "
+ (number->string (bluetooth-configuration-min-connection-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-max-connection-interval config)))
+ (string-append
+ "\nMaxConnectionInterval = "
+ (number->string (bluetooth-configuration-max-connection-interval config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-connection-latency config)))
+ (string-append
+ "\nConnectionLatency = "
+ (number->string (bluetooth-configuration-connection-latency config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-connection-supervision-timeout config)))
+ (string-append
+ "\nConnectionSupervisionTimeout = "
+ (number->string (bluetooth-configuration-connection-supervision-timeout config))) "")
+ (if (not (eq? -1 (bluetooth-configuration-autoconnect-timeout config)))
+ (string-append
+ "\nAutoconnecttimeout = "
+ (number->string (bluetooth-configuration-autoconnect-timeout config))) "")
+
+ "\nAdvMonAllowlistScanDuration = " (number->string
+ (bluetooth-configuration-adv-mon-allowlist-scan-duration
+ config))
+ "\nAdvMonNoFilterScanDuration = " (number->string
+ (bluetooth-configuration-adv-mon-no-filter-scan-duration
+ config))
+ "\nEnableAdvMonInterleaveScan = " (number->string
+ (bluetooth-configuration-enable-adv-mon-interleave-scan
+ config))
+
+ "\n[GATT]"
+ "\nCache = " (symbol->string (bluetooth-configuration-cache config))
+ "\nKeySize = " (number->string (bluetooth-configuration-key-size config))
+ "\nExchangeMTU = " (number->string (bluetooth-configuration-exchange-mtu config))
+ "\nChannels = " (number->string (bluetooth-configuration-att-channels config))
+
+ "\n[AVDTP]"
+ "\nSessionMode = " (symbol->string (bluetooth-configuration-session-mode config))
+ "\nStreamMode = " (symbol->string (bluetooth-configuration-stream-mode config))
+
+ "\n[Policy]"
+ (if (not (eq? '() (bluetooth-configuration-reconnect-uuids config)))
+ (string-append
+ "\nReconnectUUIDs = "
+ (string-join (bluetooth-configuration-reconnect-uuids config) ",")) "")
+ "\nReconnectAttempts = " (number->string
+ (bluetooth-configuration-reconnect-attempts config))
+ "\nReconnectIntervals = " (string-join
+ (map number->string
+ (bluetooth-configuration-reconnect-intervals
+ config))
+ ",")
+ "\nAutoEnable = " (bool (bluetooth-configuration-auto-enable?
+ config))
+ "\nResumeDelay = " (number->string (bluetooth-configuration-resume-delay config))
+
+ "\n[AdvMon]"
+ "\nRSSISamplingPeriod = " (bluetooth-configuration-rssi-sampling-period config)))
(define (bluetooth-directory config)
(computed-file "etc-bluetooth"
--
2.34.0
D
D
Demis Balbach wrote on 13 Dec 2021 20:36
(address . 52470@debbugs.gnu.org)
87bl1kthz3.fsf@minikn.xyz
Hello,

this patch adds all (as far as I know) missing config parameters to the
bluetooth-service.

I added all config parameters (that were missing) that are defined in

If a default value was given, e.g.:

Toggle snippet (6 lines)
# Specify the policy to the JUST-WORKS repairing initiated by peer
# Possible values: "never", "confirm", "always"
# Defaults to "never" <------------------------------------------
#JustWorksRepairing = never

I used that default value. However, there are other paramaters
(everthing under `[BR]' and almost everything under `[LE]') that don't
specify default values. They are always integers as one can see here:


So I took a nonsensical value like `-1' and only printed the in question
with the user provided line if it did not equal -1.

This approach isn't pretty, but it worked for me, however please give
feedback regarding that.
My guile-fu is bad so I'm sure there's plenty room for improvement.

Here is the config I tested it with:

Toggle snippet (99 lines)
(define-module (base-system)
#:use-module (gnu)
#:use-module (gnu services desktop)
#:use-module (srfi srfi-1))

(define base-operating-system
(operating-system

;; Machine settings
(host-name "geekcave")
(timezone "Europe/Berlin")
(locale "en_US.utf8")
(keyboard-layout (keyboard-layout "us" "altgr-intl"))

;; Services
(services (append (list
(service bluetooth-service-type (bluetooth-configuration
(name "test")
(class "0x123")
(discoverable-timeout 60)
(always-pairable? #f)
(pairable-timeout 20)
(device-id "bluetooth:123")
(reverse-service-discovery? #f)
(name-resolving? #f)
(debug-keys? #t)
(controller-mode 'le)
(multi-profile 'multiple)
(fast-connectable? #t)
(privacy 'network/on)
(just-works-repairing 'confirm)
(temporary-timeout 10)
(refresh-discovery? #f)
(experimental 'd4992530-b9ec-469f-ab01-6c481c47da1c)
(remote-name-request-retry-delay 20)
(page-scan-type #xFFF)
(page-scan-interval #x0)
(page-scan-window #x1)
(inquiry-scan-type #xFFFF)
(inquiry-scan-interval #x123)
(inquiry-scan-window 23890)
(link-supervision-timeout 13)
(page-timeout 9)
(min-sniff-interval 0)
(max-sniff-interval 2)
(min-advertisement-interval 0)
(max-advertisement-interval 2)
(multi-advertisement-rotation-interval 3)
(scan-interval-auto-connect 0)
(scan-window-auto-connect 0)
(scan-interval-suspend 0)
(scan-window-suspend 0)
(scan-interval-discovery 0)
(scan-window-discovery 0)
(scan-interval-adv-monitor 0)
(scan-window-adv-monitor 0)
(scan-interval-connect 0)
(scan-window-connect 0)
(min-connection-interval 0)
(max-connection-interval 1)
(connection-latency 10)
(connection-supervision-timeout 34)
(autoconnect-timeout 4)
(adv-mon-allowlist-scan-duration 20)
(adv-mon-no-filter-scan-duration 30)
(enable-adv-mon-interleave-scan 0)
(cache 'yes)
(key-size 15)
(exchange-mtu 23)
(att-channels 1)
(session-mode 'ertm)
(stream-mode 'streaming)
(reconnect-uuids (list ""))
(reconnect-attempts 3)
(reconnect-intervals (list 2 4 49))
(auto-enable? #t)
(resume-delay 29)
(rssi-sampling-period "0x10"))))
%base-services))

;; Boot loader
(bootloader (bootloader-configuration
(bootloader grub-efi-bootloader)
(target "/boot/efi")
(timeout 3)))

;; File systems
(file-systems (cons* (file-system ;; System partition
(device (file-system-label "GUIX"))
(mount-point "/")
(type "btrfs"))
(file-system ;; Boot partition
(device (file-system-label "BOOT"))
(mount-point "/boot/efi")
(type "vfat"))
%base-file-systems))))
base-operating-system

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG3oMAOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFywlBAAolYphE1kmix39nGoRD1imbP01A59/4dh7sO6
8cn7DOwXQzwruDRLS9KMD4B60e/wTDNXnq4XDdi73SbN1P2+3vtJZ22lbYnCOfSP
HAFPrIf0Zw+nQ6lUjmtqDrGsnSs9tSNxEkMtVi3F8TJfvqZxfGuE2oBpCyd8c6iu
fvooKDN5B3mYnurO/O7mXIEOgnklUe2YVWSegO8Z0fP762f2XRtoy+NxJ20LWoSD
ypSliKPTKaZHS+G0RxOBuyb1v2Ust8YGG80p7tvrZYikiU26XGRPXGoWYnpYy3jk
9Igej+vXur5ii98RWAYniK68PzhAOXGW4gB9FurVP0oJ/Mmb0zaIH6BISPXxxOsY
2lrf1W1afM/sQHl8HdKuxBNbBYyMC6RY5oLMZvKAeD0/7HOva0qWKTxz/jDxUBWi
VEea1XW0OiEbgfmWvuzlO4C2qi8WYYkSSpJUCPvLsWCunQ90eSNqTncyFI0ARe0S
fENSJdUaT8yo8ls7abCd4yHIR+8TsZCOiJP9hnye2JW2QmkO3j2VtknL/0JU52ZH
4EtvBksKE+WCxnIRAeSyRShoqjCDkLjf0nh2BtgJcemJK0NH9mrHw57yO2k/yh9X
TCWs7zYOUYC1aPSUewr0tqE9UqFTB3gRrZNerc1V+/EJH+/9o6H3gNsCJyZLU/Vf
V6c92QA=
=gJ70
-----END PGP SIGNATURE-----

J
J
Josselin Poiret wrote on 14 Dec 2021 14:03
Re: [bug#52470] [PATCH] services: bluetooth: Add missing config parameters
(address . dev@jpoiret.xyz)
87bl1jfiel.fsf@jpoiret.xyz
Hello,

Demis Balbach <db@minikn.xyz> writes:

Toggle quote (5 lines)
> Hello,
>
> this patch adds all (as far as I know) missing config parameters to
> the bluetooth-service.

Nice work!

Toggle quote (9 lines)
> I used that default value. However, there are other paramaters
> (everthing under `[BR]' and almost everything under `[LE]') that don't
> specify default values. They are always integers as one can see here:
>
> https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/btd.h#n39
>
> So I took a nonsensical value like `-1' and only printed the in
> question with the user provided line if it did not equal -1.

Since Guile isn't typed, the usual approach is to use `#f` for default
values, and then use `(if (bluetooth-configuration-inquiry-scan-window
config) ...)` for example. Any value other than #f will be considered
as truthful for conditionals (see "(guile)Booleans").

Toggle quote (5 lines)
> + (if (not (eq? -1 (bluetooth-configuration-page-scan-type config)))
> + (string-append
> + "\nPageScanType = "
> + (number->string (bluetooth-configuration-page-scan-type config))) "")

Small nitpick, I'd rather have `""`, the else part of this if syntax, on
its own line, aligned with `(string-append`.

Could you also document the `bluetooth-service-type` Scheme value in
doc/guix.texi, as well as `bluetooth-configuration`, if that's not too
much to ask? I only see one for `bluetooth-service` right now. I'm not
sure if all configuration values should be documented there though,
since there are a lot.

By the way, shouldn't `bluetooth-service` be deprecated, given how
simple it is to use the `-type` version?

What do others think?

Best,
Josselin Poiret
D
D
Demis Balbach wrote on 14 Dec 2021 15:51
(address . dev@jpoiret.xyz)
875yrrqlxt.fsf@minikn.xyz
On 2021-12-14 14:03, Josselin Poiret wrote:

Hello,

Toggle quote (5 lines)
> Since Guile isn't typed, the usual approach is to use `#f` for default
> values, and then use `(if (bluetooth-configuration-inquiry-scan-window
> config) ...)` for example. Any value other than #f will be considered
> as truthful for conditionals (see "(guile)Booleans").

I tried that, and I could have sworn I got an error regarding the
type. I was under the impression that the default values' type set the
type for the whole field. But I was wrong of course because I tested
your suggestion and it worked.

Toggle quote (3 lines)
> Small nitpick, I'd rather have `""`, the else part of this if syntax, on
> its own line, aligned with `(string-append`.

Please do nitpick. I appreciate it. I think the `[General]` part looks
pretty messy indentation-wise, but I don't really know what layout to
settle on.

Toggle quote (6 lines)
> Could you also document the `bluetooth-service-type` Scheme value in
> doc/guix.texi, as well as `bluetooth-configuration`, if that's not too
> much to ask? I only see one for `bluetooth-service` right now. I'm not
> sure if all configuration values should be documented there though,
> since there are a lot.

Sure. How can I test the changes to the documentation? Like generating a
pdf or something along those lines.

Toggle quote (3 lines)
> By the way, shouldn't `bluetooth-service` be deprecated, given how
> simple it is to use the `-type` version?

I'm not the one to answer that :)

Toggle quote (5 lines)
> What do others think?
>
> Best,
> Josselin Poiret

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG4r24OHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFzkghAAqhYkNa1llPjd4qVKkYBOar+GRsbYtlSsiexK
Y75mZpScIG2iaIWMOPMHudiFzJgVIIkEgUqrFp0yjOBDwAvDpXACsLAXu2QCXYq9
UC+EymiPHMVOw138E2jnh+ebOMFIi097hyyrxhlZcUFQiOObvb+jcn2lt/gm9IH/
q+UR6DDpaOl/k/YmRm3m7GXJ+W70TJM86HHOhUXWGSFSRQiI0Kwl2hCFaOPFzPsM
uFVEKonFyT/01qRF/ev5bOd3KDa0sB25+DZd/a1+/7ZYPWcdjNSA8N795whPu7tP
n1oz7ZavJOlP3PVRajw74xDkvTu/RfbowJQ/ca/C2enmRzjx0LnZpn14xrN01KHL
8igBrFHhXDHYDDPDSBxSfu+FJpTyD5ndabGGy53iJ/k0jFAQ4Ts0r5Nl39sZWlfi
IwsBG7qSQ9jhaW35vwIU1RF7eoTNOQtTW9ddxBy6BLoq876/fFOKy9ifp6U8wJNv
6GivDpBLu7CH0EPRx4W+3G8FPSPfternvzBbfWhS0w+kNu5ZJv8HLxjtdw5qe5As
ctcY0azxTjRl7+d3yg+Hg96cmrx8T4OJl07rF2QO9r1tzpdWX0PHJ6P+EG0vpNNi
AChQ9qZGY7ZghmVsPLorMVZ41HPRzxVHpjq92bxo/cXtDa+6ED7GN3TCFqltY612
yDcjhrc=
=S0/X
-----END PGP SIGNATURE-----

D
D
Demis Balbach wrote on 14 Dec 2021 21:50
(address . dev@jpoiret.xyz)
8735murjvx.fsf@minikn.xyz
On 2021-12-14 14:03, Josselin Poiret wrote:

I've added a new patch. ID: 52489.
Please check for spelling mistakes/typos.

This kind of work is very repetitive and thus prone to errors.

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG5A5IOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFzA2RAArgJELZvec8kYnGBP4u3XPFcWmcoKF6VG36EK
oPqiN+o6m6vN9tmhx9gVid9f70AG7pSx2fR8BAuZC5MX0DORy14tBQIXpUbCWvyO
zL8NwLeipVMQJrD2cHsGEPrfxdjMW8UtqLQIBejMRd/tTkypwYLOOK4PkjS0c/7R
GMS50CIwioIPr+sc4h4vC0s+4KK8WmW+b5VnDv4EfuvuOASk7h9lpDVp+/FF5ot2
MxSQV6DS+sHcGOS5n7dS3LgUwwzLORcVaMxaQI7rwWyUvSAJFFlV6sWNavoRDfz6
zqlK5edf1nEJQBiI86lUM/fK8LH97Uugf8iD8ks1JDpUmnMeQ/M3EntFWNnL6xAw
BDCmjWv71CHm/CcVbAw1CmzJ+uHlpN20mu7W3V90iBllFjIJ/vDSsfBXxxaAS+1z
bueT8rlHpTIyFi7QbdTkg4oyxPhaztdYFYRJi5Xed+4hU5FwsiZe9DSTcQd4NptH
OtYS7ykaRiiTmPP2uTWrk6xIiCR23aQLhYLkC8auq6ir0jKyF5z6XOKEXkNSgI3U
b45NX0/I/kXE31vsrFnGebdgAJ5qxkFiRZJb2NNE8Q7+O01PaC+75tayH2whKf73
yOsIgysp2FBLomoiGmKwr8G2eR2ytAg58SrqekJK31nqGz9EOTqqLbRYAfpDw564
oR8eDR0=
=5ZZR
-----END PGP SIGNATURE-----

L
L
Liliana Marie Prikler wrote on 18 Dec 2021 12:02
[PATCH] services: bluetooth: Add missing config parameters
3616338da321d379a9d78260fa06ba849b2318d3.camel@gmail.com
merge 52470 52489 52575
thanks

Please don't open up a new bug number for a new patch. Instead, reply
to the old one. Thanks.
D
D
Demis Balbach wrote on 19 Dec 2021 14:11
(address . 52470@debbugs.gnu.org)
878rwgagdm.fsf@minikn.xyz
Hello Liliana,

thanks for your input on https://issues.guix.gnu.org/52575.
I will continue the discussion about it here.

You prepend most of your comments with "Why not do ...". I have an
universal answer for that: I don't know :) I did what I did with the
limited Guile knowledge at my disposal. I'm still learning everyday and
therefore am thankful for your recommendations.

Toggle quote (2 lines)
> Is it really a good idea to use a string-encoded number here? Why not
> a number? Why not two? A pair or list of symbols mayhaps?
It should be a number, you are correct.

Toggle quote (2 lines)
> You maybe want to have a <device-id> record here, but fair enough, a
> string works too.
I can see the benefit of that, but maybe that's something for another
patch. I can add a `;;; MAYBE: ` comment to the implementation however
if that's desired.

Toggle quote (2 lines)
> Why have a key network/on? Why not use 'on and 'network and document,
> that they function the same due to (insert implementation detail).
I think this point we need to discuss. I tried to implement things as
close as possible to the "original" keys/values in

Specifically for the `privacy` key, you can see the implementation here

in particular

Toggle snippet (5 lines)
# Possible values for LE mode: "off", "network/on", "device"
# Possible values for Dual mode: "off", "network/on", "device",
# "limited-network", "limited-device"

Now, I don't think it's a good idea to introduce arbitrary values for
Guix, meaning split `network/on` in `'network` and `'on`. In my opinion
(which may very well be wrong) the config values applicable in Guix
should match those in the resulting config file as close as possible.

For a user coming to Guix who already worked with the bluetooth configuration on
another distro, seeing `'network` and/or `'on` (but not `'network/on`)
as possible config values, is confusing, at least I think it is.

Toggle quote (3 lines)
> Why a list of UUIDs? Wouldn't it make more sense to use symbols like
> 'debug, 'll-privacy, 'quality-report, etc.?
> On that note, we have a UUID type, so use it.
I actually didn't know there's a UUID type. This makes more sense. But
not a list as only one value can be applied. Also I would advise
introducing symbol like `'ll-privacy` and the like because of what I
said earlier.

Toggle quote (1 lines)
> Should be a boolean.
Same point here. I used boolean types whereever the config value need
was `true`/`false`. In this particular case (I don't know why) the
bluetooth implementations expects `0`/`1` instead of the former. This is
why I kept it a number. However, in this case I think it's okay to
deviate from the original implementation because `0` and false / `1` and
`true` are universally understood as being equivalent (By this of course
I mean the user would set `#f`/`#t`, the written value however would
still be `0`/`1`).

Toggle quote (1 lines)
> Might want to rename/alias 'yes to 'paired.
Again, same point here. `'paired` would be an arbitrary value only Guix
have.

Toggle quote (1 lines)
> You probably want to write that as "an integer 7 <= N <= 16".
...
Toggle quote (1 lines)
>As above.
Yes, absolutely.

Toggle quote (2 lines)
> Again, make sure that your code works with UUIDs here if it doesn't
> already.
Will do.

Toggle quote (1 lines)
> Use numbers, not strings.
Will do.

I'll create a new patch with all the things altered I agree about. I'll
leave the rest until we have talked about the points I made.

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG/L5UOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFwDcQ/+ORzrlQxQJi0lfJg1FaTW/6eCOBLctkLoFsaB
dWbO8Zaz75B/k0TqwZ8E1fiPWfzlSX7fmlqzDuWSh8wDt1cH9c7I3QNKgY7eCpTy
1Z/aFZl1O/Fu7Em5lZWMh3Ce89lDe9+ijTQqGHPaIi6ZC0bJ/vAxRkibwLMBQDC0
8ltFrP/fVJicnKTASqspDVQ0c91l5XuXSDTo+VOoAbP7zpIFNCvKSWLIRfrcJNxj
mFDzP2Dekp/NqWkWIydTPlyDYlkojiv07zLjaSP44EcF2CeWrFOA9RhkJvUxl0Ks
Y7SxGCfJfhHKSTvGG/DfLweCVUpN0iAUeffyrtheoJ0rkUYcMmKff2qyJgIHWYM2
cH4d5F0/G6WL0Unc0n0U5pY26gfIrA441KgT3ROebF/8hnBbINVBHzmRmaPxYGfx
vThFO9Go9brvz7xCdKIWcTVp6WzhfbaW/EDf+r6f9rEmTNm/XPjGBR2inDV4J2bH
2NMi7nKo+jWuQ4wBlseRm5tdDyIO3SEO4HrTW5EB6UdozQrPRKLObmYfJtilnPk2
3DLFMZ0ZZOxK6wyiqGMPN7+q8OKGkvX4DGYDgCRNq4WBnTtVTvmTgYLeeA1wtvjj
SqFxbTXix/hE+EGnuleSEtds/FoVuuq33WkIFDEV2dMQjE56iwDWPae43lw4ZV2E
2JaxnC4=
=cXfC
-----END PGP SIGNATURE-----

D
D
Demis Balbach wrote on 19 Dec 2021 14:19
(address . 52470@debbugs.gnu.org)
8735moag1m.fsf@minikn.xyz
Toggle quote (5 lines)
> I actually didn't know there's a UUID type. This makes more sense. But
> not a list as only one value can be applied. Also I would advise
> introducing symbol like `'ll-privacy` and the like because of what I
> said earlier.

Typo: I meant "advise AGAINST introducing ... "

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG/MUUOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFzopg//fK60U2EA+KRO8/S6Kxlks2ViIkDryZtEAkbj
Q+YSvoM8BuDtmOs0HSJTY528LBYkOGr42vVfCHHnBCzpoGSnEEMvDNXs7IBgUBa7
orvlqTstjVkwwSiPeKlWwbccVRAoPrtW2yi2UMRTswyRwrtAZB6ije5ITF5zSiOS
vRgkGKfNmgDVKhIzlqtre789PpI292p1yg6SS3JXUZToPx0vp7ZB1f1RD3NbkDzz
uhJYQ5ktreFy14OTIv7UwRVUZLuMV2UVym+bib+Q1wJKDM4TnkzXjPNfawLOpBkY
hK1mgMgM8o7ltR6pg4PqA8MYvA2N6P2V1zX9FJUzveoM/zPaeEjuS7oBx9+qFDuV
R5pyTM5YEF8lu8i0kOw5HLRpdDbR8zidGDkcZBaH5WPN+kIlsUJGWAu9ccJqnDYn
SbRufmHTdgMn1wiGej6HKw+o/1mPNysr7GC5r1aqkdugKZIhP54J2n7kQadCY7/1
ioY+7NJvtgeRV/njdUlppsxa0oqJsgMYL6qM9gBCNvahDmPlqOXGkKxL9icSjuWD
GhXEPLt46XYEPdsow+5l2/cmsZKsQTtlvNVpfLGz5yzSq2nRXNgYzD1xr99Au2G5
wvMFno9KN+EIqqasBsOSXSv071D5tti8VcQ03H1Yne/IsLp23F2G3bidR7LSOFDL
sos/MZ4=
=eHm9
-----END PGP SIGNATURE-----

D
D
Demis Balbach wrote on 19 Dec 2021 17:41
(address . 52470@debbugs.gnu.org)
87zgow8s39.fsf@minikn.xyz
---
doc/guix.texi | 443 ++++++++++++++++++++++++++++++++++++++-
gnu/services/desktop.scm | 375 ++++++++++++++++++++++++++++++++-
2 files changed, 813 insertions(+), 5 deletions(-)

Toggle diff (564 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index aca88cdada..138a862ff1 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -20777,6 +20777,448 @@ bluetooth keyboard or mouse.
Users need to be in the @code{lp} group to access the D-Bus service.
@end deffn
+@deffn {Scheme Variable} bluetooth-service-type
+This is the type for the @uref{https://bluez.org/, Linux Bluetooth Protocol
+Stack} (BlueZ) system, which generates the @file{/etc/bluetooth/main.conf}
+configuration file. The value for this type is a @command{bluetooth-configuration}
+record as in this example:
+
+@lisp
+(service bluetooth-service-type)
+@end lisp
+
+See below for details about @code{bluetooth-configuration}.
+@end deffn
+
+@deftp {Data Type} bluetooth-configuration
+Data type representing the configuration for @code{bluetooth-service}.
+
+@table @asis
+@item @code{bluez} (default: @code{bluez})
+@code{bluez} package to use.
+
+@item @code{name} (default: @code{"BlueZ"})
+Default adapter name.
+
+@item @code{class} (default: @code{#x000000})
+Default device class. Only the major and minor device class bits are considered.
+
+@item @code{discoverable-timeout} (default: @code{180})
+How long to stay in discoverable mode before going back to non-discoverable. The
+value is in seconds.
+
+@item @code{always-pairable?} (default: @code{#f})
+Always allow pairing even if there are no agents registered.
+
+@item @code{pairable-timeout} (default: @code{0})
+How long to stay in pairable mode before going back to non-discoverable. The
+value is in seconds.
+
+@item @code{device-id} (default: @code{#f})
+Use vendor id source (assigner), vendor, product and version information for
+DID profile support. The values are separated by ":" and @var{assigner}, @var{VID},
+@var{PID} and @var{version}.
+
+Possible values are:
+
+@itemize @bullet
+@item
+@code{#f} to disable it,
+
+@item
+@code{"assigner:1234:5678:abcd"}, where @var{assigner} is either @code{usb} (default)
+or @code{bluetooth}.
+
+@end itemize
+
+@item @code{reverse-service-discovery?} (default: @code{#t})
+Do reverse service discovery for previously unknown devices that connect to
+us. For BR/EDR this option is really only needed for qualification since the
+BITE tester doesn't like us doing reverse SDP for some test cases, for LE
+this disables the GATT client functionally so it can be used in system which
+can only operate as peripheral.
+
+@item @code{name-resolving?} (default: @code{#t})
+Enable name resolving after inquiry. Set it to @code{#f} if you don't need
+remote devices name and want shorter discovery cycle.
+
+@item @code{debug-keys?} (default: @code{#f})
+Enable runtime persistency of debug link keys. Default is false which makes
+debug link keys valid only for the duration of the connection that they were
+created for.
+
+@item @code{controller-mode} (default: @code{'dual})
+Restricts all controllers to the specified transport. @code{'dual} means both
+BR/EDR and LE are enabled (if supported by the hardware).
+
+Possible values are:
+
+@itemize @bullet
+@item
+@code{'dual}
+
+@item
+@code{'bredr}
+
+@item
+@code{'le}
+
+@end itemize
+
+@item @code{multi-profile} (default: @code{'off})
+Enables Multi Profile Specification support. This allows to specify if system
+supports only Multiple Profiles Single Device (MPSD) configuration or both
+Multiple Profiles Single Device (MPSD) and Multiple Profiles Multiple Devices
+(MPMD) configurations.
+
+Possible values are:
+
+@itemize @bullet
+@item
+@code{'off}
+
+@item
+@code{'single}
+
+@item
+@code{'multiple}
+
+@end itemize
+
+@item @code{fast-connectable?} (default: @code{#f})
+Permanently enables the Fast Connectable setting for adapters that support
+it. When enabled other devices can connect faster to us, however the
+tradeoff is increased power consumptions. This feature will fully work only
+on kernel version 4.1 and newer.
+
+@item @code{privacy} (default: @code{'off})
+Default privacy settings.
+
+@itemize @bullet
+@item
+@code{'off}: Disable local privacy
+
+@item
+@code{'network/on}: A device will only accept advertising packets from peer
+devices that contain private addresses. It may not be compatible with some
+legacy devices since it requires the use of RPA(s) all the time
+
+@item
+@code{'device}: A device in device privacy mode is only concerned about the
+privacy of the device and will accept advertising packets from peer devices
+that contain their Identity Address as well as ones that contain a private
+address, even if the peer device has distributed its IRK in the past
+
+@end itemize
+
+and additionally, if @var{controller-mode} is set to @code{'dual}:
+
+@itemize @bullet
+@item
+@code{'limited-network}: Apply Limited Discoverable Mode to advertising, which
+follows the same policy as to BR/EDR that publishes the identity address when
+discoverable, and Network Privacy Mode for scanning
+
+@item
+@code{'limited-device}: Apply Limited Discoverable Mode to advertising, which
+follows the same policy as to BR/EDR that publishes the identity address when
+discoverable, and Device Privacy Mode for scanning.
+
+@end itemize
+
+@item @code{just-works-repairing} (default: @code{'never})
+Specify the policy to the JUST-WORKS repairing initiated by peer.
+
+Possible values:
+@itemize @bullet
+@item
+@code{'never}
+
+@item
+@code{'confirm}
+
+@item
+@code{'always}
+
+@end itemize
+
+@item @code{temporary-timeout} (default: @code{30})
+How long to keep temporary devices around. The value is in seconds. @code{0}
+disables the timer completely.
+
+@item @code{refresh-discovery?} (default: @code{#t})
+Enables the device to issue an SDP request to update known services when
+profile is connected.
+
+@item @code{experimental} (default: @code{#f})
+Enables experimental features and interfaces, alternatively a list of UUIDs
+can be given.
+
+Possible values:
+
+@itemize @bullet
+@item
+@code{#t}
+
+@item
+@code{#f}
+
+@item
+@code{(list (uuid <uuid-1>) (uuid <uuid-2>) ...)}.
+@end itemize
+
+List of possible UUIDs:
+@itemize @bullet
+@item
+@code{d4992530-b9ec-469f-ab01-6c481c47da1c}: BlueZ Experimental Debug,
+
+@item
+@code{671b10b5-42c0-4696-9227-eb28d1b049d6}: BlueZ Experimental Simultaneous Central and Peripheral,
+
+@item
+@code{"15c0a148-c273-11ea-b3de-0242ac130004}: BlueZ Experimental LL privacy,
+
+@item
+@code{330859bc-7506-492d-9370-9a6f0614037f}: BlueZ Experimental Bluetooth Quality Report,
+
+@item
+@code{a6695ace-ee7f-4fb9-881a-5fac66c629af}: BlueZ Experimental Offload Codecs.
+@end itemize
+
+@item @code{remote-name-request-retry-delay} (default: @code{300})
+The duration to avoid retrying to resolve a peer's name, if the previous
+try failed.
+
+@item @code{page-scan-type} (default: @code{#f})
+BR/EDR Page scan activity type.
+
+@item @code{page-scan-interval} (default: @code{#f})
+BR/EDR Page scan activity interval.
+
+@item @code{page-scan-window} (default: @code{#f})
+BR/EDR Page scan activity window.
+
+@item @code{inquiry-scan-type} (default: @code{#f})
+BR/EDR Inquiry scan activity type.
+
+@item @code{inquiry-scan-interval} (default: @code{#f})
+BR/EDR Inquiry scan activity interval.
+
+@item @code{inquiry-scan-window} (default: @code{#f})
+BR/EDR Inquiry scan activity window.
+
+@item @code{link-supervision-timeout} (default: @code{#f})
+BR/EDR Link supervision timeout.
+
+@item @code{page-timeout} (default: @code{#f})
+BR/EDR Page timeout.
+
+@item @code{min-sniff-interval} (default: @code{#f})
+BR/EDR minimum sniff interval.
+
+@item @code{max-sniff-interval} (default: @code{#f})
+BR/EDR maximum sniff interval.
+
+@item @code{min-advertisement-interval} (default: @code{#f})
+LE minimum advertisement interval (used for legacy advertisement only).
+
+@item @code{max-advertisement-interval} (default: @code{#f})
+LE maximum advertisement interval (used for legacy advertisement only).
+
+@item @code{multi-advertisement-rotation-interval} (default: @code{#f})
+LE multiple advertisement rotation interval.
+
+@item @code{scan-interval-auto-connect} (default: @code{#f})
+LE scanning interval used for passive scanning supporting auto connect.
+
+@item @code{scan-window-auto-connect} (default: @code{#f})
+LE scanning window used for passive scanning supporting auto connect.
+
+@item @code{scan-interval-suspend} (default: @code{#f})
+LE scanning interval used for active scanning supporting wake from suspend.
+
+@item @code{scan-window-suspend} (default: @code{#f})
+LE scanning window used for active scanning supporting wake from suspend.
+
+@item @code{scan-interval-discovery} (default: @code{#f})
+LE scanning interval used for active scanning supporting discovery.
+
+@item @code{scan-window-discovery} (default: @code{#f})
+LE scanning window used for active scanning supporting discovery.
+
+@item @code{scan-interval-adv-monitor} (default: @code{#f})
+LE scanning interval used for passive scanning supporting the advertisement monitor APIs.
+
+@item @code{scan-window-adv-monitor} (default: @code{#f})
+LE scanning window used for passive scanning supporting the advertisement monitor APIs.
+
+@item @code{scan-interval-connect} (default: @code{#f})
+LE scanning interval used for connection establishment.
+
+@item @code{scan-window-connect} (default: @code{#f})
+LE scanning window used for connection establishment.
+
+@item @code{min-connection-interval} (default: @code{#f})
+LE default minimum connection interval. This value is superceeded by any specific
+value provided via the Load Connection Parameters interface.
+
+@item @code{max-connection-interval} (default: @code{#f})
+LE default maximum connection interval. This value is superceeded by any specific
+value provided via the Load Connection Parameters interface.
+
+@item @code{connection-latency} (default: @code{#f})
+LE default connection latency. This value is superceeded by any specific
+value provided via the Load Connection Parameters interface.
+
+@item @code{connection-supervision-timeout} (default: @code{#f})
+LE default connection supervision timeout. This value is superceeded by any specific
+value provided via the Load Connection Parameters interface.
+
+@item @code{autoconnect-timeout} (default: @code{#f})
+LE default autoconnect timeout. This value is superceeded by any specific
+value provided via the Load Connection Parameters interface.
+
+@item @code{adv-mon-allowlist-scan-duration} (default: @code{300})
+Allowlist scan duration during interleaving scan. Only used when scanning for ADV
+monitors. The units are msec.
+
+@item @code{adv-mon-no-filter-scan-duration} (default: @code{500})
+No filter scan duration during interleaving scan. Only used when scanning for ADV
+monitors. The units are msec.
+
+@item @code{enable-adv-mon-interleave-scan?} (default: @code{#t})
+Enable/Disable Advertisement Monitor interleave scan for power saving.
+
+@item @code{cache} (default: @code{'always})
+GATT attribute cache.
+
+Possible values are:
+@itemize @bullet
+@item
+@code{'always}: Always cache attributes even for devices not paired, this is
+recommended as it is best for interoperability, with more consistent
+reconnection times and enables proper tracking of notifications for all
+devices
+
+@item
+@code{'yes}: Only cache attributes of paired devices
+
+@item
+@code{'no}: Never cache attributes.
+@end itemize
+
+@item @code{key-size} (default: @code{0})
+Minimum required Encryption Key Size for accessing secured characteristics.
+
+Possible values are:
+@itemize @bullet
+@item
+@code{0}: Don't care
+
+@item
+@code{7 <= N <= 16}
+@end itemize
+
+@item @code{exchange-mtu} (default: @code{517})
+Exchange MTU size. Possible values are:
+
+@itemize @bullet
+@item
+@code{23 <= N <= 517}
+@end itemize
+
+@item @code{att-channels} (default: @code{3})
+Number of ATT channels. Possible values are:
+
+@itemize @bullet
+@item
+@code{1}: Disables EATT
+
+@item
+@code{2 <= N <= 5}
+@end itemize
+
+@item @code{session-mode} (default: @code{'basic})
+AVDTP L2CAP signalling channel mode.
+
+Possible values are:
+
+@itemize @bullet
+@item
+@code{'basic}: Use L2CAP basic mode
+
+@item
+@code{'ertm}: Use L2CAP enhanced retransmission mode.
+@end itemize
+
+@item @code{stream-mode} (default: @code{'basic})
+AVDTP L2CAP transport channel mode.
+
+Possible values are:
+
+@itemize @bullet
+@item
+@code{'basic}: Use L2CAP basic mode
+
+@item
+@code{'streaming}: Use L2CAP streaming mode.
+@end itemize
+
+@item @code{reconnect-uuids} (default: @code{'()})
+The ReconnectUUIDs defines the set of remote services that should try
+to be reconnected to in case of a link loss (link supervision
+timeout). The policy plugin should contain a sane set of values by
+default, but this list can be overridden here. By setting the list to
+empty the reconnection feature gets disabled.
+
+Possible values:
+
+@itemize @bullet
+@item
+@code{'()}
+
+@item
+@code{(list (uuid <uuid-1>) (uuid <uuid-2>) ...)}.
+@end itemize
+
+@item @code{reconnect-attempts} (default: @code{7})
+Defines the number of attempts to reconnect after a link lost. Setting
+the value to 0 disables reconnecting feature.
+
+@item @code{reconnect-intervals} (default: @code{'(1 2 4 8 16 32 64)})
+Defines a list of intervals in seconds to use in between attempts. If
+the number of attempts defined in @var{reconnect-attempts} is bigger than
+the list of intervals the last interval is repeated until the last attempt.
+
+@item @code{auto-enable?} (default: @code{#f})
+Defines option to enable all controllers when they are found. This includes
+adapters present on start as well as adapters that are plugged in later on.
+
+@item @code{resume-delay} (default: @code{2})
+Audio devices that were disconnected due to suspend will be reconnected on
+resume. @var{resume-delay} determines the delay between when the controller
+resumes from suspend and a connection attempt is made. A longer delay is
+better for better co-existence with Wi-Fi. The value is in seconds.
+
+@item @code{rssi-sampling-period} (default: @code{#xFF})
+Default RSSI Sampling Period. This is used when a client registers an
+advertisement monitor and leaves the RSSISamplingPeriod unset.
+
+Possible values are:
+@itemize @bullet
+@item
+@code{#x0}: Report all advertisements
+
+@item
+@code{N = #xXX}: Report advertisements every N x 100 msec (range: #x01 to #xFE)
+
+@item
+@code{#xFF}: Report only one advertisement per device during monitoring period.
+@end itemize
+
+@end table
+@end deftp
+
@defvr {Scheme Variable} gnome-keyring-service-type
This is the type of the service that adds the
@uref{https://wiki.gnome.org/Projects/GnomeKeyring, GNOME Keyring}. Its
@@ -20811,7 +21253,6 @@ and ``passwd'' is with the value @code{passwd}.
@end table
@end deftp
-
@node Sound Services
@subsection Sound Services
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index c6761ca784..76719dcba5 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -44,6 +44,7 @@ (define-module (gnu services desktop)
#:use-module (gnu system)
#:use-module (gnu system setuid)
#:use-module (gnu system shadow)
+ #:use-module (gnu system uuid)
#:use-module (gnu system pam)
#:use-module (gnu packages glib)
#:use-module (gnu packages admin)
@@ -403,14 +404,380 @@ (define-record-type* <bluetooth-configuration>
bluetooth-configuration make-bluetooth-configuration
bluetooth-configuration?
(bluez bluetooth-configuration-bluez (default bluez))
- (auto-enable? bluetooth-configuration-auto-enable? (default #f)))
+
+ ;;; [General]
+ (name bluetooth-configuration-name (default "BlueZ"))
+ (class bluetooth-configuration-class (default #x000000))
+ (discoverable-timeout
+ bluetooth-configuration-discoverable-timeout (default 180))
+ (always-pairable? bluetooth-configuration-always-pairable? (default #f))
+ (pairable-timeout bluetooth-configuration-pairable-timeout (default 0))
+
+ ;;; MAYBE: Exclude into separate <device-id> record-type?
+ (device-id bluetooth-configuration-device-id (default #f))
+ (reverse-service-discovery?
+ bluetooth-configuration-reverse-service-discovery (default #t))
+ (name-resolving? bluetooth-configuration-name-resolving? (default #t))
+ (debug-keys? bluetooth-configuration-debug-keys? (default #f))
+
+ ;;; Possible values:
+ ;;; 'dual, 'bredr, 'le
+ (controller-mode bluetooth-configuration-controller-mode (default 'dual))
+
+ ;;; Possible values:
+ ;;; 'off, 'single, 'multiple
+ (multi-profile bluetooth-configuration-multi-profile (default 'off))
+ (fast-connectable? bluetooth-configuration-fast-connectable? (default #f))
+
+ ;;; Possible values:
+ ;;; for LE mode: 'off, 'network/on, 'device
+ ;;; for Dual mode: 'off, 'network/on', 'device, 'limited-network, 'limited-device
+ ;;; Source: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/main.conf#n68
+ (privacy bluetooth-configuration-privacy (default 'off))
+
+ ;;; Possible values:
+ ;;; 'never, 'confirm, 'always
+ (just-works-repairing
+ bluetooth-configuration-just-works-repairing (default 'never))
+ (temporary-timeout bluetooth-configuration-temporary-timeout (default 30))
+ (refresh-discovery? bluetooth-configuration-refresh-discovery (default #t))
+
+ ;;; Possible values: #t, #f, (uuid <uuid>)
+ ;;; Possible UUIDs:
+ ;;; d4992530-b9ec-469f-ab01-6c481c47da1c (BlueZ Experimental Debug)
+ ;;; 671b10b5-42c0-4696-9227-eb28d1b049d6 (BlueZ Experimental Simultaneous Central and Peripheral)
+ ;;; 15c0a148-c273-11ea-b3de-0242ac130004 (BlueZ Experimental LL privacy)
+ ;;; 330859bc-7506-492d-9370-9a6f0614037f (BlueZ Experimental Bluetooth Quality Report)
+ ;;; a6695ace-ee7f-4fb9-881a-5fac66c629af (BlueZ Experimental Offload Codecs)
+ ;;; Source: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/main.conf#n110
+ (experimental bluetooth-configuration-experimental (default #f))
+ (remote-name-request-retry-delay
+ bluetooth-configuration-remote-name-request-retry-delay (default 300))
+
+ ;;; [BR]
+ (page-scan-type bluetooth-configuration-page-scan-type (default #f))
+ (page-scan-interval bluetooth-configuration-page-scan-interval (default #f))
+ (page-scan-window bluetooth-configuration-page-scan-window (default #f))
+ (inquiry-scan-type bluetooth-configuration-inquiry-scan-type (default #f))
+ (inquiry-scan-interval bluetooth-configuration-inquiry-scan-interval (default #f))
+ (inquiry-scan-window bluetooth-configuration-inquiry-scan-window (default #f))
+ (link-supervision-timeout bluetooth-configuration-link-supervision-timeout (default #f))
+ (page-timeout bluetooth-configuration-page-timeout (default #f))
+ (min-sniff-interval bluetooth-configuration-min-sniff-interval (default #f))
+ (max-sniff-interval bluetooth-configuration-max-sniff-interval (default #f))
+
+ ;;; [LE]
+ (min-advertisement-interval
+ bluetooth-configuration-min-advertisement-interval (default #f))
+ (max-advertisement-interval
+ bluetooth-configuration-max-advertisement-interval (default #f))
+ (multi-advertisement-rotation-interval
+ bluetooth-configuration-multi-advertisement-rotation-interval (default #f))
+ (scan-interval-auto-connect
+ bluetooth-configuration-scan-interval-auto-connect (default #f))
+ (scan-window-auto-connect
+ bluetooth-configuration-scan-window-auto-connect (default #f))
+ (scan-interval-suspend
+ bluetooth-configuration-scan-interval-suspend (default #f))
+ (scan-window-suspend
+ bluetooth-configuration-scan-window-suspend (default #f))
+ (scan-interval-discovery
+ bluetooth-configuration-scan-interval-discovery (default #f))
+ (scan-window-discovery
+ bluetooth-configuration-scan-window-discovery (default #f))
+ (scan-interval-adv-monitor
+ bluetooth-configuration-scan-interval-adv-monitor (default #f))
+ (scan-window-adv-monitor
+ bluetooth-configuration-scan-window-adv-monitor (default #f))

This message was truncated. Download the full message here.
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmG/YMoOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFzz8BAAkxCGrNl1FPOqGU4BLD0qiGToe+l9VWnENW8M
hhVI+EDNhwwzImpcJCncHMxzIUDG9WWD80nVeOL/Txn8THIy/+3tc6xqBIXLkXm4
vYBCCpHvxat1JmIjSCJXg2WG66JuDq1+84Nuvi0f0F/RQOgrV9Jz88OJ38CQTuR4
0PvLAFVvEixD1YNjAQTStzwHuwao/85sX6Uh73a8F1J3xVjQx/7qGdT2/SJe6l9V
vt7NgNWJw2/EI4gA27ul5SNC4EoXotGoQ2Pic9JhzgoaGZ0kIcPxb/pgVaclmDlO
7bC+dRhVhbetnpb5UmT/w+koaZq2OileIrWCZnA1Z6MOtFRi37PUyjOFmz4ngHH3
rrg6TETTkiVE2p3qMYA/EJoINJTDB4wtlK6GB+MUo9sMubJSshch4S7YPJmSxaiB
LMali7wLx7/8mhEY/ISPpyyHv7Gk6rPPO9WC7kkA0up623eRxWm8ccugja+x83FW
ncyeL573VQs8NLmJQq+zsnrFnoicyS6m4j1XPRdUb8hlGAYsCKJ3jLP4VOhg0/Km
PSgTYnbenHcWubqyRAEo2KDhcNmVsJtwmFIrWpcfhJKiyDpb85BDlepOFEo6RAah
v9dwQNiTN9M3zn7floN/+Phk/1v7MShvaSJ3apM7VNwF+Gaxn8YY5+q162AGHGcg
a37OA1o=
=qSYp
-----END PGP SIGNATURE-----

D
D
Demis Balbach wrote on 5 Feb 2022 11:22
(address . 52470@debbugs.gnu.org)
877da962af.fsf@minikn.xyz
Any news on this?

--
Best regards / Mit freundlichen Grüßen,
Demis Balbach
-----BEGIN PGP SIGNATURE-----

iQJCBAEBCgAsFiEEz9zHmXzCRksxyCGU8X3bmMw8QFwFAmH+T+gOHGRiQG1pbmlr
bi54eXoACgkQ8X3bmMw8QFzeixAAmihwZNdJRzSpzBLLUiCmftOcLPRXTEj2v8TJ
Kj3NVVVVw9TglRpws8WyZ/AOfAJ/RW6dla9luLEd56vaRMvjCYgnujT7fDLPy5q3
LdVXHi/s45MjUj6gb0t3Czj4fpjixWNF5y8mecZsFDCmyNjBIVoi+HCjkvUpkL5F
LS+s6xJzI6unhxyltHyAogQ/OglN/GyvLDrKohxL5jOOy8Rr2qvMHSeSI5g3SzQw
eKDQ+CkMvsP9Pqfb0z8eMKwibNib+E2Ydp2NYz7kMbYkclZVXTqW/cuFcnPAEOvL
uwiNuszmR9SGCx/Kyahb2STLsO59lzoyVPNhLIOhLCMOT5RkcxSl5AvfJlW795Jv
9R8pB4zcHgkYD+KnmKY9t5AXaMte6AoTFGxDdh44YKkWlfSRqsSw5kEETpBaLiFX
F1yCQO5rBgo8PLrgJTA4j/3iKk0NO4iRiMrQ2cGMGhll7O4Ep9I5+ae/Cub73OQf
atTDShAxNjEftMQ2UXFbf/zqapBp6nCPWoWHsPPunMt+0R3/YY/R7UKn4KaImn53
86poUq8475XwNiXPidG7tsf4mo+MZHqesLHV5SNA1DjeR7Iyn4dUY5ca2TWdcqYP
Zo0CO7C2o2hwIsGOH5tjZg2fbLzef9MNlTFeNE1Z/qvA/EqklX3aE0ThHd/3IvD3
UH3ifYY=
=Bbp5
-----END PGP SIGNATURE-----

L
L
Ludovic Courtès wrote on 9 Mar 2022 23:43
Re: bug#52470: [PATCH] services: bluetooth: Add missing config parameters
(name . Demis Balbach)(address . db@minikn.xyz)
87y21i21do.fsf_-_@gnu.org
Hi Demis,

Demis Balbach <db@minikn.xyz> skribis:

Toggle quote (5 lines)
> ---
> doc/guix.texi | 443 ++++++++++++++++++++++++++++++++++++++-
> gnu/services/desktop.scm | 375 ++++++++++++++++++++++++++++++++-
> 2 files changed, 813 insertions(+), 5 deletions(-)

Great job!

I haven’t tested it with actual Bluetooth hardware but it LGTM, so I
went ahead and committed it. Apologies for the delay!

The documentation work is much welcome. Perhaps it would be interesting
to add a short example of ‘bluetooth-configuration’ with a sentence
explaining what it does—it’s often easier to get started with an
example.

Anyway, thank you for the hard work, and thanks Liliana and Josselin for
reviewing!

Ludo’.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 52470@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 52470
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch