doc: Move sections around.

Julien LepillerSat Mar 29 15:23:15+0100 2025

f1bc0d2

doc: Move sections around. Move higher-level stuff above the low-level implmentation details. * doc/guile-netlink.texi (API Reference, IP Library): Inverse order of sections.

doc/guile-netlink.texi

3131
3232
@menu
3333
* Introduction::           What is netlink?
34-
* API Reference::          Description of the library interface.
3534
* IP Library::             High-level functions for network devices.
35+
* API Reference::          Description of the library interface.
3636
3737
* Concept Index::          Concepts.
3838
* Programming Index::      Data types, procedures, and variables.

4040
@detailmenu
4141
--- The Detailed Node Listing ---
4242
43+
IP Library
44+
45+
* Link::                   Actions on network links.
46+
* Addr::                   Actions on network addresses.
47+
* Route::                  Actions on network routes.
48+
4349
API Reference
4450
4551
* Common API::             Common functions and data types for defining netlink

4753
* Netlink API::            Common structures and data types for every protocols.
4854
* Rtnetlink API::          The ROUTE_NETLINK protocol.
4955
50-
IP Library
51-
52-
* Link::                   Actions on network links.
53-
* Addr::                   Actions on network addresses.
54-
* Route::                  Actions on network routes.
55-
5656
@end detailmenu
5757
@end menu
5858

7171
structures that are close to their C counterpart, and basic procedures to
7272
initiate communication.
7373
74-
@node API Reference
75-
@chapter API Reference
74+
@node IP Library
75+
@chapter IP Library
7676
77-
@node Common API
78-
@section Common API
77+
This library comes with higher-level procedures that let you access and modify
78+
the state of network on your computer.
7979
80-
Guile-netlink implements a common API for expressing other protocols.  This
81-
section describes how to use this API to augment guile-netlink with additional
82-
protocols.
80+
@node Link
81+
@section Link
8382
84-
@node Data Types
85-
@subsection Data Types
83+
The @code{(ip link)} module introduces procedures to access and modify the
84+
network links on your machine.  They are equivalent to the @command{ip link}
85+
family of commands, from @code{iproute2}.
8686
87-
Guile-netlink defines data types that are used in the various Netlink protocols.
88-
We need to be able to serialize and deserialize data that guile-netlink
89-
understands, but we also want to let users of guile-netlink extend this process
90-
easily.  This need has lead to the creating of the following data structure,
91-
defined in @code{(netlink data}).
87+
@deffn {Datatype} <link>
9288
93-
@deffn {Datatype} nl-data
89+
Datatype representing the status of a network link.
90+
91+
get-links                                                           
92+
            print-link                                                          
93+
                                                                                
94+
            <link> make-link link?                                              
95+
            link-name link-id link-type link-flags link-mtu link-qdisc          
96+
            link-state link-mode link-group link-qlen link-addr link-brd
9497
9598
@table @asis
96-
@item @code{data}
97-
The data that is held by this record.
99+
@item @code{name}
100+
Name of the link, such as @code{"enp1s0"}.
98101
99-
@item @code{size-proc}
100-
A procedure that takes a data (of the same type as the data recorded in the
101-
@code{data} field) and returns the size of its serialization.
102+
@item @code{id}
103+
Index of the link, a unique number used to identify the link.
102104
103-
@item @code{serialization-proc}
104-
A procedure that takes a data (of the same type as the data recorded in the
105-
@code{data} field), the position at which to start serializing, and a
106-
bytevector in which to serialize.  This procedure should modify the bytevector
107-
and its return value is ignored.
105+
@item @code{type}
106+
Type of the link, as an integer.
108107
109-
@end table
110-
@end deffn
108+
@item @code{flags}
109+
Flags associated with the device, as a list of symbols, such as
110+
@code{'(UP LOOPBACK)}.
111111
112-
The module also defines the following function, that takes a @code{nl-data}
113-
structure and provides its serialization in a bytevector:
112+
@item @code{mtu}
113+
MTU of the link, as an integer.
114114
115-
@deffn {Scheme Procedure} serialize @var{data} @var{pos} @var{bv}
116-
Takes a @code{nl-data} structure as @var{data}, a position @var{pos} in
117-
the bytevector @var{bv}, and returns an unspecified value.
115+
@item @code{qdisc}
116+
Queuing discipline of the link, as a string, such as @code{"noqueue"}.
118117
119-
This function updates the bytevector and adds the serialization of @var{data}
120-
into @var{bv} at @var{pos}.
121-
@end deffn
118+
@item @code{state}
119+
State of the link, as an integer.  Use @code{int->operstate} from
120+
@code{(netlink constant)} to get a symbol, such as @code{IF_OPER_UP}.
122121
123-
By providing a @code{nl-data} structure, we defer the knowledge of how to
124-
serialize the data to the structure itself, instead of the @code{serialize}
125-
function.  This allows for more flexibility and extensibility, as the user
126-
of the procedure can pass any kind of data, even if it is not yet supported by
127-
guile-netlink.
122+
@item @code{mode}
123+
Mode of the link.  0 means @code{DORMANT}, 1 means @code{DEFAULT}.
128124
129-
Similarly, we need to be able to deserialize netlink answers into a data
130-
structure.  To do so, we also defer the knowledge of the datastructure to
131-
deserialize to, to a decoder structure that is passed to the deserialization
132-
procedure.  @code{(netlink data)} also defines the following procedures to
133-
deserialize data:
125+
@item @code{group}
126+
Identifier of the group it belongs to.  0 for @code{default}.
134127
135-
@deffn {Scheme Procedure} deserialize @var{type} @var{decoder} @var{bv} @var{pos}
136-
Takes a bytevector @var{bv} and starts deserializing the data starting at
137-
position @var{pos}.  To do so, it uses the @var{type} variable as the lookup
138-
key in the @var{decoder}.  @var{type} is a symbol that represents the type of
139-
data to deserialize to.
128+
@item @code{qlen}
129+
Size of the queue.
140130
141-
The decoder is a structure that associates each known type to its deserializer
142-
(a function that takes a decoder, a bytevector and a position and returns some
143-
data) and an alist that associates a type (an integer, as returned by the
144-
protocol in use) to the proper decoder of that type.
145-
@end deffn
131+
@item @code{addr}
132+
Ethernet address of the link, as a string.
146133
147-
@deffn {Scheme Procedure} get-current-deserialize @var{decoder} @var{current-type}
148-
Takes a decoder and a type, and returns the deserialization procedure associated
149-
with the type (a symbol) in @var{decoder}.
134+
@item @code{brd}
135+
Broadcast (ethernet) address of the link, as a string.
136+
137+
@end table
150138
@end deffn
151139
152-
@deffn {Scheme Procedure} get-next-deserialize @var{decoder} @var{current-type} @
153-
    @var{target-type}
154-
Takes a decoder, a type (a symbol that represents the type of data being
155-
deserialized) and another type (an integer as returned by the protocol), and
156-
returns the deserialization procedure needed to continue decoding the data
157-
associated with the currently being deserialized data.
140+
@deffn {Scheme Procedure} get-links
141+
Returns the list of existing links in the system, as a list of @code{<link>}
142+
objects.
143+
@end deffn
158144
159-
For example, when decoding an answer in the netlink protocol, we first deserialize
160-
the header into a @code{message} structure.  That header contains a type field
161-
that contains an integer constant representing the type of data of the body.
162-
Similarly, when deserializing a routing attribute in the rtnetlink protocol,
163-
we first find a header of the attribute that defines an integer constant
164-
corresponding to the type of attribute in the body.
145+
@deffn {Scheme Procedure} wait-for-link @var{name} [#:blocking? #t]
146+
Wait until a link called @var{name} (a string such as @code{"ens3"}) shows
147+
up.
165148
166-
By knowing the context in which the type is declared, this procedure can return
167-
the correct deserializing procedure.  For instance, when deserializing a
168-
@code{message}, type @code{16} means @code{RTM_NEWLINK} in the rtnetlink
169-
protocol, whereas it means @code{IFLA_OPERSTATE} when deserializing a
170-
@code{route-attribute}.
149+
When @var{blocking?} is false, use a non-blocking socket and cooperate via
150+
@code{current-read-waiter}---useful when using Fibers.
171151
@end deffn
172152
173-
guile-netlink provides the following default decoder for the rtnetlink
174-
protocol in @code{(netlink deserialize)}:
175-
176-
@deffn {Scheme Variable} %default-route-decoder
177-
Contains the default decoder for the NETLINK_ROUTE protocol.
153+
@deffn {Sceme Procedure} print-link @var{link}
154+
Display @var{link} on the standard output, using a format similar to
155+
@command{ip link} from @code{iproute2}.
178156
@end deffn
179157
180-
For convenience, guile-netlink defines the following structures that can be used
181-
to create a custom decoder.
158+
@deffn {Scheme Procedure} link-set @var{device} [#:up @code{#f}] @
159+
  [#:down @code{#f}] [#:type @code{#f}] [#:arp-on @code{#f}] @
160+
  [#:arp-off @code{#f}] [#:dynamic-on @code{#f}] [#:dynamic-off @code{#f}] @
161+
  [#:multicast-on @code{#f}] [#:multicast-off @code{#f}] @
162+
  [#:allmulticast-on @code{#f}] [#:allmulticast-off @code{#f}] @
163+
  [#:promisc-on @code{#f}] [#:promisc-off @code{#f}] [#:trailers-on @code{#f}] @
164+
  [#:trailers-off @code{#f}] [#:carrier-on @code{#f}] [#:carrier-off @code{#f}] @
165+
  [#:txqueuelen @code{#f}] [#:name @code{#f}] [#:address @code{#f}] @
166+
  [#:broadcast @code{#f}] [#:mtu @code{#f}] [#:netns @code{#f}]
167+
Modify an existing link and set its flags and attributes to the ones specified
168+
by the various keywords.  When a keyword is omited, the corresponding attribute
169+
is not changed.
182170
183-
@deffn {Scheme Variable} %default-message-decoder
184-
Contains the default association list for the common message types of netlink,
185-
associating each of them to a deserialization procedure.
186-
@end deffn
171+
@var{device} can be a device index (as a number) or a device name (as a string).
187172
188-
@deffn {Scheme Procedure} default-route-attr-decoder @var{deserialize-addr}
189-
Creates the default association list for a route protocol, given the specified
190-
address deserializer.  This is useful because the @code{IFA_ADDRESS},
191-
@code{IFA_BROADCAST}, etc, contain a different type of address depending on
192-
the message type or its header.  This is defined an @code{(netlink route attrs)}
193-
and used by the following variables:
173+
Do not set @code{#:up} and @code{#:down} at the same time.  Do not set
174+
@code{*-on} and @code{*-off} at the same time.
194175
@end deffn
195176
196-
@deffn {Scheme Variable} %default-route-link-attr-decoder
197-
Contains the default association list for the known types of routing attributes
198-
for link messages.  This list is defined in @code{(netlink route attrs)}.
177+
@deffn {Scheme Procedure} link-show [#:device @code{#f}] [#:group @code{#f}] @
178+
  [#:up @code{#f}] [#:master @code{#f}] [#:vrf @code{#f}] [#:type @code{#f}]
179+
Print the set of devices on standard output.  Setting any of the keyword to a
180+
non-false value will filter the results to only show results that match the
181+
corresponding value.  You may set more than one keyword.
199182
@end deffn
200183
201-
@node Constants
202-
@subsection Constants
203-
204-
Guile-netlink defines constants used by the Netlink protocols in the
205-
@code{(netlink constant)} module.  The constants are the ones present in the
206-
kernel and are too numerous to list here.  Please see the source for the
207-
complete list.
208-
209-
The module also defines the following macro:
184+
@deffn {Scheme Procedure} link-add @var{name} @var{type} [#:type-args @code{'()}]
185+
Add a new link with given name and type.  Additional arguments can be passed to
186+
control the state of the link at creation. @var{type-args} is an association
187+
list containing additional values for the given type.
210188
211-
@deffn {Scheme Macro} define-enum @var{integer->symbol} @var{name-spec} ...
212-
This macros defines an enumeration.  @var{integer->symbol} is the name of
213-
a procedure that is publicly defined, that takes an integer and returns the
214-
associated symbol in the enumeration.
189+
When @var{type} is @code{"vlan"}, @var{type-args} can contain a number associated
190+
with @code{'id}: the VLAN id to be created and a link name associated with
191+
@code{"link"}: the name of the link on which the vlan is created.
215192
216-
The macro also publicly defines variables whose names are in @var{name-spec}
217-
to an integer.
193+
The following is an example in which we create a new vlan link:
194+
@example
195+
;; same as "ip l add link eth0 name eth0.7 type vlan id 7"
196+
(link-add "eth0.7" "vlan" #:type-args '((id . 7) (link . "eth0")))
197+
@end example
218198
219-
A @var{name-spec} is either a single name, and the associated value is 0 for
220-
the first @var{name-spec}, or one more than the previous @var{name-spec}.
221-
It can also be a pair of a name and an integer, in which case the associated
222-
value is that integer.  For instance:
199+
When @var{type} is @code{"veth"}, @var{type-args} can contain a string associated
200+
with @code{'peer}: the name of the peer.
223201
202+
The following is an example in which we create a new veth (virtual ethernet)
203+
pair and give them a name:
224204
@example
225-
(define-enum get-foo FOO0 FOO1 (FOO10 10) FOO11 FOO12)
226-
(get-foo 9) -> #<unspecified>
227-
(get-foo 0) -> FOO0
228-
FOO11 -> 11
205+
;; same as "ip l add v0p0 type veth peer v0p1"
206+
(link-add "v0p0" "veth" #:type-args '((peer . "v0p1")))
229207
@end example
230208
@end deffn
231209
232-
@node Netlink Connections
233-
@subsection Netlink Connections
234-
235-
The @code{(netlink connection)} module defines the following procedures, used
236-
to connect and communicate with another process or the kernel using a netlink
237-
socket.
238-
239-
@deffn {Scheme Procedure} get-addr @var{family} @var{pid} @var{groups}
240-
Return a bytevector that represents a netlink address.  @var{family}
241-
should be @code{AF_NETLINK}, @var{pid} is the PID of the process with which
242-
to communicate or 0 for the kernel. @var{groups} is an integer representing
243-
the set of broadcast groups to which the connection subscribes.
210+
@deffn {Scheme Procedure} link-del @var{device}
211+
Delete a link.  @var{device} can contain the name of the link, as a string,
212+
or its index, as a number.
244213
@end deffn
245214
246-
@cindex non-blocking socket
247-
@deffn {Scheme Procedure} connect @var{proto} @var{addr} [#:flags 0]
248-
Creates a netlink socket for @var{proto} and binds it to @var{addr}.
249-
250-
@var{proto} is the integer representing the protocol.  For instance, rtnetlink
251-
can be selected by usin @code{NETLINK_ROUTE} (defined in
252-
@code{(netlink constant)}).
215+
@node Addr
216+
@section Addr
253217
254-
@var{addr} is a bytevector, as returned by @code{get-addr}.
218+
The @code{(ip addr)} module introduces procedures to access and modify the
219+
network addresses on your machine.  They are equivalent to the @command{ip addr}
220+
family of commands, from @code{iproute2}.
255221
256-
@var{flags} is a set of additional flags to pass as the second argument
257-
to the @code{socket} system call---e.g., @code{SOCK_NONBLOCK}.
258-
@end deffn
222+
@deffn {Scheme Procedure} addr-add @var{device} @var{cidr} [@var{#:ipv6?} #f] @
223+
        [@var{#:peer} @code{(cidr->addr cidr)}] [@var{#:broadcast} #f] @
224+
        [@var{#:anycast} #f] [@var{#:label} #f] [@var{#:scope} @code{'global}] @
225+
        [@var{#:metric} #f] [@var{#:home?} #f] [@var{#:mngtmpaddr?} #f] @
226+
        [@var{#:nodad?} #f] [@var{optimistic?} #f] [@var{noprefixroute?} #f] @
227+
        [@var{#:autojoin?} #f]
228+
Add the address given in @var{cidr} to @var{device}. @var{device} can
229+
contain the name of the link, as a string, or its index, as a number.
259230
260-
@deffn {Scheme Procedure} connect-route [#:groups 0] [#:flags 0]
261-
This procedure is a wrapper for @code{connect} that creates a socket for the
262-
rtnetlink protocol, binds it to the kernel and returns it.  By passing the
263-
optional @var{groups} keyword, you can select broadcast groups to subscribe to.
231+
@var{cidr} must be a string containing the address and prefix length, in
232+
CIDR notation (@code{addr/prefix}).
264233
265-
@var{flags} is a set of additional flags to pass as the second argument
266-
to the @code{socket} system call---e.g., @code{SOCK_NONBLOCK}.
267-
@end deffn
234+
@example
235+
(addr-add "enp1s0" "192.0.2.15/24")
236+
@end example
268237
269-
@cindex subscribing, to an rtnetlink group
270-
@deffn {Scheme Procedure} add-socket-membership @var{sock} @var{group}
271-
Make @var{sock} a member of @var{group}, an @code{RTNLGRP_} constant,
272-
meaning that it will be subscribed to events of that group.
238+
If you wish to add an IPv6 address instead, set @code{#:ipv6} to @code{#t},
239+
as in the following example.
273240
274-
For example, here is how you could create a netlink socket and subscribe
275-
it to the ``link'' group so that it receives notifications for new and
276-
removed links:
241+
@example
242+
(addr-add "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)
243+
@end example
277244
278-
@lisp
279-
(let ((sock (connect-route)))
280-
  (add-socket-membership sock RTNLGRP_LINK)
281-
  @dots{})
282-
@end lisp
245+
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
246+
flag will result in a @code{Bad address} exception from inet-pton.
283247
284-
This procedure is implemented as a @code{setsockopt} call.
285-
@end deffn
248+
Additional flags are available; they follow the same semantics as Iproute2.
249+
For pointopoint interfaces, you can specify the address of the remote endpoint
250+
with @var{#:peer}. You can specify a broadcast or anycast address with
251+
@var{#:broadcast} and @var{#:anycast}. All three require an IP address passed
252+
as a string when specified.
286253
287-
@deffn {Scheme Procedure} send-msg @var{msg} @var{sock} [#:@var{addr}]
288-
Send @var{msg} (it must be of type message, @xref{Netlink Headers}) to
289-
@var{addr} using @var{sock}.  If not passed, @var{addr} is the address of
290-
the kernel.
291-
@end deffn
254+
You can specify a label for the address with @var{#:label}. The parameter must
255+
be a string that is either the name of the device, or starts with the name of
256+
the device, followed by a colon and must contain at most 15 characters.
292257
293-
@deffn {Scheme Procedure} receive-msg @var{sock} [#:@var{addr}]
294-
Receives a message from @var{sock} from @var{addr}.  This procedure is blocking.
295-
If not passed, @var{addr} defaults to the address of the kernel.  This
296-
procedure returns the message as a bytevector, that you can deserialize with
297-
@code{deserialize} (@xref{Data Types})
298-
@end deffn
258+
You can specify a scope with @var{#:scope}, whose value is either @code{'global},
259+
@code{'link}, @code{'host} or a numeric value.
299260
300-
@deffn {Scheme Procedure} receive-and-decode-msg @var{sock} @var{decoder} @
301-
    [#:@var{addr}]
302-
Receives one or more messages from @var{sock} from @var{addr}.  this procedure
303-
is blocking.  If not passed, @var{addr} defaults to the address of the kernel.
304-
This procedure returns a list of messages that were decoded using @var{decoder}.
261+
You can specify the priority of the prefix route associated with this address
262+
using @code{#:metric}, a number.
305263
306-
When the answer has the @code{NLM_F_MULTI} flag, this procedure decodes the next
307-
message, until it receives a @code{NLMSG_DONE} message.  It returns the list
308-
of every netlink messages it received, including the @code{NLMSG_DONE}.
264+
Finally, this procedures accepts address configuration flags, whose values are
265+
booleans.  They are unset by default.  Some flags only work for IPv6 addresses,
266+
those are @var{#:home?} to designate this address as the ``home address'',
267+
@var{#:mngtmpaddr?}, @var{#:nodad?} and @var{#:optimistic?}. The flags
268+
@var{#:noprefixroute?} and @var{#:autojoin?} can be set for IPv4 and IPv6
269+
addresses.
309270
@end deffn
310271
311-
@node Netlink API
312-
@section Netlink API
272+
@deffn {Scheme Procedure} addr-del @var{device} @var{cidr} [@var{#:ipv6?} #f] @
273+
        [@var{#:peer} @code{(cidr->addr cidr)}] [@var{#:broadcast} #f] @
274+
        [@var{#:anycast} #f] [@var{#:label} #f] [@var{#:scope} @code{'global}] @
275+
        [@var{#:metric} #f] [@var{#:home?} #f] [@var{#:mngtmpaddr?} #f] @
276+
        [@var{#:nodad?} #f] [@var{optimistic?} #f] [@var{noprefixroute?} #f] @
277+
        [@var{#:autojoin?} #f]
278+
Delete the address given in @var{cidr} from @var{device}. @var{device} can
279+
contain the name of the link, as a string, or its index, as a number.
313280
314-
This section introduces the data structures used for all the netlink protocols.
315-
First, we introduce the structure of a netlink message, then we present the
316-
standard types of netlink messages, that can be used with every protocol.
281+
@var{cidr} must be a string containing the address and prefix length, in
282+
CIDR notation (@code{addr/prefix}).
317283
318-
@node Netlink Headers
319-
@subsection Netlink Headers
284+
@example
285+
(addr-del "enp1s0" "192.0.2.15/24")
286+
@end example
320287
321-
The @code{(netlink message)} module defines the message structure that contains
322-
a netlink message.  It is composed of a header and a body, and is the data
323-
structure to pass to @code{send-msg} (@xref{Netlink Connections}).
288+
If you wish to remove an IPv6 address instead, set @code{#:ipv6} to @code{#t},
289+
as in the following example.
324290
325-
This module defines the following data structure:
291+
@example
292+
(addr-del "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)
293+
@end example
326294
327-
@deffn {Datatype} message
328-
@table @asis
329-
@item @code{type}
330-
The type of data in the body of the message.  For instance, @code{RTM_GETLINK}.
295+
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
296+
flag will result in a @code{Bad address} exception from inet-pton.
331297
332-
@item @code{flags}
333-
The set of flags that are set in the header.  For instance,
334-
@code{(logior NLM_F_REQUEST NLM_F_DUMP)}.
298+
Additional flags are available, see the description in @code{addr-add} for more
299+
details.
300+
@end deffn
335301
336-
@item @code{seq}
337-
The sequence number of the message.  If this message is an answer to a request,
338-
it must keep the same sequence number.  Otherwise, you must generate a new and
339-
unique sequence number, to track the answers.
302+
@deffn {Scheme Procedure} addr-show [@var{device}]
303+
Print the list of addresses for each device on standard output.  Setting
304+
@code{device} to a link name or link identifier will restrict the output
305+
to addresses of that device.
306+
@end deffn
340307
341-
@item @code{pid}
342-
The PID of the receiving process, or 0 for the kernel.
308+
@node Route
309+
@section Route
343310
344-
@item @code{data}
345-
The actual body, as an @code{nl-data} structure.
311+
The @code{(ip route)} module introduces procedures to access and modify the
312+
network routes on your machine.  They are equivalent to the @command{ip route}
313+
family of commands, from @code{iproute2}.
346314
347-
@end table
348-
@end deffn
315+
@deffn {Scheme Procedure} route-add @var{dest} [@var{#:ipv6?} #f] @
316+
    [@var{#:device} #f] [@var{#:table} RT_TABLE_MAIN] [@var{#:protocol} #f] @
317+
    [@var{#:scope} RT_SCOPE_LINK] [@var{#:type} RTN_UNICAST] @
318+
    [@var{#:priority} #f] [@var{#:src} #f] [@var{#:via} #f]
319+
Add the route described by the argmuents.  @var{dest} is the destination network,
320+
in cidr notation (@code{addr/prefix}) or the string @code{"default"}.
349321
350-
@node Standard Message Types
351-
@subsection Standard Message Types
322+
@var{#:device} is the name or index of a network link. @var{#:table} is the
323+
index of a routing table, one of @code{RT_TABLE_COMPAT}, @code{RT_TABLE_DEFAULT},
324+
@code{RT_TABLE_MAIN} or @code{RT_TABLE_LOCAL}, as defined in
325+
@code{(netlink constant)}.
352326
353-
The @code{(netlink standard)} module defines the set of standard message types
354-
and their data type.
327+
If it is set, @var{#:protocol} must be the routing protocol, @code{RTPROT_*},
328+
as defined in @code{(netlink constant)}.
355329
356-
@deffn {Datatype} error-message
357-
@table @asis
358-
@item @code{err}
359-
The error code, as a negative number.
330+
@var{#:scope} must be the scope of the route, one of @code{RT_SCOPE_*}, as
331+
defined in @code{(netlink constant)}.
360332
361-
@item @code{hdr}
362-
The message on which this error applies.
333+
@var{#:type} must be the type of route, one of @code{RTN_*}, as defined in
334+
@code{(netlink constant)}.
363335
364-
@end table
336+
If set, @var{#:priority} is a number specifying the priority of the rule
337+
when the kernel is looking for a matching rule.  This is also known as the
338+
metric of the route.
365339
366-
@deffn {Scheme Variable} no-data
367-
This variable defines the absence of data.  This is useful when a structure
368-
is expecting a body part, but the protocol specifically defines that it should
369-
not take any data in some cases.  For instance, a @code{NLMSG_NOOP} message
370-
takes no data, so the @code{data} field of the message will contain this
371-
@code{no-data} value.
340+
If set, @var{#:src} is the source address in cidr notation, or as a single
341+
address.
342+
343+
If set, @var{#:via} is the gateway address.  This is not in cidr notation, as
344+
the gateway is a single address, not a network.
345+
346+
@example
347+
(route-add "default" #:device "enp1s0" #:via "192.0.2.1")
348+
(route-add "192.0.2.0/24" #:device "enp1s0" #:src "192.0.2.15")
349+
@end example
350+
351+
If you wish to add an IPv6 route instead, set @code{#:ipv6} to @code{#t},
352+
as in the following example.
353+
354+
@example
355+
(addr-add "2001:db8::/64" #:device "enp1s0" #:src "2001:db8::1a4c" #:ipv6? #t)
356+
@end example
357+
358+
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
359+
flag will result in a @code{Bad address} exception from inet-pton.
372360
@end deffn
373361
362+
@deffn {Scheme Procedure} route-del @var{dest} [@var{#:ipv6?} #f] @
363+
    [@var{#:device} #f] [@var{#:table} RT_TABLE_MAIN] [@var{#:protocol} #f] @
364+
    [@var{#:scope} #f] [@var{#:type} #f] [@var{#:priority} #f] @
365+
    [@var{#:src} #f] [@var{#:via} #f]
366+
Delete the route given in arguments.  The arguments follow the same structure
367+
as @code{route-add}.  By specifying more arguments, you can narrow down the
368+
search for the rule to delete further.  Each call will only remove one route,
369+
so being more precise ensures you target the rule you wish to delete.  It
370+
is not clear which route is deleted if multiple routes match your query.
374371
@end deffn
375372
376-
@node Rtnetlink API
377-
@section Rtnetlink API
378-
@cindex rtnetlink
379-
@cindex ROUTE_NETLINK
373+
@deffn {Scheme Procedure} route-show [@var{#:table} RT_TABLE_MAIN] @
374+
    [@var{#:family} AF_UNSPEC]
375+
Print the list of routes on standard output.  Note that, contrary to
376+
@command{ip route show}, we show both IPv4 and IPv6 routes.  To narrow down the
377+
number of routes displayed, you can specify the family as in this example.
380378
381-
This section describes the support for rtnetlink in guile-netlink.  Rtnetlink
382-
is the protocol responsible for everything related to network routing.  It
383-
allows you to manage links, addresses, routing tables, neighbor chaces,
384-
routing rules, queueing disciplines, traffic classes, traffic filters and
385-
more.
379+
@example
380+
(route-show #:family AF_INET6)
381+
@end example
382+
@end deffn
386383
387-
@node Routing Attributes
388-
@subsection Routing Attributes
384+
@node API Reference
385+
@chapter API Reference
389386
390-
The @code{(netlink route attrs)} module defines the following data types:
387+
@node Common API
388+
@section Common API
391389
392-
@deffn {Datatype} route-attr
393-
This defines a header structure for the attribute, as well as its body.
390+
Guile-netlink implements a common API for expressing other protocols.  This
391+
section describes how to use this API to augment guile-netlink with additional
392+
protocols.
394393
395-
@table @asis
396-
@item @code{type}
397-
This is the type of the attribute, for instance @code{IFLA_ADDRESS}.
394+
@node Data Types
395+
@subsection Data Types
396+
397+
Guile-netlink defines data types that are used in the various Netlink protocols.
398+
We need to be able to serialize and deserialize data that guile-netlink
399+
understands, but we also want to let users of guile-netlink extend this process
400+
easily.  This need has lead to the creating of the following data structure,
401+
defined in @code{(netlink data}).
398402
403+
@deffn {Datatype} nl-data
404+
405+
@table @asis
399406
@item @code{data}
400-
This is the body of the attribute, ie.@: its value.
401-
@end table
402-
@end deffn
407+
The data that is held by this record.
403408
404-
The module also defines additional data types that are not represented as
405-
a record, but by a simple type.  For each of the following types, there is
406-
a @code{make-*-route-attr} procedure to produce a @code{nl-data} value
407-
for this type.  There is also @code{deserialize-route-attr-data-*} procedure
408-
to deserialize a value of this type.
409+
@item @code{size-proc}
410+
A procedure that takes a data (of the same type as the data recorded in the
411+
@code{data} field) and returns the size of its serialization.
409412
410-
@table @asis
411-
@item @code{u8}
412-
A one-byte unsigned integer
413-
@item @code{u16}
414-
A two-bytes unsigned integer
415-
@item @code{u32}
416-
A four-bytes unsigned integer
417-
@item @code{s32}
418-
A four-bytes signed integer
419-
@item @code{string}
420-
A string
421-
@item @code{ethernet}
422-
An ethernet address.  Its value is a string that represents that address,
423-
for instnace @code{"01:23:45:67:89:ab"}
424-
@item @code{ipv4}
425-
An IPv4 address.  Its value is a string that represents that address,
426-
for instnace @code{"192.0.2.152"}
427-
@item @code{ipv6}
428-
An IPv6 address.  Its value is a string that represents that address,
429-
for instnace @code{"2001:db8::0123:4567:89ab:cdef"}
430-
@item @code{bv}
431-
A bytevector.  This is used by default when the type is not supported.
432-
@end table
413+
@item @code{serialization-proc}
414+
A procedure that takes a data (of the same type as the data recorded in the
415+
@code{data} field), the position at which to start serializing, and a
416+
bytevector in which to serialize.  This procedure should modify the bytevector
417+
and its return value is ignored.
433418
434-
@node Link Messages
435-
@subsection Link Messages
419+
@end table
420+
@end deffn
436421
437-
The @code{(netlink route link)} package defines the following data type:
422+
The module also defines the following function, that takes a @code{nl-data}
423+
structure and provides its serialization in a bytevector:
438424
439-
@deffn {Datatype} link-message
440-
This datatype represents a link message with its routing attributes.  This type
441-
of message is expected when using the @var{RTM_*LINK} message types.
425+
@deffn {Scheme Procedure} serialize @var{data} @var{pos} @var{bv}
426+
Takes a @code{nl-data} structure as @var{data}, a position @var{pos} in
427+
the bytevector @var{bv}, and returns an unspecified value.
442428
443-
@table @asis
444-
@item @code{family}
445-
The network family, defined as @code{AF_UNSPEC} in the rtnetlink documentation,
446-
although it holds different values in practice.
429+
This function updates the bytevector and adds the serialization of @var{data}
430+
into @var{bv} at @var{pos}.
431+
@end deffn
447432
448-
@item @code{type}
449-
The device type.
433+
By providing a @code{nl-data} structure, we defer the knowledge of how to
434+
serialize the data to the structure itself, instead of the @code{serialize}
435+
function.  This allows for more flexibility and extensibility, as the user
436+
of the procedure can pass any kind of data, even if it is not yet supported by
437+
guile-netlink.
450438
451-
@item @code{index}
452-
The index of the device.  This is used to select a specific device by its index,
453-
or 0 to not filter by device index.
439+
Similarly, we need to be able to deserialize netlink answers into a data
440+
structure.  To do so, we also defer the knowledge of the datastructure to
441+
deserialize to, to a decoder structure that is passed to the deserialization
442+
procedure.  @code{(netlink data)} also defines the following procedures to
443+
deserialize data:
454444
455-
@item @code{flags}
456-
The device flags.  See @code{man 7 netdevices} for a list.
445+
@deffn {Scheme Procedure} deserialize @var{type} @var{decoder} @var{bv} @var{pos}
446+
Takes a bytevector @var{bv} and starts deserializing the data starting at
447+
position @var{pos}.  To do so, it uses the @var{type} variable as the lookup
448+
key in the @var{decoder}.  @var{type} is a symbol that represents the type of
449+
data to deserialize to.
457450
458-
@item @code{attrs}
459-
A list of attributes.  This field must contain a list of @code{nl-data}
460-
structures, not a structure by itself.
461-
@end table
451+
The decoder is a structure that associates each known type to its deserializer
452+
(a function that takes a decoder, a bytevector and a position and returns some
453+
data) and an alist that associates a type (an integer, as returned by the
454+
protocol in use) to the proper decoder of that type.
462455
@end deffn
463456
464-
@node Address Messages
465-
@subsection Address Messages
457+
@deffn {Scheme Procedure} get-current-deserialize @var{decoder} @var{current-type}
458+
Takes a decoder and a type, and returns the deserialization procedure associated
459+
with the type (a symbol) in @var{decoder}.
460+
@end deffn
466461
467-
The @code{(netlink route addr)} package defines the following data type:
462+
@deffn {Scheme Procedure} get-next-deserialize @var{decoder} @var{current-type} @
463+
    @var{target-type}
464+
Takes a decoder, a type (a symbol that represents the type of data being
465+
deserialized) and another type (an integer as returned by the protocol), and
466+
returns the deserialization procedure needed to continue decoding the data
467+
associated with the currently being deserialized data.
468468
469-
@deffn {Datatype} addr-message
470-
This datatype represents an address message with its routing attributes.  This
471-
type of message is expected when using the @var{RTM_*ADDR} message types.
469+
For example, when decoding an answer in the netlink protocol, we first deserialize
470+
the header into a @code{message} structure.  That header contains a type field
471+
that contains an integer constant representing the type of data of the body.
472+
Similarly, when deserializing a routing attribute in the rtnetlink protocol,
473+
we first find a header of the attribute that defines an integer constant
474+
corresponding to the type of attribute in the body.
472475
473-
@table @asis
474-
@item @code{family}
475-
The network family, either @code{AF_INET} for IPv4 addresses, or @code{AF_INET6}
476-
for IPv6 addresses.
476+
By knowing the context in which the type is declared, this procedure can return
477+
the correct deserializing procedure.  For instance, when deserializing a
478+
@code{message}, type @code{16} means @code{RTM_NEWLINK} in the rtnetlink
479+
protocol, whereas it means @code{IFLA_OPERSTATE} when deserializing a
480+
@code{route-attribute}.
481+
@end deffn
477482
478-
@item @code{prefix-len}
479-
The prefix length, i.e.@: the length of the prefix mask, in bits, if defined
480-
for the address family.
483+
guile-netlink provides the following default decoder for the rtnetlink
484+
protocol in @code{(netlink deserialize)}:
481485
482-
@item @code{flags}
483-
Address flags.  This can be a flag word of @code{IFA_F_SECONDARY} for secondary
484-
address (old alias interface), @code{IFA_F_PERMANENT} for a permanent
485-
address set by the user and other undocumented flags.
486+
@deffn {Scheme Variable} %default-route-decoder
487+
Contains the default decoder for the NETLINK_ROUTE protocol.
488+
@end deffn
486489
487-
@item @code{scope}
488-
The address scope.
490+
For convenience, guile-netlink defines the following structures that can be used
491+
to create a custom decoder.
489492
490-
@item @code{index}
491-
The index of the device this address is for.
493+
@deffn {Scheme Variable} %default-message-decoder
494+
Contains the default association list for the common message types of netlink,
495+
associating each of them to a deserialization procedure.
496+
@end deffn
492497
493-
@item @code{attrs}
494-
A list of attributes.  This field must contain a list of @code{nl-data}
495-
structures, not a structure by itself.
496-
@end table
498+
@deffn {Scheme Procedure} default-route-attr-decoder @var{deserialize-addr}
499+
Creates the default association list for a route protocol, given the specified
500+
address deserializer.  This is useful because the @code{IFA_ADDRESS},
501+
@code{IFA_BROADCAST}, etc, contain a different type of address depending on
502+
the message type or its header.  This is defined an @code{(netlink route attrs)}
503+
and used by the following variables:
497504
@end deffn
498505
499-
@node IP Library
500-
@chapter IP Library
506+
@deffn {Scheme Variable} %default-route-link-attr-decoder
507+
Contains the default association list for the known types of routing attributes
508+
for link messages.  This list is defined in @code{(netlink route attrs)}.
509+
@end deffn
501510
502-
This library comes with higher-level procedures that let you access and modify
503-
the state of network on your computer.
511+
@node Constants
512+
@subsection Constants
504513
505-
@node Link
506-
@section Link
514+
Guile-netlink defines constants used by the Netlink protocols in the
515+
@code{(netlink constant)} module.  The constants are the ones present in the
516+
kernel and are too numerous to list here.  Please see the source for the
517+
complete list.
507518
508-
The @code{(ip link)} module introduces procedures to access and modify the
509-
network links on your machine.  They are equivalent to the @command{ip link}
510-
family of commands, from @code{iproute2}.
519+
The module also defines the following macro:
511520
512-
@deffn {Datatype} <link>
521+
@deffn {Scheme Macro} define-enum @var{integer->symbol} @var{name-spec} ...
522+
This macros defines an enumeration.  @var{integer->symbol} is the name of
523+
a procedure that is publicly defined, that takes an integer and returns the
524+
associated symbol in the enumeration.
513525
514-
Datatype representing the status of a network link.
526+
The macro also publicly defines variables whose names are in @var{name-spec}
527+
to an integer.
515528
516-
get-links                                                           
517-
            print-link                                                          
518-
                                                                                
519-
            <link> make-link link?                                              
520-
            link-name link-id link-type link-flags link-mtu link-qdisc          
521-
            link-state link-mode link-group link-qlen link-addr link-brd
529+
A @var{name-spec} is either a single name, and the associated value is 0 for
530+
the first @var{name-spec}, or one more than the previous @var{name-spec}.
531+
It can also be a pair of a name and an integer, in which case the associated
532+
value is that integer.  For instance:
522533
523-
@table @asis
524-
@item @code{name}
525-
Name of the link, such as @code{"enp1s0"}.
534+
@example
535+
(define-enum get-foo FOO0 FOO1 (FOO10 10) FOO11 FOO12)
536+
(get-foo 9) -> #<unspecified>
537+
(get-foo 0) -> FOO0
538+
FOO11 -> 11
539+
@end example
540+
@end deffn
526541
527-
@item @code{id}
528-
Index of the link, a unique number used to identify the link.
542+
@node Netlink Connections
543+
@subsection Netlink Connections
529544
530-
@item @code{type}
531-
Type of the link, as an integer.
545+
The @code{(netlink connection)} module defines the following procedures, used
546+
to connect and communicate with another process or the kernel using a netlink
547+
socket.
532548
533-
@item @code{flags}
534-
Flags associated with the device, as a list of symbols, such as
535-
@code{'(UP LOOPBACK)}.
549+
@deffn {Scheme Procedure} get-addr @var{family} @var{pid} @var{groups}
550+
Return a bytevector that represents a netlink address.  @var{family}
551+
should be @code{AF_NETLINK}, @var{pid} is the PID of the process with which
552+
to communicate or 0 for the kernel. @var{groups} is an integer representing
553+
the set of broadcast groups to which the connection subscribes.
554+
@end deffn
536555
537-
@item @code{mtu}
538-
MTU of the link, as an integer.
556+
@cindex non-blocking socket
557+
@deffn {Scheme Procedure} connect @var{proto} @var{addr} [#:flags 0]
558+
Creates a netlink socket for @var{proto} and binds it to @var{addr}.
539559
540-
@item @code{qdisc}
541-
Queuing discipline of the link, as a string, such as @code{"noqueue"}.
560+
@var{proto} is the integer representing the protocol.  For instance, rtnetlink
561+
can be selected by usin @code{NETLINK_ROUTE} (defined in
562+
@code{(netlink constant)}).
542563
543-
@item @code{state}
544-
State of the link, as an integer.  Use @code{int->operstate} from
545-
@code{(netlink constant)} to get a symbol, such as @code{IF_OPER_UP}.
564+
@var{addr} is a bytevector, as returned by @code{get-addr}.
546565
547-
@item @code{mode}
548-
Mode of the link.  0 means @code{DORMANT}, 1 means @code{DEFAULT}.
566+
@var{flags} is a set of additional flags to pass as the second argument
567+
to the @code{socket} system call---e.g., @code{SOCK_NONBLOCK}.
568+
@end deffn
549569
550-
@item @code{group}
551-
Identifier of the group it belongs to.  0 for @code{default}.
570+
@deffn {Scheme Procedure} connect-route [#:groups 0] [#:flags 0]
571+
This procedure is a wrapper for @code{connect} that creates a socket for the
572+
rtnetlink protocol, binds it to the kernel and returns it.  By passing the
573+
optional @var{groups} keyword, you can select broadcast groups to subscribe to.
552574
553-
@item @code{qlen}
554-
Size of the queue.
575+
@var{flags} is a set of additional flags to pass as the second argument
576+
to the @code{socket} system call---e.g., @code{SOCK_NONBLOCK}.
577+
@end deffn
555578
556-
@item @code{addr}
557-
Ethernet address of the link, as a string.
579+
@cindex subscribing, to an rtnetlink group
580+
@deffn {Scheme Procedure} add-socket-membership @var{sock} @var{group}
581+
Make @var{sock} a member of @var{group}, an @code{RTNLGRP_} constant,
582+
meaning that it will be subscribed to events of that group.
558583
559-
@item @code{brd}
560-
Broadcast (ethernet) address of the link, as a string.
584+
For example, here is how you could create a netlink socket and subscribe
585+
it to the ``link'' group so that it receives notifications for new and
586+
removed links:
561587
562-
@end table
563-
@end deffn
588+
@lisp
589+
(let ((sock (connect-route)))
590+
  (add-socket-membership sock RTNLGRP_LINK)
591+
  @dots{})
592+
@end lisp
564593
565-
@deffn {Scheme Procedure} get-links
566-
Returns the list of existing links in the system, as a list of @code{<link>}
567-
objects.
594+
This procedure is implemented as a @code{setsockopt} call.
568595
@end deffn
569596
570-
@deffn {Scheme Procedure} wait-for-link @var{name} [#:blocking? #t]
571-
Wait until a link called @var{name} (a string such as @code{"ens3"}) shows
572-
up.
573-
574-
When @var{blocking?} is false, use a non-blocking socket and cooperate via
575-
@code{current-read-waiter}---useful when using Fibers.
597+
@deffn {Scheme Procedure} send-msg @var{msg} @var{sock} [#:@var{addr}]
598+
Send @var{msg} (it must be of type message, @xref{Netlink Headers}) to
599+
@var{addr} using @var{sock}.  If not passed, @var{addr} is the address of
600+
the kernel.
576601
@end deffn
577602
578-
@deffn {Sceme Procedure} print-link @var{link}
579-
Display @var{link} on the standard output, using a format similar to
580-
@command{ip link} from @code{iproute2}.
603+
@deffn {Scheme Procedure} receive-msg @var{sock} [#:@var{addr}]
604+
Receives a message from @var{sock} from @var{addr}.  This procedure is blocking.
605+
If not passed, @var{addr} defaults to the address of the kernel.  This
606+
procedure returns the message as a bytevector, that you can deserialize with
607+
@code{deserialize} (@xref{Data Types})
581608
@end deffn
582609
583-
@deffn {Scheme Procedure} link-set @var{device} [#:up @code{#f}] @
584-
  [#:down @code{#f}] [#:type @code{#f}] [#:arp-on @code{#f}] @
585-
  [#:arp-off @code{#f}] [#:dynamic-on @code{#f}] [#:dynamic-off @code{#f}] @
586-
  [#:multicast-on @code{#f}] [#:multicast-off @code{#f}] @
587-
  [#:allmulticast-on @code{#f}] [#:allmulticast-off @code{#f}] @
588-
  [#:promisc-on @code{#f}] [#:promisc-off @code{#f}] [#:trailers-on @code{#f}] @
589-
  [#:trailers-off @code{#f}] [#:carrier-on @code{#f}] [#:carrier-off @code{#f}] @
590-
  [#:txqueuelen @code{#f}] [#:name @code{#f}] [#:address @code{#f}] @
591-
  [#:broadcast @code{#f}] [#:mtu @code{#f}] [#:netns @code{#f}]
592-
Modify an existing link and set its flags and attributes to the ones specified
593-
by the various keywords.  When a keyword is omited, the corresponding attribute
594-
is not changed.
595-
596-
@var{device} can be a device index (as a number) or a device name (as a string).
597-
598-
Do not set @code{#:up} and @code{#:down} at the same time.  Do not set
599-
@code{*-on} and @code{*-off} at the same time.
600-
@end deffn
610+
@deffn {Scheme Procedure} receive-and-decode-msg @var{sock} @var{decoder} @
611+
    [#:@var{addr}]
612+
Receives one or more messages from @var{sock} from @var{addr}.  this procedure
613+
is blocking.  If not passed, @var{addr} defaults to the address of the kernel.
614+
This procedure returns a list of messages that were decoded using @var{decoder}.
601615
602-
@deffn {Scheme Procedure} link-show [#:device @code{#f}] [#:group @code{#f}] @
603-
  [#:up @code{#f}] [#:master @code{#f}] [#:vrf @code{#f}] [#:type @code{#f}]
604-
Print the set of devices on standard output.  Setting any of the keyword to a
605-
non-false value will filter the results to only show results that match the
606-
corresponding value.  You may set more than one keyword.
616+
When the answer has the @code{NLM_F_MULTI} flag, this procedure decodes the next
617+
message, until it receives a @code{NLMSG_DONE} message.  It returns the list
618+
of every netlink messages it received, including the @code{NLMSG_DONE}.
607619
@end deffn
608620
609-
@deffn {Scheme Procedure} link-add @var{name} @var{type} [#:type-args @code{'()}]
610-
Add a new link with given name and type.  Additional arguments can be passed to
611-
control the state of the link at creation. @var{type-args} is an association
612-
list containing additional values for the given type.
613-
614-
When @var{type} is @code{"vlan"}, @var{type-args} can contain a number associated
615-
with @code{'id}: the VLAN id to be created and a link name associated with
616-
@code{"link"}: the name of the link on which the vlan is created.
621+
@node Netlink API
622+
@section Netlink API
617623
618-
The following is an example in which we create a new vlan link:
619-
@example
620-
;; same as "ip l add link eth0 name eth0.7 type vlan id 7"
621-
(link-add "eth0.7" "vlan" #:type-args '((id . 7) (link . "eth0")))
622-
@end example
624+
This section introduces the data structures used for all the netlink protocols.
625+
First, we introduce the structure of a netlink message, then we present the
626+
standard types of netlink messages, that can be used with every protocol.
623627
624-
When @var{type} is @code{"veth"}, @var{type-args} can contain a string associated
625-
with @code{'peer}: the name of the peer.
628+
@node Netlink Headers
629+
@subsection Netlink Headers
626630
627-
The following is an example in which we create a new veth (virtual ethernet)
628-
pair and give them a name:
629-
@example
630-
;; same as "ip l add v0p0 type veth peer v0p1"
631-
(link-add "v0p0" "veth" #:type-args '((peer . "v0p1")))
632-
@end example
633-
@end deffn
631+
The @code{(netlink message)} module defines the message structure that contains
632+
a netlink message.  It is composed of a header and a body, and is the data
633+
structure to pass to @code{send-msg} (@xref{Netlink Connections}).
634634
635-
@deffn {Scheme Procedure} link-del @var{device}
636-
Delete a link.  @var{device} can contain the name of the link, as a string,
637-
or its index, as a number.
638-
@end deffn
635+
This module defines the following data structure:
639636
640-
@node Addr
641-
@section Addr
637+
@deffn {Datatype} message
638+
@table @asis
639+
@item @code{type}
640+
The type of data in the body of the message.  For instance, @code{RTM_GETLINK}.
642641
643-
The @code{(ip addr)} module introduces procedures to access and modify the
644-
network addresses on your machine.  They are equivalent to the @command{ip addr}
645-
family of commands, from @code{iproute2}.
642+
@item @code{flags}
643+
The set of flags that are set in the header.  For instance,
644+
@code{(logior NLM_F_REQUEST NLM_F_DUMP)}.
646645
647-
@deffn {Scheme Procedure} addr-add @var{device} @var{cidr} [@var{#:ipv6?} #f] @
648-
        [@var{#:peer} @code{(cidr->addr cidr)}] [@var{#:broadcast} #f] @
649-
        [@var{#:anycast} #f] [@var{#:label} #f] [@var{#:scope} @code{'global}] @
650-
        [@var{#:metric} #f] [@var{#:home?} #f] [@var{#:mngtmpaddr?} #f] @
651-
        [@var{#:nodad?} #f] [@var{optimistic?} #f] [@var{noprefixroute?} #f] @
652-
        [@var{#:autojoin?} #f]
653-
Add the address given in @var{cidr} to @var{device}. @var{device} can
654-
contain the name of the link, as a string, or its index, as a number.
646+
@item @code{seq}
647+
The sequence number of the message.  If this message is an answer to a request,
648+
it must keep the same sequence number.  Otherwise, you must generate a new and
649+
unique sequence number, to track the answers.
655650
656-
@var{cidr} must be a string containing the address and prefix length, in
657-
CIDR notation (@code{addr/prefix}).
651+
@item @code{pid}
652+
The PID of the receiving process, or 0 for the kernel.
658653
659-
@example
660-
(addr-add "enp1s0" "192.0.2.15/24")
661-
@end example
654+
@item @code{data}
655+
The actual body, as an @code{nl-data} structure.
662656
663-
If you wish to add an IPv6 address instead, set @code{#:ipv6} to @code{#t},
664-
as in the following example.
657+
@end table
658+
@end deffn
665659
666-
@example
667-
(addr-add "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)
668-
@end example
660+
@node Standard Message Types
661+
@subsection Standard Message Types
669662
670-
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
671-
flag will result in a @code{Bad address} exception from inet-pton.
663+
The @code{(netlink standard)} module defines the set of standard message types
664+
and their data type.
672665
673-
Additional flags are available; they follow the same semantics as Iproute2.
674-
For pointopoint interfaces, you can specify the address of the remote endpoint
675-
with @var{#:peer}. You can specify a broadcast or anycast address with
676-
@var{#:broadcast} and @var{#:anycast}. All three require an IP address passed
677-
as a string when specified.
666+
@deffn {Datatype} error-message
667+
@table @asis
668+
@item @code{err}
669+
The error code, as a negative number.
678670
679-
You can specify a label for the address with @var{#:label}. The parameter must
680-
be a string that is either the name of the device, or starts with the name of
681-
the device, followed by a colon and must contain at most 15 characters.
671+
@item @code{hdr}
672+
The message on which this error applies.
682673
683-
You can specify a scope with @var{#:scope}, whose value is either @code{'global},
684-
@code{'link}, @code{'host} or a numeric value.
674+
@end table
685675
686-
You can specify the priority of the prefix route associated with this address
687-
using @code{#:metric}, a number.
676+
@deffn {Scheme Variable} no-data
677+
This variable defines the absence of data.  This is useful when a structure
678+
is expecting a body part, but the protocol specifically defines that it should
679+
not take any data in some cases.  For instance, a @code{NLMSG_NOOP} message
680+
takes no data, so the @code{data} field of the message will contain this
681+
@code{no-data} value.
682+
@end deffn
688683
689-
Finally, this procedures accepts address configuration flags, whose values are
690-
booleans.  They are unset by default.  Some flags only work for IPv6 addresses,
691-
those are @var{#:home?} to designate this address as the ``home address'',
692-
@var{#:mngtmpaddr?}, @var{#:nodad?} and @var{#:optimistic?}. The flags
693-
@var{#:noprefixroute?} and @var{#:autojoin?} can be set for IPv4 and IPv6
694-
addresses.
695684
@end deffn
696685
697-
@deffn {Scheme Procedure} addr-del @var{device} @var{cidr} [@var{#:ipv6?} #f] @
698-
        [@var{#:peer} @code{(cidr->addr cidr)}] [@var{#:broadcast} #f] @
699-
        [@var{#:anycast} #f] [@var{#:label} #f] [@var{#:scope} @code{'global}] @
700-
        [@var{#:metric} #f] [@var{#:home?} #f] [@var{#:mngtmpaddr?} #f] @
701-
        [@var{#:nodad?} #f] [@var{optimistic?} #f] [@var{noprefixroute?} #f] @
702-
        [@var{#:autojoin?} #f]
703-
Delete the address given in @var{cidr} from @var{device}. @var{device} can
704-
contain the name of the link, as a string, or its index, as a number.
686+
@node Rtnetlink API
687+
@section Rtnetlink API
688+
@cindex rtnetlink
689+
@cindex ROUTE_NETLINK
705690
706-
@var{cidr} must be a string containing the address and prefix length, in
707-
CIDR notation (@code{addr/prefix}).
691+
This section describes the support for rtnetlink in guile-netlink.  Rtnetlink
692+
is the protocol responsible for everything related to network routing.  It
693+
allows you to manage links, addresses, routing tables, neighbor chaces,
694+
routing rules, queueing disciplines, traffic classes, traffic filters and
695+
more.
708696
709-
@example
710-
(addr-del "enp1s0" "192.0.2.15/24")
711-
@end example
697+
@node Routing Attributes
698+
@subsection Routing Attributes
712699
713-
If you wish to remove an IPv6 address instead, set @code{#:ipv6} to @code{#t},
714-
as in the following example.
700+
The @code{(netlink route attrs)} module defines the following data types:
715701
716-
@example
717-
(addr-del "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)
718-
@end example
702+
@deffn {Datatype} route-attr
703+
This defines a header structure for the attribute, as well as its body.
719704
720-
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
721-
flag will result in a @code{Bad address} exception from inet-pton.
705+
@table @asis
706+
@item @code{type}
707+
This is the type of the attribute, for instance @code{IFLA_ADDRESS}.
722708
723-
Additional flags are available, see the description in @code{addr-add} for more
724-
details.
709+
@item @code{data}
710+
This is the body of the attribute, ie.@: its value.
711+
@end table
725712
@end deffn
726713
727-
@deffn {Scheme Procedure} addr-show [@var{device}]
728-
Print the list of addresses for each device on standard output.  Setting
729-
@code{device} to a link name or link identifier will restrict the output
730-
to addresses of that device.
731-
@end deffn
714+
The module also defines additional data types that are not represented as
715+
a record, but by a simple type.  For each of the following types, there is
716+
a @code{make-*-route-attr} procedure to produce a @code{nl-data} value
717+
for this type.  There is also @code{deserialize-route-attr-data-*} procedure
718+
to deserialize a value of this type.
732719
733-
@node Route
734-
@section Route
720+
@table @asis
721+
@item @code{u8}
722+
A one-byte unsigned integer
723+
@item @code{u16}
724+
A two-bytes unsigned integer
725+
@item @code{u32}
726+
A four-bytes unsigned integer
727+
@item @code{s32}
728+
A four-bytes signed integer
729+
@item @code{string}
730+
A string
731+
@item @code{ethernet}
732+
An ethernet address.  Its value is a string that represents that address,
733+
for instnace @code{"01:23:45:67:89:ab"}
734+
@item @code{ipv4}
735+
An IPv4 address.  Its value is a string that represents that address,
736+
for instnace @code{"192.0.2.152"}
737+
@item @code{ipv6}
738+
An IPv6 address.  Its value is a string that represents that address,
739+
for instnace @code{"2001:db8::0123:4567:89ab:cdef"}
740+
@item @code{bv}
741+
A bytevector.  This is used by default when the type is not supported.
742+
@end table
735743
736-
The @code{(ip route)} module introduces procedures to access and modify the
737-
network routes on your machine.  They are equivalent to the @command{ip route}
738-
family of commands, from @code{iproute2}.
744+
@node Link Messages
745+
@subsection Link Messages
739746
740-
@deffn {Scheme Procedure} route-add @var{dest} [@var{#:ipv6?} #f] @
741-
    [@var{#:device} #f] [@var{#:table} RT_TABLE_MAIN] [@var{#:protocol} #f] @
742-
    [@var{#:scope} RT_SCOPE_LINK] [@var{#:type} RTN_UNICAST] @
743-
    [@var{#:priority} #f] [@var{#:src} #f] [@var{#:via} #f]
744-
Add the route described by the argmuents.  @var{dest} is the destination network,
745-
in cidr notation (@code{addr/prefix}) or the string @code{"default"}.
747+
The @code{(netlink route link)} package defines the following data type:
746748
747-
@var{#:device} is the name or index of a network link. @var{#:table} is the
748-
index of a routing table, one of @code{RT_TABLE_COMPAT}, @code{RT_TABLE_DEFAULT},
749-
@code{RT_TABLE_MAIN} or @code{RT_TABLE_LOCAL}, as defined in
750-
@code{(netlink constant)}.
749+
@deffn {Datatype} link-message
750+
This datatype represents a link message with its routing attributes.  This type
751+
of message is expected when using the @var{RTM_*LINK} message types.
751752
752-
If it is set, @var{#:protocol} must be the routing protocol, @code{RTPROT_*},
753-
as defined in @code{(netlink constant)}.
753+
@table @asis
754+
@item @code{family}
755+
The network family, defined as @code{AF_UNSPEC} in the rtnetlink documentation,
756+
although it holds different values in practice.
754757
755-
@var{#:scope} must be the scope of the route, one of @code{RT_SCOPE_*}, as
756-
defined in @code{(netlink constant)}.
758+
@item @code{type}
759+
The device type.
757760
758-
@var{#:type} must be the type of route, one of @code{RTN_*}, as defined in
759-
@code{(netlink constant)}.
761+
@item @code{index}
762+
The index of the device.  This is used to select a specific device by its index,
763+
or 0 to not filter by device index.
760764
761-
If set, @var{#:priority} is a number specifying the priority of the rule
762-
when the kernel is looking for a matching rule.  This is also known as the
763-
metric of the route.
765+
@item @code{flags}
766+
The device flags.  See @code{man 7 netdevices} for a list.
764767
765-
If set, @var{#:src} is the source address in cidr notation, or as a single
766-
address.
768+
@item @code{attrs}
769+
A list of attributes.  This field must contain a list of @code{nl-data}
770+
structures, not a structure by itself.
771+
@end table
772+
@end deffn
767773
768-
If set, @var{#:via} is the gateway address.  This is not in cidr notation, as
769-
the gateway is a single address, not a network.
774+
@node Address Messages
775+
@subsection Address Messages
770776
771-
@example
772-
(route-add "default" #:device "enp1s0" #:via "192.0.2.1")
773-
(route-add "192.0.2.0/24" #:device "enp1s0" #:src "192.0.2.15")
774-
@end example
777+
The @code{(netlink route addr)} package defines the following data type:
775778
776-
If you wish to add an IPv6 route instead, set @code{#:ipv6} to @code{#t},
777-
as in the following example.
779+
@deffn {Datatype} addr-message
780+
This datatype represents an address message with its routing attributes.  This
781+
type of message is expected when using the @var{RTM_*ADDR} message types.
778782
779-
@example
780-
(addr-add "2001:db8::/64" #:device "enp1s0" #:src "2001:db8::1a4c" #:ipv6? #t)
781-
@end example
783+
@table @asis
784+
@item @code{family}
785+
The network family, either @code{AF_INET} for IPv4 addresses, or @code{AF_INET6}
786+
for IPv6 addresses.
782787
783-
Note that using the wrong ip type with the wrong value for the @code{#:ipv6?}
784-
flag will result in a @code{Bad address} exception from inet-pton.
785-
@end deffn
788+
@item @code{prefix-len}
789+
The prefix length, i.e.@: the length of the prefix mask, in bits, if defined
790+
for the address family.
786791
787-
@deffn {Scheme Procedure} route-del @var{dest} [@var{#:ipv6?} #f] @
788-
    [@var{#:device} #f] [@var{#:table} RT_TABLE_MAIN] [@var{#:protocol} #f] @
789-
    [@var{#:scope} #f] [@var{#:type} #f] [@var{#:priority} #f] @
790-
    [@var{#:src} #f] [@var{#:via} #f]
791-
Delete the route given in arguments.  The arguments follow the same structure
792-
as @code{route-add}.  By specifying more arguments, you can narrow down the
793-
search for the rule to delete further.  Each call will only remove one route,
794-
so being more precise ensures you target the rule you wish to delete.  It
795-
is not clear which route is deleted if multiple routes match your query.
796-
@end deffn
792+
@item @code{flags}
793+
Address flags.  This can be a flag word of @code{IFA_F_SECONDARY} for secondary
794+
address (old alias interface), @code{IFA_F_PERMANENT} for a permanent
795+
address set by the user and other undocumented flags.
797796
798-
@deffn {Scheme Procedure} route-show [@var{#:table} RT_TABLE_MAIN] @
799-
    [@var{#:family} AF_UNSPEC]
800-
Print the list of routes on standard output.  Note that, contrary to
801-
@command{ip route show}, we show both IPv4 and IPv6 routes.  To narrow down the
802-
number of routes displayed, you can specify the family as in this example.
797+
@item @code{scope}
798+
The address scope.
803799
804-
@example
805-
(route-show #:family AF_INET6)
806-
@end example
800+
@item @code{index}
801+
The index of the device this address is for.
802+
803+
@item @code{attrs}
804+
A list of attributes.  This field must contain a list of @code{nl-data}
805+
structures, not a structure by itself.
806+
@end table
807807
@end deffn
808808
809809
@c *********************************************************************