[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
05/11: services: static-networking: Use Guile-Netlink on GNU/Linux.
From: |
guix-commits |
Subject: |
05/11: services: static-networking: Use Guile-Netlink on GNU/Linux. |
Date: |
Sun, 12 Dec 2021 18:10:04 -0500 (EST) |
civodul pushed a commit to branch master
in repository guix.
commit 0cc742b2616dff7359b548c58fc7d9b478a3e72d
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Wed Oct 6 23:06:47 2021 +0200
services: static-networking: Use Guile-Netlink on GNU/Linux.
* gnu/services/base.scm (static-networking-shepherd-service): Define
'set-up-via-ioctl', 'tear-down-via-ioctl', 'set-up-via-netlink',
'tear-down-via-netlink', and 'helpers' and use them in 'start' and
'stop'. Add (ip *) modules to 'modules'.
---
gnu/services/base.scm | 102 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 72 insertions(+), 30 deletions(-)
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 2631478..7008ab1 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -53,6 +53,7 @@
#:use-module (gnu packages bash)
#:use-module ((gnu packages base)
#:select (coreutils glibc glibc-utf8-locales))
+ #:autoload (gnu packages guile-xyz) (guile-netlink)
#:use-module (gnu packages package-management)
#:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
#:use-module (gnu packages linux)
@@ -2375,6 +2376,66 @@ Linux @dfn{kernel mode setting} (KMS).")))
(($ <static-networking> interface ip netmask gateway provision
requirement name-servers)
(let ((loopback? (and provision (memq 'loopback provision))))
+ (define set-up-via-ioctl
+ #~(let* ((addr (inet-pton AF_INET #$ip))
+ (sockaddr (make-socket-address AF_INET addr 0))
+ (mask (and #$netmask (inet-pton AF_INET #$netmask)))
+ (maskaddr (and mask
+ (make-socket-address AF_INET mask 0)))
+ (gateway (and #$gateway
+ (inet-pton AF_INET #$gateway)))
+ (gatewayaddr (and gateway
+ (make-socket-address AF_INET
+ gateway 0))))
+ (configure-network-interface #$interface sockaddr
+ (logior IFF_UP
+ #$(if loopback?
+ #~IFF_LOOPBACK
+ 0))
+ #:netmask maskaddr)
+ (when gateway
+ (let ((sock (socket AF_INET SOCK_DGRAM 0)))
+ (add-network-route/gateway sock gatewayaddr)
+ (close-port sock)))))
+
+ (define tear-down-via-ioctl
+ #~(let ((sock (socket AF_INET SOCK_STREAM 0)))
+ (when #$gateway
+ (delete-network-route sock
+ (make-socket-address AF_INET
+ INADDR_ANY 0)))
+ (set-network-interface-flags sock #$interface 0)
+ (close-port sock)
+ #f))
+
+ (define set-up-via-netlink
+ (with-extensions (list guile-netlink)
+ #~(let ((ip #$(if netmask
+ #~(ip+netmask->cidr #$ip #$netmask)
+ ip)))
+ (addr-add #$interface ip)
+ (when #$gateway
+ (route-add "default" #:device #$interface
+ #:via #$gateway))
+ (link-set #$interface #:up #t))))
+
+ (define tear-down-via-netlink
+ (with-extensions (list guile-netlink)
+ #~(begin
+ (link-set #$interface #:down #t)
+ (when #$gateway
+ (route-del "default" #:device #$interface))
+ (addr-del #$interface #$ip)
+ #f)))
+
+ (define helpers
+ #~(define (ip+netmask->cidr ip netmask)
+ ;; Return the CIDR notation (a string) for IP and NETMASK, two
+ ;; IPv4 address strings.
+ (let* ((netmask (inet-pton AF_INET netmask))
+ (bits (logcount netmask)))
+ (string-append ip "/" (number->string bits)))))
+
(shepherd-service
(documentation
@@ -2386,38 +2447,19 @@ Linux @dfn{kernel mode setting} (KMS).")))
(start #~(lambda _
;; Return #t if successfully started.
- (let* ((addr (inet-pton AF_INET #$ip))
- (sockaddr (make-socket-address AF_INET addr 0))
- (mask (and #$netmask
- (inet-pton AF_INET #$netmask)))
- (maskaddr (and mask
- (make-socket-address AF_INET
- mask 0)))
- (gateway (and #$gateway
- (inet-pton AF_INET #$gateway)))
- (gatewayaddr (and gateway
- (make-socket-address AF_INET
- gateway 0))))
- (configure-network-interface #$interface sockaddr
- (logior IFF_UP
- #$(if loopback?
- #~IFF_LOOPBACK
- 0))
- #:netmask maskaddr)
- (when gateway
- (let ((sock (socket AF_INET SOCK_DGRAM 0)))
- (add-network-route/gateway sock gatewayaddr)
- (close-port sock))))))
+ #$helpers
+ (if (string-contains %host-type "-linux")
+ #$set-up-via-netlink
+ #$set-up-via-ioctl)))
(stop #~(lambda _
;; Return #f is successfully stopped.
- (let ((sock (socket AF_INET SOCK_STREAM 0)))
- (when #$gateway
- (delete-network-route sock
- (make-socket-address
- AF_INET INADDR_ANY 0)))
- (set-network-interface-flags sock #$interface 0)
- (close-port sock)
- #f)))
+ (if (string-contains %host-type "-linux")
+ #$tear-down-via-netlink
+ #$tear-down-via-ioctl)))
+ (modules `((ip addr)
+ (ip link)
+ (ip route)
+ ,@%default-modules))
(respawn? #f))))))
(define (static-networking-etc-files interfaces)
- branch master updated (9b24cd3 -> c860949), guix-commits, 2021/12/12
- 01/11: tests: Add 'static-networking' test., guix-commits, 2021/12/12
- 04/11: gnu: guile-netlink: Allow cross-compilation., guix-commits, 2021/12/12
- 11/11: news: Add entry about 'static-networking-service-type'., guix-commits, 2021/12/12
- 10/11: tests: Replace uses of deprecated 'static-networking-service'., guix-commits, 2021/12/12
- 06/11: services: secret-service: Turn into a Shepherd service., guix-commits, 2021/12/12
- 02/11: tests: openvswitch: Check whether ovs0 is up., guix-commits, 2021/12/12
- 03/11: doc: Add new "Networking Setup" node for the main setup options., guix-commits, 2021/12/12
- 09/11: services: Define '%loopback-static-networking'., guix-commits, 2021/12/12
- 08/11: services: Define '%qemu-static-networking'., guix-commits, 2021/12/12
- 05/11: services: static-networking: Use Guile-Netlink on GNU/Linux.,
guix-commits <=
- 07/11: services: static-networking: Change interface to mimic netlink., guix-commits, 2021/12/12