link: Add partial support for bond interfaces.

Alexey AbramovSun Oct 09 15:43:04+0200 2022

beceb4c

link: Add partial support for bond interfaces. * ip/link.scm (link-add): Support specific arguments for `bond' type link. (bond-type-args): New function. Implement mode, miimon and lacp-rate configuration for bonds. (alist->keyword+value): New function. * netlink/constant.scm: Define bond specific information. Define constants for bond modes. Signed-off-by: Julien Lepiller <julien@lepiller.eu>

ip/link.scm

249249
      (close-socket sock)
250250
      (answer-ok? (last answer)))))
251251
252+
(define* (bond-type-args #:key (mode #f) (miimon #f) (lacp-active #f) (lacp-rate #f)
253+
                         (primary #f) (primary-reselect #f))
254+
  `(,@(if mode
255+
          (list
256+
           (make-route-attr IFLA_BOND_MODE
257+
             (match mode
258+
               ("balance-rr" (make-u8-route-attr BOND_MODE_ROUNDROBIN))
259+
               ("active-backup" (make-u8-route-attr BOND_MODE_ACTIVEBACKUP))
260+
               ("balance-xor" (make-u8-route-attr BOND_MODE_XOR))
261+
               ("broadcast" (make-u8-route-attr BOND_MODE_BROADCAST))
262+
               ("802.3ad" (make-u8-route-attr BOND_MODE_8023AD))
263+
               ("balance-tlb" (make-u8-route-attr BOND_MODE_TLB))
264+
               ("balance-alb" (make-u8-route-attr BOND_MODE_ALB))
265+
               (_ (raise (condition
266+
                          (&message
267+
                           (message "Bond field `mode' can be defined as \
268+
balance-rr|active-backup|balance-xor|broadcast|802.3ad|balance-tlb|balance-alb" ))))))))
269+
          '())
270+
    ,@(if miimon
271+
          (list
272+
           (make-route-attr IFLA_BOND_MIIMON
273+
             (make-u32-route-attr miimon)))
274+
          '())
275+
    ,@(if primary
276+
          (list
277+
           (make-route-attr IFLA_BOND_PRIMARY
278+
             (make-u32-route-attr (link-name->index primary))))
279+
          '())
280+
    ,@(if primary-reselect
281+
          (list
282+
           (make-route-attr IFLA_BOND_PRIMARY_RESELECT
283+
             (match primary-reselect
284+
               ("always" (make-u8-route-attr BOND_PRIMARY_RESELECT_ALWAYS))
285+
               ("better" (make-u8-route-attr BOND_PRIMARY_RESELECT_BETTER))
286+
               ("failure" (make-u8-route-attr BOND_PRIMARY_RESELECT_FAILURE))
287+
               (_ (raise (condition
288+
                          (&message
289+
                           (message "Bond field `primary-reselect' can be defined as always|better|failure" ))))))))
290+
          '())
291+
    ,@(if lacp-active
292+
          (list
293+
           (make-route-attr IFLA_BOND_AD_LACP_ACTIVE
294+
             (match lacp-active
295+
               ("on" (make-u8-route-attr BOND_AD_LACP_ACTIVE_ON))
296+
               ("off" (make-u8-route-attr BOND_AD_LACP_ACTIVE_OFF))
297+
               (_ (raise (condition
298+
                          (&message
299+
                           (message "Bond field `lacp-active' can be defined as off|on" ))))))))
300+
          '())
301+
    ,@(if lacp-rate
302+
          (list
303+
           (make-route-attr IFLA_BOND_AD_LACP_RATE
304+
             (match lacp-rate
305+
               ("slow" (make-u8-route-attr 0))
306+
               ("fast" (make-u8-route-attr 1))
307+
               (_ (raise (condition
308+
                          (&message
309+
                           (message "Bond field `lacp-rate' can be defined as slow|fast"))))))))
310+
          '())))
311+
312+
(define (alist->keyword+value alist)
313+
  (fold (match-lambda*
314+
          (((k . v) r)
315+
           (cons* (symbol->keyword k) v r))) '() alist))
316+
252317
(define* (link-add name type #:key (type-args '()))
253318
  (define request-num (random 65535))
254319
  (define type-data

268333
                             (make-string-route-attr
269334
                               (assoc-ref type-args 'peer)))))))
270335
               '())))
336+
      ("bond" (apply bond-type-args (alist->keyword+value type-args)))
271337
      ;; TODO: unsupported for now
272338
      (_ '())))
273339
  (define message

netlink/constant.scm

8282
  IFLA_VLAN_UNSPEC IFLA_VLAN_ID IFLA_VLAN_FLAGS IFLA_VLAN_EGRESS_QOS
8383
  IFLA_VLAN_INGRESS_QOS IFLA_VLAN_PROTOCOL)
8484
85+
(define-enum int->bond-linkinfo
86+
  IFLA_BOND_UNSPEC IFLA_BOND_MODE IFLA_BOND_ACTIVE_SLAVE IFLA_BOND_MIIMON
87+
  IFLA_BOND_UPDELAY IFLA_BOND_DOWNDELAY IFLA_BOND_USE_CARRIER IFLA_BOND_ARP_INTERVAL
88+
  IFLA_BOND_ARP_IP_TARGET IFLA_BOND_ARP_VALIDATE IFLA_BOND_ARP_ALL_TARGETS
89+
  IFLA_BOND_PRIMARY IFLA_BOND_PRIMARY_RESELECT IFLA_BOND_FAIL_OVER_MAC IFLA_BOND_XMIT_HASH_POLICY
90+
  IFLA_BOND_RESEND_IGMP IFLA_BOND_NUM_PEER_NOTIF IFLA_BOND_ALL_SLAVES_ACTIVE
91+
  IFLA_BOND_MIN_LINKS IFLA_BOND_LP_INTERVAL IFLA_BOND_PACKETS_PER_SLAVE
92+
  IFLA_BOND_AD_LACP_RATE IFLA_BOND_AD_SELECT IFLA_BOND_AD_INFO IFLA_BOND_AD_ACTOR_SYS_PRIO
93+
  IFLA_BOND_AD_USER_PORT_KEY IFLA_BOND_AD_ACTOR_SYSTEM IFLA_BOND_TLB_DYNAMIC_LB
94+
  IFLA_BOND_PEER_NOTIF_DELAY IFLA_BOND_AD_LACP_ACTIVE IFLA_BOND_MISSED_MAX IFLA_BOND_NS_IP6_TARGET)
95+
96+
;; see iproute2/ip/iplink_bond.c for mode_tbl
97+
(define-enum int->bond-mode
98+
  BOND_MODE_ROUNDROBIN BOND_MODE_ACTIVEBACKUP BOND_MODE_XOR BOND_MODE_BROADCAST
99+
  BOND_MODE_8023AD BOND_MODE_TLB
100+
  ;; TLB + RLB (receive load balancing)
101+
  BOND_MODE_ALB)
102+
103+
;; see iproute2/ip/iplink_bond.c primary_reselect_tbl
104+
(define-public BOND_PRIMARY_RESELECT_ALWAYS 0)
105+
(define-public BOND_PRIMARY_RESELECT_BETTER 1)
106+
(define-public BOND_PRIMARY_RESELECT_FAILURE 2)
107+
108+
;; see iproute2/ip/iplink_bond.c for lacp_active_tbl
109+
(define-public BOND_AD_LACP_ACTIVE_OFF 0)
110+
(define-public BOND_AD_LACP_ACTIVE_ON 1)
111+
85112
(define-enum int->addr-attr-kind
86113
  IFA_UNSPEC IFA_ADDRESS IFA_LOCAL IFA_LABEL IFA_BROADCAST
87114
  IFA_ANYCAST IFA_CACHEINFO IFA_MULTICAST IFA_FLAGS