From patchwork Thu May 22 11:32:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Trofimov X-Patchwork-Id: 42859 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 7EF5627BC4E; Thu, 22 May 2025 12:35:33 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_CERTIFIED,RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE, SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 4CF7027BC4A for ; Thu, 22 May 2025 12:35:32 +0100 (BST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uI4Cb-0000TN-DX; Thu, 22 May 2025 07:35:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uI4CX-0000Km-8D for guix-patches@gnu.org; Thu, 22 May 2025 07:35:06 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uI4CW-0008Uq-Jt; Thu, 22 May 2025 07:35:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:References:In-Reply-To:Date:From:To:Subject; bh=SmA4NhYUQ32yMS20wNjwa0c9ulRMA9q0oDCVf360xrE=; b=Q28UtlVtNB3+Uh3xFuFhZJ7ufG8xw3lE8orZ3FpqQcwbZxD3x11QxLe215oxVRVBzqARfadvq7GZxlOV2YC8mDoinKpbM3RoZQ/5/VwWu0JkgKaNxqPqfvUUJ5UtN8+GwC2ynzMrXL74LR4ao+nVkcuVTSjX+9i5l9twhawNd3iS5/UO0KcUJ/JPP2M5GLOGVs/q475QlH4qhNeShq0+RPHSzOYYxUCu7xT1KG+dNHey93W8nxLOLzjdTrxsZtwa5gzz9go9T2IA6sV9br7jVSyxJhi92Pc5Ldg8CN2o9yqW3aVjwwYOZNaqTadmXMIneTr0cWehUMRtKlvtSvC+2A==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1uI4CV-0006PO-25; Thu, 22 May 2025 07:35:03 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#78546] [PATCH 3/3] services: networking: Add iwd-service-type. Resent-From: Sergey Trofimov Original-Sender: "Debbugs-submit" Resent-CC: gabriel@erlikon.ch, ludo@gnu.org, maxim.cournoyer@gmail.com, guix-patches@gnu.org Resent-Date: Thu, 22 May 2025 11:35:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78546 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 78546@debbugs.gnu.org Cc: Sergey Trofimov , Gabriel Wicki , Ludovic =?utf-8?q?Court=C3=A8s?= , Maxim Cournoyer X-Debbugs-Original-Xcc: Gabriel Wicki , Ludovic =?utf-8?q?Court=C3=A8s?= , Maxim Cournoyer Received: via spool by 78546-submit@debbugs.gnu.org id=B78546.174791369724576 (code B ref 78546); Thu, 22 May 2025 11:35:02 +0000 Received: (at 78546) by debbugs.gnu.org; 22 May 2025 11:34:57 +0000 Received: from localhost ([127.0.0.1]:32823 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uI4CO-0006OE-GM for submit@debbugs.gnu.org; Thu, 22 May 2025 07:34:57 -0400 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]:56767) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uI4C9-0006M9-7J for 78546@debbugs.gnu.org; Thu, 22 May 2025 07:34:43 -0400 Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-601dfef6a8dso7756750a12.1 for <78546@debbugs.gnu.org>; Thu, 22 May 2025 04:34:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sarg.org.ru; s=google; t=1747913674; x=1748518474; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SmA4NhYUQ32yMS20wNjwa0c9ulRMA9q0oDCVf360xrE=; b=rFsq+fKppK5niwPTbRRD5V5sEs8Qs0oqsDacEk/mkOOpx9UosJRnsvtS2ALuXvHulM ljzHO/GYLUEwlGdBgDhFiJxC36aGazurA8eL9fAWc2IuFhHvieOYnkIqoCZoO0b9EQeT USMYAWpiJSzdCfR11KesROObzA2y3mI1sNz6YX3VfEeyqWd4P+b+Fq6B3hDQkDcdTdLW 2TnuM9iTijeZyC7oxHVVlNndT93VDWdUP4Eh/4apXplnwQVlGwTeFM5OXpKnNeEpXoyA 6sXVTE1yPRbP9vIXAjy/NlD8TZCf/VyMKFJQxuAZ4iso5hKR1KaGvHxpDEbdWdTqVd7w oe7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747913674; x=1748518474; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SmA4NhYUQ32yMS20wNjwa0c9ulRMA9q0oDCVf360xrE=; b=FUjqdMoku5UEwEIWHjX1UuiL9MCAFhrWymlOzqkGss44iE4UJIjswi1ifYVy/LxmPe SNPyGRz5DIh+UzYRupLaoeq2hMlYC2gtRV/GPR+VmnwYFVwhsiql3lvfYzJq9gxq6JeT zfvLGPrJMb2NmxCA4jcvEd5PYSynh5lPDO27KdxmvzkanBaGn8NznDcuFnhNscSgs+fc GBrLTN9je/8dqX76oai/Rl+6/05OXD8/uoV8aYkl8xnu3b7C7+CR1pw8EVUBLc4ZLRIv AgYtA94NOfRtklRZHN5BI39tZmAV54c7o6oN+wePSSq6OUW/kN3I+AmEkcKl6w6cZ01G zXeA== X-Gm-Message-State: AOJu0YzAjP7ahqH0FbpjTa9dxMl0xbFLZYRY2vZyp052mhryMCm5Oxg8 Ez5HRsHm2KJCj8pk2vZFpKcKANWx/CQOIvphuZDwMpbmKJrNc8d3Hgpce3D1Pum779sBLV5QjFE dpEaP0pU= X-Gm-Gg: ASbGncsfoXHUIHWDnGxl+MYILcesiGb3SMtANIRPv+ynSTbMLjNmEMCQSzmT4GJn1bZ Sfq5CZuzMeUzPXjDFfc2v7cTE3gT3gTJUBNtc6V8dDnakFFqmiqtH++bvkeSwIt+1JCiqwK2x8N VgkC17VjYG/7TvUxBeEfY7rv1dd0XAQg6917WLCz21k9OvSEYABB8AgqoS1lvYmLQRC9KikMvtf VJXmMDWv0W0KXpaE3T2mctmW1J0QpoXK6PGq+K78VoKRwTWTomIfJerHxUAlnxLRsqoIgwCiSFz mnPyg8/EHg0zkr/jnEesHVvEBHDv2rf2ZTitBVIUuTCmIuGs5w== X-Google-Smtp-Source: AGHT+IG3YpnRTa/RF4JHzwwLV/KEaJP7Xat4zmVv96bscb7W6zUo3x62z8qsqzu3I+bLys7KjbwQBg== X-Received: by 2002:a05:6402:2681:b0:601:bd34:8876 with SMTP id 4fb4d7f45d1cf-601bd348bfdmr14547052a12.2.1747913673922; Thu, 22 May 2025 04:34:33 -0700 (PDT) Received: from localhost ([2a02:2454:a095:5600:a6fe:ab0a:f6f7:9028]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6005ae3aed4sm10249120a12.75.2025.05.22.04.34.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 May 2025 04:34:33 -0700 (PDT) From: Sergey Trofimov Date: Thu, 22 May 2025 13:32:57 +0200 Message-ID: <039cf3a826d3caef178bbdb63585b63513b616f3.1747912984.git.sarg@sarg.org.ru> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches * gnu/services/networking.scm (iwd-service-type): New service type. (iwd-configuration), (iwd-settings), (iwd-scan-settings), (iwd-general-settings), (iwd-network-settings): New configuration types. * doc/guix.texi (Networking setup): Document it. Change-Id: I852115b9c6768b3ec4eedb34a7f9e66438bd1429 --- doc/guix.texi | 157 ++++++++++++++++++++++++ gnu/services/networking.scm | 237 ++++++++++++++++++++++++++++++++++++ 2 files changed, 394 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 3ef2e50e57..e02dda7d9a 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -22404,6 +22404,163 @@ Networking Setup @end table @end deftp +@cindex IWD +@defvar iwd-service-type +This is the service type to run @acronyml{IWD,Internet Wireless Daemon}, +a wireless daemon required to authenticate against encrypted WiFi +networks. +@end defvar + +@quotation Warning +By default @code{iwd} removes and re-creates interfaces it manages. It +doesn't play nicely with @code{dhcp-client-service-type} that enumerates +wireless interfaces before starting the Shepherd service. Use either +@code{dhcpcd-service-type} or the @code{iwd}'s built-in DHCP client (see +@code{enable-network-configuration} option below). +@end quotation + +@c %start of fragment + +@deftp {Data Type} iwd-configuration +Available @code{iwd-configuration} fields are: + +@table @asis +@item @code{iwd} (default: @code{iwd}) (type: file-like) +The IWD package to use. + +@item @code{interfaces} (default: @code{()}) (type: list-of-strings) +If this is set, it must specify @dfn{glob patterns} matching network +interfaces that IWD will control. + +@item @code{ignored-interfaces} (default: @code{()}) (type: list-of-strings) +If this is set, it must specify @dfn{glob patterns} matching network +interfaces that IWD will not manage. + +@item @code{phys} (default: @code{()}) (type: list-of-strings) +If this is set, it must specify @dfn{glob patterns} matching network +PHYs names that IWD will control. + +@item @code{ignored-phys} (default: @code{()}) (type: list-of-strings) +If this is set, it must specify @dfn{glob patterns} matching network +PHYs names that IWD will not manage. + +@item @code{shepherd-requirement} (default: @code{()}) (type: list-of-symbols) +Shepherd requirements the service should depend on. + +@item @code{shepherd-provision} (default: @code{(iwd)}) (type: list-of-symbols) +The name(s) of the service. + +@item @code{config} (type: iwd-settings) +Configuration settings. + +@end table + +@end deftp + + +@c %end of fragment + +@c %start of fragment + +@deftp {Data Type} iwd-settings +Available @code{iwd-settings} fields are: + +@table @asis +@item @code{general} (type: iwd-general-settings) +General settings. + +@item @code{network} (type: maybe-iwd-network-settings) +Network settings. + +@item @code{scan} (type: maybe-iwd-scan-settings) +Scan settings. + +@item @code{extra-config} (default: @code{()}) (type: list-of-strings) +Extra configuration values to append to the IWD configuration file. + +@end table + +@end deftp + + +@c %end of fragment + +@c %start of fragment + +@deftp {Data Type} iwd-general-settings +Available @code{iwd-general-settings} fields are: + +@table @asis +@item @code{enable-network-configuration} (default: @code{#t}) (type: boolean) +Setting this option to true enables @code{iwd} to configure the network +interfaces with the IP addresses. + +@item @code{extra-options} (default: @code{()}) (type: alist) +An association list of option symbols/strings to string values to be +appended to the General settings group. + +@end table + +@end deftp + + +@c %end of fragment + +@c %start of fragment + +@deftp {Data Type} iwd-network-settings +Available @code{iwd-network-settings} fields are: + +@table @asis +@item @code{enable-ipv6} (default: @code{#t}) (type: boolean) +Sets the global default that tells @code{iwd} whether it should +configure IPv6 addresses and routes + +@item @code{name-resolving-service} (default: @code{none}) (type: resolving-service) +Configures a DNS resolution method used by the system. + +@item @code{extra-options} (default: @code{()}) (type: alist) +An association list of option symbols/strings to string values to be +appended to the Network settings group. + +@end table + +@end deftp + + +@c %end of fragment + +@c %start of fragment + +@deftp {Data Type} iwd-scan-settings +Available @code{iwd-scan-settings} fields are: + +@table @asis +@item @code{disable-periodic-scan} (type: maybe-boolean) +Setting this option to @code{#t} will prevent @code{iwd} from issuing +the periodic scans for the available networks while disconnected. + +@item @code{initial-periodic-scan-interval} (type: maybe-number) +The initial periodic scan interval upon disconnect (in seconds). + +@item @code{maximum-periodic-scan-interval} (type: maybe-number) +The maximum periodic scan interval (in seconds). + +@item @code{disable-roaming-scan} (type: maybe-boolean) +Setting this option to @code{#t} will prevent @code{iwd} from trying to +scan when roaming decisions are activated. + +@item @code{extra-options} (default: @code{()}) (type: alist) +An association list of option symbols/strings to string values to be +appended to the Scan settings group. + +@end table + +@end deftp + + +@c %end of fragment + @cindex ModemManager Some networking devices such as modems require special care, and this is what the services below focus on. diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index 4cb7313808..dda0b8c2d0 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -41,6 +41,7 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu services networking) + #:use-module (gnu home services utils) #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services configuration) @@ -80,6 +81,7 @@ (define-module (gnu services networking) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) #:use-module (srfi srfi-43) + #:use-module ((ice-9 curried-definitions) #:select (define)) #:use-module (ice-9 match) #:use-module (ice-9 string-fun) #:use-module (json) @@ -233,6 +235,21 @@ (define-module (gnu services networking) wpa-supplicant-configuration-extra-options wpa-supplicant-service-type + iwd-configuration + iwd-configuration-config + iwd-configuration-ignored-interfaces + iwd-configuration-ignored-phys + iwd-configuration-interfaces + iwd-configuration-iwd + iwd-configuration-phys + iwd-configuration-shepherd-provision + iwd-configuration-shepherd-requirement + iwd-service-type + iwd-general-settings + iwd-network-settings + iwd-scan-settings + iwd-settings + hostapd-configuration hostapd-configuration? hostapd-configuration-package @@ -2083,6 +2100,226 @@ (define wpa-supplicant-service-type implements authentication, key negotiation and more for wireless networks.") (default-value (wpa-supplicant-configuration))))) + +;;; +;;; IWD +;;; +(define-enumerated-field-type resolving-service + (none systemd resolvconf)) + +(define (iwd-uglify-field-name name) + (object->camel-case-string name 'upper)) + +(define (iwd-serialize-base field-name val) + (format #f "~a=~a\n" field-name val)) + +(define (iwd-serialize-field field-name val) + (iwd-serialize-base (iwd-uglify-field-name field-name) val)) + +(define (iwd-serialize-boolean field-name value) + (iwd-serialize-field field-name (if value "true" "false"))) + +(define (iwd-serialize-resolving-service field-name value) + (iwd-serialize-field field-name (object->string value))) + +(define (iwd-serialize-alist field-name value) + #~(string-append #$@(generic-serialize-alist list + iwd-serialize-base + value))) + +(define (serialize-list-of-strings _ value) + (string-join value "\n")) + +(define-maybe boolean (prefix iwd-)) +(define-maybe number (prefix iwd-)) + +(define-configuration iwd-general-settings + (enable-network-configuration + (boolean #t) + "Setting this option to true enables @code{iwd} to configure the network +interfaces with the IP addresses.") + (extra-options + (alist '()) + "An association list of option symbols/strings to string values to be +appended to the General settings group.") + + (prefix iwd-)) + +(define-configuration iwd-network-settings + (enable-ipv6 + (boolean #t) + "Sets the global default that tells @code{iwd} whether it should configure +IPv6 addresses and routes") + + (name-resolving-service + (resolving-service 'none) + "Configures a DNS resolution method used by the system.") + + (extra-options + (alist '()) + "An association list of option symbols/strings to string values to be +appended to the Network settings group.") + + (prefix iwd-)) + +(define-configuration iwd-scan-settings + (disable-periodic-scan + maybe-boolean + "Setting this option to @code{#t} will prevent @code{iwd} from issuing the +periodic scans for the available networks while disconnected.") + + (initial-periodic-scan-interval + maybe-number + "The initial periodic scan interval upon disconnect (in seconds).") + + (maximum-periodic-scan-interval + maybe-number + "The maximum periodic scan interval (in seconds).") + + (disable-roaming-scan + maybe-boolean + "Setting this option to @code{#t} will prevent @code{iwd} from trying to scan +when roaming decisions are activated.") + + (extra-options + (alist '()) + "An association list of option symbols/strings to string values to be +appended to the Scan settings group.") + + (prefix iwd-)) + +(define-maybe iwd-network-settings) +(define-maybe iwd-scan-settings) + +(define ((iwd-serialize-config-section fields) name cfg) + #~(format #f "[~a]\n~a\n" + (string-upcase (object->string '#$name) 0 1) + #$(serialize-configuration cfg fields))) + +(define serialize-iwd-network-settings + (iwd-serialize-config-section iwd-network-settings-fields)) + +(define serialize-iwd-scan-settings + (iwd-serialize-config-section iwd-scan-settings-fields)) + +(define serialize-iwd-general-settings + (iwd-serialize-config-section iwd-general-settings-fields)) + +(define-configuration iwd-settings + (general + (iwd-general-settings (iwd-general-settings)) + "General settings.") + + (network + maybe-iwd-network-settings + "Network settings.") + + (scan + maybe-iwd-scan-settings + "Scan settings.") + + (extra-config + (list-of-strings '()) + "Extra configuration values to append to the IWD configuration file.")) + +(define-configuration/no-serialization iwd-configuration + (iwd + (file-like iwd) + "The IWD package to use.") + + (interfaces + (list-of-strings '()) + "If this is set, it must specify @dfn{glob patterns} matching network +interfaces that IWD will control.") + + (ignored-interfaces + (list-of-strings '()) + "If this is set, it must specify @dfn{glob patterns} matching network +interfaces that IWD will not manage.") + + (phys + (list-of-strings '()) + "If this is set, it must specify @dfn{glob patterns} matching network +PHYs names that IWD will control.") + + (ignored-phys + (list-of-strings '()) + "If this is set, it must specify @dfn{glob patterns} matching network +PHYs names that IWD will not manage.") + + (shepherd-requirement + (list-of-symbols '()) + "Shepherd requirements the service should depend on.") + + (shepherd-provision + (list-of-symbols '(iwd)) + "The name(s) of the service.") + + (config + (iwd-settings (iwd-settings)) + "Configuration settings.")) + +(define (iwd-generate-documentation) + (configuration->documentation 'iwd-configuration) + (configuration->documentation 'iwd-settings) + (configuration->documentation 'iwd-general-settings) + (configuration->documentation 'iwd-network-settings) + (configuration->documentation 'iwd-scan-settings)) + +(define (iwd-config-file config) + "Return an IWD configuration file." + (mixed-text-file "main.conf" + (serialize-configuration + (iwd-configuration-config config) + iwd-settings-fields))) + +(define (iwd-shepherd-service config) + (match-record config + (iwd interfaces ignored-interfaces + phys ignored-phys + shepherd-requirement shepherd-provision) + + (list (shepherd-service + (documentation "Run Internet Wireless Daemon") + (provision shepherd-provision) + (requirement `(user-processes dbus-system loopback ,@shepherd-requirement)) + (start #~(make-forkexec-constructor + (list (string-append #$iwd "/libexec/iwd") + "--logger=syslog" + #$@(if (null? interfaces) '() + (list (string-append "--interfaces=" + (string-join interfaces ",")))) + #$@(if (null? ignored-interfaces) '() + (list (string-append "--nointerfaces=" + (string-join ignored-interfaces ",")))) + #$@(if (null? phys) '() + (list (string-append "--phys=" + (string-join phys ",")))) + #$@(if (null? ignored-phys) '() + (list (string-append "--nophys=" + (string-join ignored-phys ","))))))) + (stop #~(make-kill-destructor)))))) + +(define (iwd-etc-service config) + `(("iwd/main.conf" ,(iwd-config-file config)))) + +(define iwd-service-type + (let ((add-iwd-package (compose list iwd-configuration-iwd))) + (service-type (name 'iwd) + (extensions + (list (service-extension shepherd-root-service-type + iwd-shepherd-service) + (service-extension etc-service-type + iwd-etc-service) + (service-extension dbus-root-service-type + add-iwd-package) + (service-extension profile-service-type + add-iwd-package))) + (default-value (iwd-configuration)) + (description + "Run @url{https://iwd.wiki.kernel.org/,Iwd}, +a network connection manager.")))) + ;;; ;;; Hostapd.