guile-netlink

Next: , Up: (dir)   [Contents][Index]

guile-netlink

This document describes guile-netlink version unknown, a guile implementation of the netlink protocol.

Table of Contents


1 Introduction

Netlink is an inter-process communication protocol that can be used for communication between processes, or with the kernel. It is implemented by Linux.

Many protocols exist on top of Netlink. The most famous are used to configure network-related functions in the kernel, such as firewall, route table or IP addresses of interfaces.

This library implements the low-level bits of the code by providing data structures that are close to their C counterpart, and basic procedures to initiate communication.


Next: , Previous: , Up: guile-netlink   [Contents][Index]

2 API Reference


2.1 Common API

Guile-netlink implements a common API for expressing other protocols. This section describes how to use this API to augment guile-netlink with additional protocols.


Next: , Up: Common API   [Contents][Index]

2.1.1 Data Types

Guile-netlink defines data types that are used in the various Netlink protocols. We need to be able to serialize and deserialize data that guile-netlink understands, but we also want to let users of guile-netlink extend this process easily. This need has lead to the creating of the following data structure, defined in (netlink data).

Datatype: nl-data
data

The data that is held by this record.

size-proc

A procedure that takes a data (of the same type as the data recorded in the data field) and returns the size of its serialization.

serialization-proc

A procedure that takes a data (of the same type as the data recorded in the data field), the position at which to start serializing, and a bytevector in which to serialize. This procedure should modify the bytevector and its return value is ignored.

The module also defines the following function, that takes a nl-data structure and provides its serialization in a bytevector:

Scheme Procedure: serialize data pos bv

Takes a nl-data structure as data, a position pos in the bytevector bv, and returns an unspecified value.

This function updates the bytevector and adds the serialization of data into bv at pos.

By providing a nl-data structure, we defer the knowledge of how to serialize the data to the structure itself, instead of the serialize function. This allows for more flexibility and extensibility, as the user of the procedure can pass any kind of data, even if it is not yet supported by guile-netlink.

Similarly, we need to be able to deserialize netlink answers into a data structure. To do so, we also defer the knowledge of the datastructure to deserialize to, to a decoder structure that is passed to the deserialization procedure. (netlink data) also defines the following procedures to deserialize data:

Scheme Procedure: deserialize type decoder bv pos

Takes a bytevector bv and starts deserializing the data starting at position pos. To do so, it uses the type variable as the lookup key in the decoder. type is a symbol that represents the type of data to deserialize to.

The decoder is a structure that associates each known type to its deserializer (a function that takes a decoder, a bytevector and a position and returns some data) and an alist that associates a type (an integer, as returned by the protocol in use) to the proper decoder of that type.

Scheme Procedure: get-current-deserialize decoder current-type

Takes a decoder and a type, and returns the deserialization procedure associated with the type (a symbol) in decoder.

Scheme Procedure: get-next-deserialize decoder current-type target-type

Takes a decoder, a type (a symbol that represents the type of data being deserialized) and another type (an integer as returned by the protocol), and returns the deserialization procedure needed to continue decoding the data associated with the currently being deserialized data.

For example, when decoding an answer in the netlink protocol, we first deserialize the header into a message structure. That header contains a type field that contains an integer constant representing the type of data of the body. Similarly, when deserializing a routing attribute in the rtnetlink protocol, we first find a header of the attribute that defines an integer constant corresponding to the type of attribute in the body.

By knowing the context in which the type is declared, this procedure can return the correct deserializing procedure. For instance, when deserializing a message, type 16 means RTM_NEWLINK in the rtnetlink protocol, whereas it means IFLA_OPERSTATE when deserializing a route-attribute.

guile-netlink provides the following default decoder for the rtnetlink protocol in (netlink deserialize):

Scheme Variable: %default-route-decoder

Contains the default decoder for the NETLINK_ROUTE protocol.

For convenience, guile-netlink defines the following structures that can be used to create a custom decoder.

Scheme Variable: %default-message-decoder

Contains the default association list for the common message types of netlink, associating each of them to a deserialization procedure.

Scheme Procedure: default-route-attr-decoder deserialize-addr

Creates the default association list for a route protocol, given the specified address deserializer. This is useful because the IFA_ADDRESS, IFA_BROADCAST, etc, contain a different type of address depending on the message type or its header. This is defined an (netlink route attrs) and used by the following variables:

Contains the default association list for the known types of routing attributes for link messages. This list is defined in (netlink route attrs).


2.1.2 Constants

Guile-netlink defines constants used by the Netlink protocols in the (netlink constant) module. The constants are the ones present in the kernel and are too numerous to list here. Please see the source for the complete list.

The module also defines the following macro:

Scheme Macro: define-enum integer->symbol name-spec ...

This macros defines an enumeration. integer->symbol is the name of a procedure that is publicly defined, that takes an integer and returns the associated symbol in the enumeration.

The macro also publicly defines variables whose names are in name-spec to an integer.

A name-spec is either a single name, and the associated value is 0 for the first name-spec, or one more than the previous name-spec. It can also be a pair of a name and an integer, in which case the associated value is that integer. For instance:

(define-enum get-foo FOO0 FOO1 (FOO10 10) FOO11 FOO12)
(get-foo 9) -> #<unspecified>
(get-foo 0) -> FOO0
FOO11 -> 11

3 IP Library

This library comes with higher-level procedures that let you access and modify the state of network on your computer.


Next: , Previous: , Up: IP Library   [Contents][Index]

3.2 Addr

The (ip addr) module introduces procedures to access and modify the network addresses on your machine. They are equivalent to the ip addr family of commands, from iproute2.

Scheme Procedure: addr-add device cidr [#:ipv6? #f] [#:peer (cidr->addr cidr)] [#:broadcast #f] [#:anycast #f] [#:label #f] [#:scope 'global] [#:metric #f] [#:home? #f] [#:mngtmpaddr? #f] [#:nodad? #f] [optimistic? #f] [noprefixroute? #f] [#:autojoin? #f]

Add the address given in cidr to device. device can contain the name of the link, as a string, or its index, as a number.

cidr must be a string containing the address and prefix length, in CIDR notation (addr/prefix).

(addr-add "enp1s0" "192.0.2.15/24")

If you wish to add an IPv6 address instead, set #:ipv6 to #t, as in the following example.

(addr-add "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)

Note that using the wrong ip type with the wrong value for the #:ipv6? flag will result in a Bad address exception from inet-pton.

Additional flags are available; they follow the same semantics as Iproute2. For pointopoint interfaces, you can specify the address of the remote endpoint with #:peer. You can specify a broadcast or anycast address with #:broadcast and #:anycast. All three require an IP address passed as a string when specified.

You can specify a label for the address with #:label. The parameter must be a string that is either the name of the device, or starts with the name of the device, followed by a colon and must contain at most 15 characters.

You can specify a scope with #:scope, whose value is either 'global, 'link, 'host or a numeric value.

You can specify the priority of the prefix route associated with this address using #:metric, a number.

Finally, this procedures accepts address configuration flags, whose values are booleans. They are unset by default. Some flags only work for IPv6 addresses, those are #:home? to designate this address as the “home address”, #:mngtmpaddr?, #:nodad? and #:optimistic?. The flags #:noprefixroute? and #:autojoin? can be set for IPv4 and IPv6 addresses.

Scheme Procedure: addr-del device cidr [#:ipv6? #f] [#:peer (cidr->addr cidr)] [#:broadcast #f] [#:anycast #f] [#:label #f] [#:scope 'global] [#:metric #f] [#:home? #f] [#:mngtmpaddr? #f] [#:nodad? #f] [optimistic? #f] [noprefixroute? #f] [#:autojoin? #f]

Delete the address given in cidr from device. device can contain the name of the link, as a string, or its index, as a number.

cidr must be a string containing the address and prefix length, in CIDR notation (addr/prefix).

(addr-del "enp1s0" "192.0.2.15/24")

If you wish to remove an IPv6 address instead, set #:ipv6 to #t, as in the following example.

(addr-del "enp1s0" "2001:db8::1a4c/64" #:ipv6? #t)

Note that using the wrong ip type with the wrong value for the #:ipv6? flag will result in a Bad address exception from inet-pton.

Additional flags are available, see the description in addr-add for more details.

Scheme Procedure: addr-show [device]

Print the list of addresses for each device on standard output. Setting device to a link name or link identifier will restrict the output to addresses of that device.


Previous: , Up: IP Library   [Contents][Index]

3.3 Route

The (ip route) module introduces procedures to access and modify the network routes on your machine. They are equivalent to the ip route family of commands, from iproute2.

Scheme Procedure: route-add dest [#:ipv6? #f] [#:device #f] [#:table RT_TABLE_MAIN] [#:protocol #f] [#:scope RT_SCOPE_LINK] [#:type RTN_UNICAST] [#:priority #f] [#:src #f] [#:via #f]

Add the route described by the argmuents. dest is the destination network, in cidr notation (addr/prefix) or the string "default".

#:device is the name or index of a network link. #:table is the index of a routing table, one of RT_TABLE_COMPAT, RT_TABLE_DEFAULT, RT_TABLE_MAIN or RT_TABLE_LOCAL, as defined in (netlink constant).

If it is set, #:protocol must be the routing protocol, RTPROT_*, as defined in (netlink constant).

#:scope must be the scope of the route, one of RT_SCOPE_*, as defined in (netlink constant).

#:type must be the type of route, one of RTN_*, as defined in (netlink constant).

If set, #:priority is a number specifying the priority of the rule when the kernel is looking for a matching rule. This is also known as the metric of the route.

If set, #:src is the source address in cidr notation, or as a single address.

If set, #:via is the gateway address. This is not in cidr notation, as the gateway is a single address, not a network.

(route-add "default" #:device "enp1s0" #:via "192.0.2.1")
(route-add "192.0.2.0/24" #:device "enp1s0" #:src "192.0.2.15")

If you wish to add an IPv6 route instead, set #:ipv6 to #t, as in the following example.

(addr-add "2001:db8::/64" #:device "enp1s0" #:src "2001:db8::1a4c" #:ipv6? #t)

Note that using the wrong ip type with the wrong value for the #:ipv6? flag will result in a Bad address exception from inet-pton.

Scheme Procedure: route-del dest [#:ipv6? #f] [#:device #f] [#:table RT_TABLE_MAIN] [#:protocol #f] [#:scope #f] [#:type #f] [#:priority #f] [#:src #f] [#:via #f]

Delete the route given in arguments. The arguments follow the same structure as route-add. By specifying more arguments, you can narrow down the search for the rule to delete further. Each call will only remove one route, so being more precise ensures you target the rule you wish to delete. It is not clear which route is deleted if multiple routes match your query.

Scheme Procedure: route-show [#:table RT_TABLE_MAIN] [#:family AF_UNSPEC]

Print the list of routes on standard output. Note that, contrary to ip route show, we show both IPv4 and IPv6 routes. To narrow down the number of routes displayed, you can specify the family as in this example.

(route-show #:family AF_INET6)

Concept Index

Jump to:   N   R   S  
Index Entry  Section

N
non-blocking socket: Netlink Connections

R
ROUTE_NETLINK: Rtnetlink API
rtnetlink: Rtnetlink API

S
subscribing, to an rtnetlink group: Netlink Connections

Jump to:   N   R   S  

Previous: , Up: guile-netlink   [Contents][Index]

Programming Index

Jump to:   %   <  
A   C   D   E   G   L   M   N   P   R   S   W  
Index Entry  Section

%
%default-message-decoder: Data Types
%default-route-decoder: Data Types
%default-route-link-attr-decoder: Data Types

<
<link>: Link

A
add-socket-membership: Netlink Connections
addr-add: Addr
addr-del: Addr
addr-message: Address Messages
addr-show: Addr

C
connect: Netlink Connections
connect-route: Netlink Connections

D
default-route-attr-decoder: Data Types
define-enum: Constants
deserialize: Data Types

E
error-message: Standard Message Types

G
get-addr: Netlink Connections
get-current-deserialize: Data Types
get-links: Link
get-next-deserialize: Data Types

L
link-add: Link
link-del: Link
link-message: Link Messages
link-set: Link
link-show: Link

M
message: Netlink Headers

N
nl-data: Data Types
no-data: Standard Message Types

P
print-link: Link

R
receive-and-decode-msg: Netlink Connections
receive-msg: Netlink Connections
route-add: Route
route-attr: Routing Attributes
route-del: Route
route-show: Route

S
send-msg: Netlink Connections
serialize: Data Types

W
wait-for-link: Link

Jump to:   %   <  
A   C   D   E   G   L   M   N   P   R   S   W