Support more argument in link-set.
doc/guile-netlink.texi
| 484 | 484 | family of commands, from @code{iproute2}. | |
| 485 | 485 | ||
| 486 | 486 | @deffn {Scheme Procedure} link-set @var{device} [#:up @code{#f}] @ | |
| 487 | - | [#:down @code{#f}] [#:type @code{#f}] | |
| 487 | + | [#:down @code{#f}] [#:type @code{#f}] [#:arp-on @code{#f}] @ | |
| 488 | + | [#:arp-off @code{#f}] [#:dynamic-on @code{#f}] [#:dynamic-off @code{#f}] @ | |
| 489 | + | [#:multicast-on @code{#f}] [#:multicast-off @code{#f}] @ | |
| 490 | + | [#:allmulticast-on @code{#f}] [#:allmulticast-off @code{#f}] @ | |
| 491 | + | [#:promisc-on @code{#f}] [#:promisc-off @code{#f}] [#:trailers-on @code{#f}] @ | |
| 492 | + | [#:trailers-off @code{#f}] [#:carrier-on @code{#f}] [#:carrier-off @code{#f}] @ | |
| 493 | + | [#:txqueuelen @code{#f}] [#:name @code{#f}] [#:address @code{#f}] @ | |
| 494 | + | [#:broadcast @code{#f}] [#:mtu @code{#f}] [#:netns @code{#f}] | |
| 488 | 495 | Modify an existing link and set its flags and attributes to the ones specified | |
| 489 | 496 | by the various keywords. When a keyword is omited, the corresponding attribute | |
| 490 | 497 | is not changed. | |
| 491 | 498 | ||
| 492 | 499 | @var{device} can be a device index (as a number) or a device name (as a string). | |
| 493 | 500 | ||
| 494 | - | Do not set @code{#:up} and @code{#:down} at the same time. | |
| 501 | + | Do not set @code{#:up} and @code{#:down} at the same time. Do not set | |
| 502 | + | @code{*-on} and @code{*-off} at the same time. | |
| 495 | 503 | @end deffn | |
| 496 | 504 | ||
| 497 | 505 | @deffn {Scheme Procedure} link-show [#:device @code{#f}] [#:group @code{#f}] @ |
ip/link.scm
| 80 | 80 | (let* ((answer (receive-and-decode-msg sock %default-route-decoder)) | |
| 81 | 81 | (links (filter | |
| 82 | 82 | (lambda (msg) (equal? (message-kind msg) RTM_NEWLINK)) | |
| 83 | - | answer))) | |
| 84 | - | (map | |
| 85 | - | (lambda (msg) | |
| 86 | - | (let* ((data (message-data msg)) | |
| 87 | - | (attrs (link-message-attrs data))) | |
| 88 | - | (make-link | |
| 89 | - | (get-attr attrs IFLA_IFNAME) | |
| 90 | - | (link-message-index data) | |
| 91 | - | (link-message-kind data) | |
| 92 | - | (split-flags (link-message-flags data)) | |
| 93 | - | (get-attr attrs IFLA_MTU) | |
| 94 | - | (get-attr attrs IFLA_QDISC) | |
| 95 | - | (get-attr attrs IFLA_OPERSTATE) | |
| 96 | - | (get-attr attrs IFLA_LINKMODE) | |
| 97 | - | (get-attr attrs IFLA_GROUP) | |
| 98 | - | (get-attr attrs IFLA_TXQLEN) | |
| 99 | - | (get-attr attrs IFLA_ADDRESS) | |
| 100 | - | (get-attr attrs IFLA_BROADCAST)))) | |
| 101 | - | links)))) | |
| 83 | + | answer)) | |
| 84 | + | (links | |
| 85 | + | (map | |
| 86 | + | (lambda (msg) | |
| 87 | + | (let* ((data (message-data msg)) | |
| 88 | + | (attrs (link-message-attrs data))) | |
| 89 | + | (make-link | |
| 90 | + | (get-attr attrs IFLA_IFNAME) | |
| 91 | + | (link-message-index data) | |
| 92 | + | (link-message-kind data) | |
| 93 | + | (split-flags (link-message-flags data)) | |
| 94 | + | (get-attr attrs IFLA_MTU) | |
| 95 | + | (get-attr attrs IFLA_QDISC) | |
| 96 | + | (get-attr attrs IFLA_OPERSTATE) | |
| 97 | + | (get-attr attrs IFLA_LINKMODE) | |
| 98 | + | (get-attr attrs IFLA_GROUP) | |
| 99 | + | (get-attr attrs IFLA_TXQLEN) | |
| 100 | + | (get-attr attrs IFLA_ADDRESS) | |
| 101 | + | (get-attr attrs IFLA_BROADCAST)))) | |
| 102 | + | links))) | |
| 103 | + | (close-socket sock) | |
| 104 | + | links))) | |
| 102 | 105 | ||
| 103 | 106 | (define* (link-show #:key (device #f) (group #f) (up #f) (master #f) (vrf #f) | |
| 104 | 107 | (type #f)) | |
… | |||
| 153 | 156 | (let loop ((links (get-links))) | |
| 154 | 157 | (match links | |
| 155 | 158 | (() (throw 'no-such-device device)) | |
| 156 | - | ((link links) | |
| 159 | + | ((link links ...) | |
| 157 | 160 | (if (equal? (link-name link) device) | |
| 158 | 161 | (link-id link) | |
| 159 | 162 | (loop links)))))) | |
| 160 | 163 | ||
| 161 | - | (define* (link-set device #:key (up #f) (down #f) (type #f)) | |
| 164 | + | (define* (link-set device #:key (up #f) (down #f) (type #f) | |
| 165 | + | (arp-on #f) (arp-off #f) | |
| 166 | + | (dynamic-on #f) (dynamic-off #f) | |
| 167 | + | (multicast-on #f) (multicast-off #f) | |
| 168 | + | (allmulticast-on #f) (allmulticast-off #f) | |
| 169 | + | (promisc-on #f) (promisc-off #f) | |
| 170 | + | (trailers-on #f) (trailers-off #f) | |
| 171 | + | (carrier-on #f) (carrier-off #f) | |
| 172 | + | (txqueuelen #f) (name #f) (address #f) | |
| 173 | + | (broadcast #f) (mtu #f) (netns #f)) | |
| 162 | 174 | (define request-num (random 65535)) | |
| 163 | 175 | (define id (if (number? device) device (link-name->index device))) | |
| 176 | + | (define netnsfd (cond | |
| 177 | + | ((string? netns) | |
| 178 | + | (open (string-append "/var/run/netns/" netns) O_RDONLY)) | |
| 179 | + | ((number? netns) | |
| 180 | + | (open (string-append "/var/run/netns/" (number->string netns)) | |
| 181 | + | O_RDONLY)) | |
| 182 | + | (else | |
| 183 | + | #f))) | |
| 164 | 184 | (define message | |
| 165 | 185 | (make-message | |
| 166 | 186 | RTM_NEWLINK | |
… | |||
| 171 | 191 | AF_UNSPEC | |
| 172 | 192 | (or type 0) | |
| 173 | 193 | id | |
| 174 | - | (+ (if up IFF_UP 0)) | |
| 175 | - | (+ (if (or up down) IFF_UP 0)) | |
| 176 | - | '()))) | |
| 194 | + | (+ (if up IFF_UP 0) | |
| 195 | + | (if arp-off IFF_NOARP 0) | |
| 196 | + | (if dynamic-on IFF_DYNAMIC 0) | |
| 197 | + | (if multicast-on IFF_MULTICAST 0) | |
| 198 | + | (if allmulticast-on IFF_ALLMULTI 0) | |
| 199 | + | (if promisc-on IFF_PROMISC 0) | |
| 200 | + | (if trailers-off IFF_NOTRAILERS 0)) | |
| 201 | + | (+ (if (or up down) IFF_UP 0) | |
| 202 | + | (if (or arp-on arp-off) IFF_NOARP 0) | |
| 203 | + | (if (or dynamic-on dynamic-off) IFF_DYNAMIC 0) | |
| 204 | + | (if (or multicast-on multicast-off) IFF_MULTICAST 0) | |
| 205 | + | (if (or allmulticast-on allmulticast-off) IFF_ALLMULTI 0) | |
| 206 | + | (if (or promisc-on promisc-off) IFF_PROMISC 0) | |
| 207 | + | (if (or trailers-on trailers-off) IFF_NOTRAILERS 0)) | |
| 208 | + | `(,@(if (or carrier-on carrier-off) | |
| 209 | + | (list | |
| 210 | + | (make-route-attr IFLA_CARRIER | |
| 211 | + | (make-u32-route-attr (if carrier-on 1 0)))) | |
| 212 | + | '()) | |
| 213 | + | ,@(if txqueuelen | |
| 214 | + | (list | |
| 215 | + | (make-route-attr IFLA_TXQLEN | |
| 216 | + | (make-u32-route-attr txqueuelen))) | |
| 217 | + | '()) | |
| 218 | + | ,@(if name | |
| 219 | + | (list | |
| 220 | + | (make-route-attr IFLA_TXQLEN | |
| 221 | + | (make-u32-route-attr txqueuelen))) | |
| 222 | + | '()) | |
| 223 | + | ,@(if address | |
| 224 | + | (list | |
| 225 | + | (make-route-attr IFLA_ADDRESS | |
| 226 | + | (make-ethernet-route-attr address))) | |
| 227 | + | '()) | |
| 228 | + | ,@(if broadcast | |
| 229 | + | (list | |
| 230 | + | (make-route-attr IFLA_BROADCAST | |
| 231 | + | (make-ethernet-route-attr broadcast))) | |
| 232 | + | '()) | |
| 233 | + | ,@(if mtu | |
| 234 | + | (list | |
| 235 | + | (make-route-attr IFLA_MTU | |
| 236 | + | (make-u32-route-attr mtu))) | |
| 237 | + | '()) | |
| 238 | + | ,@(if netns | |
| 239 | + | (list | |
| 240 | + | (make-route-attr IFLA_NET_NS_FD | |
| 241 | + | (make-u32-route-attr | |
| 242 | + | (fileno netnsfd)))) | |
| 243 | + | '()))))) | |
| 177 | 244 | (let ((sock (connect-route))) | |
| 178 | 245 | (send-msg message sock) | |
| 179 | 246 | (let ((answer (receive-and-decode-msg sock %default-route-decoder))) | |
| 247 | + | (when netnsfd | |
| 248 | + | (close netnsfd)) | |
| 180 | 249 | (close-socket sock) | |
| 181 | 250 | answer))) | |