link: Extract 'new-link-message->link'.

Ludovic Court??sTue May 23 20:45:04+0200 2023

7b4eaaa

link: Extract 'new-link-message->link'. * ip/link.scm (new-link-message->link): New procedure. (get-links): Use it, and use 'filter-map' instead of 'filter' followed by 'map'. Signed-off-by: Julien Lepiller <julien@lepiller.eu>

ip/link.scm

5959
  (addr  link-addr)
6060
  (brd   link-brd))
6161
62+
(define (new-link-message->link msg)
63+
  "If MSG has type 'RTM_NEWLINK', return the corresponding <link> object.
64+
Otherwise return #f."
65+
  (and (eqv? (message-kind msg) RTM_NEWLINK)
66+
       (let* ((data (message-data msg))
67+
              (attrs (link-message-attrs data)))
68+
         (make-link (get-attr attrs IFLA_IFNAME)
69+
                    (link-message-index data)
70+
                    (link-message-kind data)
71+
                    (map int->device-flags (split-flags (link-message-flags data)))
72+
                    (get-attr attrs IFLA_MTU)
73+
                    (get-attr attrs IFLA_QDISC)
74+
                    (get-attr attrs IFLA_OPERSTATE)
75+
                    (get-attr attrs IFLA_LINKMODE)
76+
                    (get-attr attrs IFLA_GROUP)
77+
                    (get-attr attrs IFLA_TXQLEN)
78+
                    (get-attr attrs IFLA_ADDRESS)
79+
                    (get-attr attrs IFLA_BROADCAST)))))
80+
6281
(define (get-links)
6382
  (define request-num (random 65535))
6483
  (define message

7291
  (let ((sock (connect-route)))
7392
    (send-msg message sock)
7493
    (let* ((answer (receive-and-decode-msg sock %default-route-decoder))
75-
           (links (filter
76-
                    (lambda (msg) (equal? (message-kind msg) RTM_NEWLINK))
77-
                    answer))
78-
           (links
79-
             (map
80-
               (lambda (msg)
81-
                 (let* ((data (message-data msg))
82-
                        (attrs (link-message-attrs data)))
83-
                 (make-link
84-
                   (get-attr attrs IFLA_IFNAME)
85-
                   (link-message-index data)
86-
                   (link-message-kind data)
87-
                   (map int->device-flags (split-flags (link-message-flags data)))
88-
                   (get-attr attrs IFLA_MTU)
89-
                   (get-attr attrs IFLA_QDISC)
90-
                   (get-attr attrs IFLA_OPERSTATE)
91-
                   (get-attr attrs IFLA_LINKMODE)
92-
                   (get-attr attrs IFLA_GROUP)
93-
                   (get-attr attrs IFLA_TXQLEN)
94-
                   (get-attr attrs IFLA_ADDRESS)
95-
                   (get-attr attrs IFLA_BROADCAST))))
96-
               links)))
94+
           (links (filter-map new-link-message->link answer)))
9795
      (close-port sock)
9896
      links)))
9997