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 |