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
249 | 249 | (close-socket sock) | |
250 | 250 | (answer-ok? (last answer))))) | |
251 | 251 | ||
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 | + | ||
252 | 317 | (define* (link-add name type #:key (type-args '())) | |
253 | 318 | (define request-num (random 65535)) | |
254 | 319 | (define type-data | |
… | |||
268 | 333 | (make-string-route-attr | |
269 | 334 | (assoc-ref type-args 'peer))))))) | |
270 | 335 | '()))) | |
336 | + | ("bond" (apply bond-type-args (alist->keyword+value type-args))) | |
271 | 337 | ;; TODO: unsupported for now | |
272 | 338 | (_ '()))) | |
273 | 339 | (define message |
netlink/constant.scm
82 | 82 | IFLA_VLAN_UNSPEC IFLA_VLAN_ID IFLA_VLAN_FLAGS IFLA_VLAN_EGRESS_QOS | |
83 | 83 | IFLA_VLAN_INGRESS_QOS IFLA_VLAN_PROTOCOL) | |
84 | 84 | ||
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 | + | ||
85 | 112 | (define-enum int->addr-attr-kind | |
86 | 113 | IFA_UNSPEC IFA_ADDRESS IFA_LOCAL IFA_LABEL IFA_BROADCAST | |
87 | 114 | IFA_ANYCAST IFA_CACHEINFO IFA_MULTICAST IFA_FLAGS |