Ensure decoding address of the correct type.

Julien LepillerSat Oct 10 17:34:29+0200 2020

d6c7125

Ensure decoding address of the correct type.

doc/guile-netlink.texi

175175
associating each of them to a deserialization procedure.
176176
@end deffn
177177
178-
@deffn {Scheme Variable} %default-route-attr-decoder
179-
Contains the default association list for the known types of routing attributes.
180-
This list is defined in @code{(netlink route attrs)}.
178+
@deffn {Scheme Procedure} default-route-attr-decoder @var{deserialize-addr}
179+
Creates the default association list for a route protocol, given the specified
180+
address deserializer.  This is useful because the @code{IFA_ADDRESS},
181+
@code{IFA_BROADCAST}, etc, contain a different type of address depending on
182+
the message type or its header.  This is defined an @code{(netlink route attrs)}
183+
and used by the following variables:
184+
@end deffn
185+
186+
@deffn {Scheme Variable} %default-route-link-attr-decoder
187+
Contains the default association list for the known types of routing attributes
188+
for link messages.  This list is defined in @code{(netlink route attrs)}.
181189
@end deffn
182190
183191
@node Constants

netlink/deserialize.scm

3737
      (,RTM_DELLINK . ,route:deserialize-link-message)
3838
      (,RTM_GETLINK . ,route:deserialize-link-message)
3939
      (,RTM_SETLINK . ,route:deserialize-link-message))
40-
    (attr ,route:deserialize-route-attr
41-
          ,@route:%default-route-attr-decoder)))
40+
    (link-attr ,(route:deserialize-route-attr 'link-attr)
41+
               ,@route:%default-route-link-attr-decoder)))

netlink/route/attrs.scm

4040
           deserialize-route-attr-data-s32
4141
           deserialize-route-attr-data-ethernet
4242
           deserialize-route-attr-data-bv
43-
           %default-route-attr-decoder))
43+
           default-route-attr-decoder
44+
           %default-route-link-attr-decoder))
4445
4546
(define-data-type route-attr
4647
  attr-type-size

110111
    (lambda (data pos bv)
111112
      (bytevector-copy! data 0 bv pos (bytevector-length data)))))
112113
113-
(define (deserialize-route-attr decoder bv pos)
114-
  (let* ((len (bytevector-u16-ref bv pos (native-endianness)))
115-
         (type (bytevector-u16-ref bv (+ pos 2) (native-endianness)))
116-
         (deserialize (get-next-deserialize decoder 'attr type))
117-
         (data-bv (make-bytevector (- len 4))))
118-
    (bytevector-copy! bv (+ pos 4) data-bv 0 (- len 4))
119-
    (make-route-attr
120-
      type
121-
      (deserialize decoder data-bv 0))))
114+
(define (deserialize-route-attr message-type)
115+
  (lambda (decoder bv pos)
116+
    (let* ((len (bytevector-u16-ref bv pos (native-endianness)))
117+
           (type (bytevector-u16-ref bv (+ pos 2) (native-endianness)))
118+
           (deserialize (get-next-deserialize decoder message-type type))
119+
           (data-bv (make-bytevector (- len 4))))
120+
      (bytevector-copy! bv (+ pos 4) data-bv 0 (- len 4))
121+
      (make-route-attr
122+
        type
123+
        (deserialize decoder data-bv 0)))))
122124
123125
(define (deserialize-route-attr-data-string decoder bv pos)
124126
  (make-string-route-attr (utf8->string bv)))

141143
                      (bytevector->u8-list bv))
142144
                 ":")))
143145
144-
(define %default-route-attr-decoder
146+
(define %default-route-link-attr-decoder
147+
  (default-route-attr-decoder deserialize-route-attr-data-ethernet))
148+
149+
(define (default-route-attr-decoder deserialize-addr)
145150
  `((,IFLA_IFNAME . ,deserialize-route-attr-data-string)
146151
    (,IFLA_QDISC . ,deserialize-route-attr-data-string)
147152
    (,IFLA_IFALIAS . ,deserialize-route-attr-data-string)

170175
    (,IFLA_LINKMODE . ,deserialize-route-attr-data-u8)
171176
    (,IFLA_CARRIER . ,deserialize-route-attr-data-u8)
172177
    (,IFLA_PROTO_DOWN . ,deserialize-route-attr-data-u8)
173-
    (,IFLA_ADDRESS . ,deserialize-route-attr-data-ethernet)
174-
    (,IFLA_BROADCAST . ,deserialize-route-attr-data-ethernet)
175-
    (,IFLA_PERM_ADDRESS . ,deserialize-route-attr-data-ethernet)
178+
    (,IFLA_ADDRESS . ,deserialize-addr)
179+
    (,IFLA_BROADCAST . ,deserialize-addr)
180+
    (,IFLA_PERM_ADDRESS . ,deserialize-addr)
176181
    (default . ,deserialize-route-attr-data-bv)))

netlink/route/link.scm

6565
      (let loop ((pos (+ pos 16)) (attrs '()))
6666
        (if (>= pos len)
6767
            attrs
68-
            (let ((attr (deserialize 'attr decoder bv pos)))
68+
            (let ((attr (deserialize 'link-attr decoder bv pos)))
6969
              (loop (+ pos (align (data-size attr) 4))
7070
                    (cons attr attrs))))))))