Improve tech doc of MDP and servald config

This commit is contained in:
Andrew Bettison 2016-02-29 16:19:59 +10:30
parent 34e2e8d4bc
commit f53be7c6a6
3 changed files with 373 additions and 97 deletions

View File

@ -192,12 +192,12 @@ This document is available under the [Creative Commons Attribution 4.0 Internati
[individ]: http://developer.servalproject.org/files/serval_project_inc-individual.pdf [individ]: http://developer.servalproject.org/files/serval_project_inc-individual.pdf
[entity]: http://developer.servalproject.org/files/serval_project_inc-entity.pdf [entity]: http://developer.servalproject.org/files/serval_project_inc-entity.pdf
[DNA]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:dna [DNA]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:dna
[Serval Keyring]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:keyring [Serval Keyring]: ./doc/REST-API-Keyring.md
[MDP]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:mdp [MDP]: ./doc/Mesh-Datagram-Protocol.md
[VoMP]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:vomp [VoMP]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:vomp
[Rhizome]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:rhizome
[MeshMS]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:meshms [MeshMS]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:meshms
[Serval Infrastructure]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:serval_infrastructure [Rhizome]: ./doc/REST-API-Rhizome.md
[Serval Infrastructure]: ./doc/Serval-Infrastructure.md
[JNI]: http://en.wikipedia.org/wiki/Java_Native_Interface [JNI]: http://en.wikipedia.org/wiki/Java_Native_Interface
[Bash]: http://en.wikipedia.org/wiki/Bash_(Unix_shell) [Bash]: http://en.wikipedia.org/wiki/Bash_(Unix_shell)
[pipe]: http://www.kernel.org/doc/man-pages/online/pages/man2/pipe.2.html [pipe]: http://www.kernel.org/doc/man-pages/online/pages/man2/pipe.2.html

View File

@ -1,43 +1,241 @@
Mesh Datagram Protocol (MDP) Mesh Datagram Protocol (MDP)
============================ ============================
[Serval Project], May 2014 [Serval Project], March 2016
The [Mesh Datagram Protocol][MDP] is a network protocol developed for the The [Mesh Datagram Protocol][MDP] is a [layer 3][] network protocol developed
[Serval mesh network][], with characteristics that make it particularly for the [Serval mesh network][], with characteristics that make it particularly
suitable for use in Ad Hoc wireless networks, which can suffer high levels of suitable for use in Ad Hoc wireless networks, which can suffer high levels of
packet loss due to weak signal, interference and congestion. packet loss due to weak signal, interference and congestion.
MDP carries [datagram][] packets sent from an originating node to a single MDP carries [messages](#mdp-message) from [sender](#sender) to [recipient](#recipient)
destination node or broadcast to all nodes, guaranteeing only that packet [node](#node)s, or [broadcasts](#broadcast) to all nodes, guaranteeing only that
contents will be verbatim if delivered. MDP is similar to [UDP][] in terms of message contents will be correct if delivered, like a traditional [datagram][]
the service it provides to applications, but it uses per-hop retransmission and service. MDP is similar to [UDP][] in this respect, but it uses per-[link](#link)
adaptive link-state routing to boost packet delivery rates, which largely retransmission and adaptive link-state routing to boost packet delivery
immunises it from the cumulative packet loss effect typical of multi-hop rates, which largely immunises it from the cumulative packet loss effect
wireless networks. This means that its end-to-end, multi-hop packet delivery typical of multi-hop wireless networks. This means that, unlike [Internet
rate remains usefully high despite adverse network conditions. protocols][] its end-to-end, multi-hop packet delivery rate remains usefully
high despite adverse and changing network conditions.
Overlay Mesh Basic concepts
------------ --------------
MDP packets are transmitted over a network link using the [Overlay Mesh][] ### Node
packet format, which aggregates packets into *overlay frames* which are
designed to minimise packet size. Each overlay frame uses back references to
avoid repeating [SID][] addresses unnecessarily within the frame, and [SID
abbreviation][] to significantly shorten [SID][] addresses that have been used
in prior frames.
MDP Interface A **node** in the [Serval mesh network][] is a single device having one or more
------------- [network interfaces][], running exactly one instance of the [Serval DNA][]
daemon process that is [configured][] to use those network interfaces.
If a single device were to run several [Serval DNA][] daemon processes, then
each daemon process would be treated as a separate node, and they should be
[configured][] to share the device's [network interfaces][] and communicate
with each other using device-local interfaces such as [local sockets][] or
[pipes][].
### Link
A **link** in the [Serval mesh network][] is a direct network connection
between two [node](#node)s, making it possible for a packet sent by the [Serval
DNA][] daemon on one node to be received directly by the daemon on the other
node, without traversing any other node. In other words, a link is a direct
connection between nodes that supports [layer 2][] protocol functions.
Note that this definition does not rule out an MDP packet passing through a
non-Serval multi-hop route. For example, if an [overlay packet](#overlay-packet)
is routed through a multi-hop [layer 3][] or [layer 4][] network service, such
as [UDP][], that is still a *single link* as far as MDP is concerned, because
the packet does not pass through a Serval [node](#node).
### MDP Address
Every [node](#node) in the [Serval mesh network][] uses a unique [Serval ID][]
(abbreviated to **SID**) as its **MDP address**.
The [Serval DNA][] daemon can have one or many identities in its [keyring][],
and each identity has its own unique [SID][]. The daemon chooses the first
identity that it unlocks as the *principal* identity, and that identity's SID
becomes the node's MDP Address. If that identity is ever locked, then the
daemon will choose another currently unlocked identity and change its MDP
Address to be that SID.
Since each [SID][] identifies a distinct *user* of the network (sometimes
called a *subscriber*), then strictly speaking, the Serval mesh network could
be said to carry messages between *users* not between *devices*. There is
nothing to prevent a [keyring][] entry from being copied from one device to
another, thus it is possible for two or more devices to have the same MDP
Address. At present, Serval routing does not handle this case, so it could
cause unwanted effects such as route flapping or dropped messages.
In practice, the “duplicate MDP Address” problem is rare for the time being,
because the [Serval Mesh][] app for Android does not provide any way for a
non-expert user to copy the [keyring][] file from one device to another, and
other Serval devices such as the [Mesh Extender][] are not operated by
end-users.
### Transmitter
Whenever an [MDP message](#mdp-message) is carried over a single [link](#link)
from one [node](#node) to another, the **transmitter** link, identified by its
[MDP address](#mdp-address), is responsible for encapsulating the message in
such a way as to guarantee its content (error detection) and possibly guarantee
or at least improve its probability of arrival (retransmission or error
correction). The most common encapsulation is the [MDP overlay
packet](#overlay-packet).
*Transmitter* is a [layer 2][] concept because it concerns data transfer across
a single [link](#link).
### Receiver
Whenever an [MDP message](#mdp-message) is carried over a single [link](#link)
from one [node](#node) to another, the **receiver** link, identified by its
[MDP address](#mdp-address), is responsible for decoding the encapsulated
message, dealing with data corruption (error checking or correction),
cooperating with the [transmitter](#transmitter) (ACK to prevent
retransmission) and de-duplication.
*Receiver* is a [layer 2][] concept because it concerns data transfer across a
single [link](#link).
### Sender
Every [MDP message](#mdp-message) originates from a single **sender**
[node](#node), identified by its [MDP address](#mdp-address). As the message
passes through many [nodes](#node) to reach its [recipient](#recipient), it
keeps the same sender address.
*Sender* is a [layer 3][] concept because it specifies an end point of a
multi-[link](#link) route.
### Recipient
Every [MDP message](#mdp-message) that is not a [broadcast](#broadcast) message
is destined for a single **recipient** [node](#node), identified by its [MDP
address](#mdp-address). The message may pass through many [nodes](#node) to
reach its recipient.
*Recipient* is a [layer 3][] concept because it specifies an end point of a
multi-[link](#link) route.
### MDP message
The smallest unit of data transported by MDP is the **MDP message**. The MDP
message is a [layer 3][], or end-to-end concept: the [Serval mesh network][]
carries each MDP message from its [sender](#sender) to its
[recipient](#recipient), routing via as many intermediate [nodes](#node) as
necessary, without the messages having to specify any intermediate nodes.
An MDP message consists of a variable-length header, followed by a
variable-length payload which may be [encrypted][] and [signed][]. Most fields
in the MDP message header are optional, depending on the initial byte of bit
flags:
| bytes | name | present if | meaning |
|:------:|:-------------- |:----------------------- |:----------------------------------------------------- |
| 1 | FLAGS | | [message flags](#mdp-message-flags) |
| 1-33 | Sender SID | `!SENDER_SAME` | the [sender's](#sender) [address](#mdp-address) |
| 1-33 | Recipient SID | `!BROADCAST` | the [recipient's](#recipient) [address](#mdp-address) |
| 8 | broadcast sequence | `BROADCAST && !ONE_HOP` | [broadcast](#broadcast) message's sequence number |
| 1 | TTL and QoS | `!ONE_HOP` | time-to-live counter and service type |
| 2 | payload size | | number of bytes in payload |
| 0-max | payload | | |
### MDP message flags
The single FLAGS byte at the start of the [MDP message](#mdp-message) header
contains the following bits (bit numbers start with 0 = LSB):
| bit | symbol | meaning |
|:-----:|:------------- | --------------------------------------------------------------------------------------------- |
| 0 | `SENDER_SAME` | the [transmitter](#transmitter) is the [sender](#sender) |
| 1 | `BROADCAST` | message is [broadcast](#broadcast); has no [recipient](#recipient) |
| 2 | `ONE_HOP` | message is on last [link](#link), so the [receiver](#receiver) is the [recipient](#recipient) |
| 3 | (unused) | transmitter must set to zero; recipient must ignore |
| 4 | `CIPHERED` | payload is [encrypted][] |
| 5 | `SIGNED` | payload is [signed][] |
| 6 | `ACK_SOON` | transmitter will re-transmit very soon |
| 7 | (unused) | transmitter must set to zero; recipient must ignore |
* The `SENDER_SAME` flag is set on the first outbound [link](#link) of a message's
trajectory if the message is encapsulated in an [overlay
packet](#overlay-packet); ie, the [Sender SID](#sender) is identical to the
overlay packet's [Transmitter SID](#transmitter). In this case the *Sender
SID* field is omitted from the message's header, to avoid unnecessary
duplication.
* The `BROADCAST` flag indicates a [broadcast](#broadcast) message that is sent
to all nodes. If the `BROADCAST` flag is set, the [Recipient
SID](#recipient) message header field is absent, and the *broadcast sequence*
header field is present unless the `ONE_HOP` flag is also set (see below).
* The `ONE_HOP` flag is set to indicate that the message is not to be forwarded
by the receiver; this occurs in the following cases:
* The message is on the last [link](#link) of its trajectory to its
[recipient](#recipient) and is encapsulated in an [overlay
packet](#overlay-packet); ie, the [Recipient SID](#sender) is identical to
the overlay packet's [Receiver SID](#receiver). In this case the
*Recipient SID* field is omitted from the message's header, to avoid
unnecessary duplication.
* The message is a [broadcast](#broadcast) message that need not propagate
beyond the [receiver](#receiver); ie, it only has one [link](#link) to live
(TTL = 1). In this case, the *broadcast sequence* and *TTL and QoS* fields
are omitted from the message's header to save space.
* The `CIPHERED` flag is set if the message's payload is [encrypted][] using
the [Recipient SID](#recipient) as public key; only the recipient possesses
the private key (secret), so only the recipient can decrypt the payload. The
`CIPHERED` and `BROADCAST` flags are mutually exclusive; all
[broadcast](#broadcast) messages are unciphered.
* The `SIGNED` flag is set if the message's payload is [signed][] by the
sender; anyone can verify the signature using the [Sender SID](#sender)
public key, but only the sender possesses the private key (secret), so only
the sender can produce the signature.
* The `ACK_SOON` flag is set if the [transmitter](#transmitter) will re-send
the message unless receiving an ACK for the message within the next few
[overlay packet](#overlay-packet)s. This flag is typically used on
low-latency, high quality links to maximise throughput by avoiding redundant
re-transmissions.
### Broadcast
TBC
### Overlay Packet
MDP transmits a [MDP message](#mdp-message) over a [link](#link) by
encapsulating it into an **overlay packet** (also called **MDP packet** or
**overlay frame**). The MDP overlay packet is a [layer 2][] concept; it is
only concerned with transporting MDP messages across a single link to a
neighbouring *peer* node. Once an overlay packet arrives, the receiver
unpacks all of its MDP messages, consumes those for which it (or one of its
zero-hop identities) is the [recipient](#recipient) and independently
routes each of the remaining messages to its next appropriate peer.
Every overlay packet contains the [MDP address](#mdp-address)es of its
[transmitter](#transmitter) and [receiver](#receiver).
An overlay packet may contain many MDP messages. The header of each MDP
message in an overlay packet is constructed afresh when it is embedded into the
packet, setting its [flag bits](#mdp-message-flags) and using [SID
abbreviation][] to omit or reduce duplicated [SID][]s, in order to conserve
link bandwidth where possible.
MDP Client Interface
--------------------
The [Serval DNA][] daemon provides an interface that allows client applications The [Serval DNA][] daemon provides an interface that allows client applications
to send and receive individual MDP packets on the [Serval mesh network][] to send and receive individual MDP packets on the [Serval mesh network][]
without having to construct and disassemble Overlay Mesh frames on their own. without having to construct and disassemble Overlay Mesh frames on their own.
MDP API MDP Client API
------- --------------
The MDP API is a [C language][] [API][] that an application can use to send and The *MDP Client API* is a [C language][] [API][] that an application can use to
receive MDP packets over the [Serval mesh network][] using the send and receive MDP packets over the [Serval mesh network][] using the
[interface](#mdp-interface) provided by the [Serval DNA][] daemon. [interface](#mdp-interface) provided by the [Serval DNA][] daemon.
----- -----
@ -49,12 +247,26 @@ Available under the [Creative Commons Attribution 4.0 International licence][CC
[Serval Project]: http://www.servalproject.org/ [Serval Project]: http://www.servalproject.org/
[CC BY 4.0]: ../LICENSE-DOCUMENTATION.md [CC BY 4.0]: ../LICENSE-DOCUMENTATION.md
[Serval mesh network]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:mesh_network [Serval mesh network]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:mesh_network
[Serval DNA]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:servaldna: [Serval DNA]: ../README.md
[Serval Mesh]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:servalmesh:
[Mesh Extender]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:meshextender:
[MDP]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:mdp [MDP]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:mdp
[datagram]: http://en.wikipedia.org/wiki/Datagram [datagram]: http://en.wikipedia.org/wiki/Datagram
[Internet protocols]: https://en.wikipedia.org/wiki/Internet_protocol_suite
[layer 2]: https://en.wikipedia.org/wiki/Data_link_layer
[layer 3]: https://en.wikipedia.org/wiki/Network_layer
[layer 4]: https://en.wikipedia.org/wiki/Transport_layer
[UDP]: http://en.wikipedia.org/wiki/User_Datagram_Protocol [UDP]: http://en.wikipedia.org/wiki/User_Datagram_Protocol
[Overlay Mesh]: ./Overlay-Mesh.md [MTU]: http://en.wikipedia.org/wiki/Maximum_transmission_unit
[SID]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:sid [Serval ID]: ./REST-API-Keyring.md#serval-id
[SID]: ./REST-API-Keyring.md#serval-id
[SID abbreviation]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:sid_abbreviation [SID abbreviation]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:sid_abbreviation
[configured]: ./Servald-Configuration.md
[network interfaces]: ./Servald-Configuration.md#network-interfaces
[keyring]: ./REST-API-Keyring.md
[encrypted]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:security_framework
[signed]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:tech:security_framework
[local sockets]: https://en.wikipedia.org/wiki/Unix_domain_socket
[pipes]: https://en.wikipedia.org/wiki/Pipeline_(Unix)
[C language]: http://en.wikipedia.org/wiki/C_(programming_language) [C language]: http://en.wikipedia.org/wiki/C_(programming_language)
[API]:http://en.wikipedia.org/wiki/Application_programming_interface [API]:http://en.wikipedia.org/wiki/Application_programming_interface

View File

@ -1,13 +1,29 @@
Configuring Serval DNA Configuring Serval DNA
====================== ======================
[Serval Project][], April 2013 [Serval Project][], March 2016
Introduction
------------
The [Serval DNA][] daemon, also called **servald**, is designed to operate in a
wide variety of environments (GNU/Linux, Android, Solaris, iOS) with different
kinds of network links (Wi-Fi, Ethernet, packet radio, dummy), different levels
of resources (CPU, memory, persistent storage) and for different purposes
(development, testing, deployment).
In order to adapt to all of these requirements, **servald** can be *configured*
to adjust its behaviour in the following areas:
* [file system layout](#file-system-layout)
* [logging](#logging)
* [network interfaces](#network-interfaces)
* [Rhizome][]
Configuration options Configuration options
--------------------- ---------------------
The **servald** configuration is an unordered set of LABEL=VALUE pairs called The [Serval DNA][] configuration is expressed as an unordered set of
*options*. For example: textual LABEL=VALUE pairs called *options*. For example:
debug.verbose=true debug.verbose=true
interfaces.0.file=/var/tmp/serval/dummy interfaces.0.file=/var/tmp/serval/dummy
@ -128,36 +144,42 @@ configuration and the file contents will once again be consistent.
Daemon instances Daemon instances
---------------- ----------------
It order to support more than one daemon running on the same host, each daemon It order to support more than one [Serval DNA][] daemon running on the same
can be configured to use its own *instance directory*, as follows: host, each daemon can be configured to use its own *instance directory*, as
follows:
* A daemon's instance directory can be set at run time by setting the * A daemon's [instance directory](#instance-directory) can be set at run time
`SERVALINSTANCE_PATH` environment variable prior to starting the daemon. by setting the `SERVALINSTANCE_PATH` environment variable prior to starting
This overrides all default paths. Once a daemon is running, the only way the daemon. This overrides the daemon's [standard file system
to change its instance directory is to stop it and start another daemon layout](#standard-file-system-layout). Once a daemon is running, the only
way to change its instance directory is to stop it and start another daemon
with a different value for the environment variable. with a different value for the environment variable.
* If the instance directory is not set at run time, then if **servald** was * If no [instance directory](#instance-directory) is set at run time, then if
built with the `./configure INSTANCE_PATH=DIR` option, then the **servald** **servald** was built with the `./configure INSTANCE_PATH=DIR` option, then
executable will use the instance directory in `DIR` by default. The [FHS the **servald** executable will use the instance directory in `DIR` by
paths](#fhs-paths) will never be used. default, not the [standard file system layout](#standard-file-system-layout).
* On an Android system, if none of the above are used, then **servald** will * On an Android system, if none of the above are used, then **servald** will
use the instance directory `/data/data/org.servalproject/var/serval-node` use the [instance directory](#instance-directory)
by default. The [FHS paths](#fhs-paths) will never be used. `/data/data/org.servalproject/var/serval-node`, not the [standard file
system layout](#standard-file-system-layout).
* If none of the above apply, then there is no *instance directory*. * If none of the above apply, then the daemon uses the [standard file system
Instead, [FHS paths](#fhs-paths) are used. Only one daemon can run in this layout](#standard-file-system-layout). Only one daemon can run with the
situation on the same host, since the single, common PID file will prevent standard layout on a host, since the single, common PID file will prevent
more than one being started. more than one being started.
The main use for multiple instances on a single host is for testing, and this The main use for multiple instances on a single host is for testing, and so the
is used extensively in the automated test suite. Deployments other than [instance directory](#instance-directory) is used extensively in the [automated
Android are unlikely to use an instance path, so the [FHS paths](#fhs-paths) tests][]. Environments other than Android are unlikely to use an instance
are most likely to be used in practice. path, so the [standard file system layout](#standard-file-system-layout) is
most likely to be used in most other deployments.
FHS paths File system layout
--------- ------------------
### Standard file system layout
By default, **servald** locates its files such as configuration, logs, Rhizome By default, **servald** locates its files such as configuration, logs, Rhizome
storage, etc. in accordance with the [Filesystem Heirarchy Standard][FHS] 2.3: storage, etc. in accordance with the [Filesystem Heirarchy Standard][FHS] 2.3:
@ -223,8 +245,7 @@ on the built-in defaults as overridden by configuration settings and run-time
environment variables available to the command. This command will work even if environment variables available to the command. This command will work even if
configuration is defective, so is a useful diagnostic tool. configuration is defective, so is a useful diagnostic tool.
Instance directory paths ### Instance directory
------------------------
If **servald** is started with an *instance directory*, then all configuration, If **servald** is started with an *instance directory*, then all configuration,
state, and temporary files are stored in or beneath that directory, denoted state, and temporary files are stored in or beneath that directory, denoted
@ -507,26 +528,43 @@ where:
* IN\_ADDR is an Internet address as accepted by [inet_aton(3)][], ie, * IN\_ADDR is an Internet address as accepted by [inet_aton(3)][], ie,
`N.N.N.N` where `N` is an integer in the range 0 to 255. `N.N.N.N` where `N` is an integer in the range 0 to 255.
The `match` and `file` options are mutually incompatible. If both are set, it Exactly one of the [match](#match) and [file](#file) options must be set on an
is an error; the interface rule is omitted from the configuration and interface. If neither or both are set, it is an error; the whole interface
`serval.conf` is treated as defective (see above). If neither are set, it is rule is omitted from the configuration and `serval.conf` is treated as
also an error. defective (see above).
### `match`
If a rule specifies a `match` option, then each PATTERN is applied to the names If a rule specifies a `match` option, then each PATTERN is applied to the names
of the real system interfaces using the [fnmatch(3)][] standard library of the real system interfaces using the [fnmatch(3)][] standard library
function. If any PATTERN matches, then the rule's `exclude` option is checked: function. If any PATTERN matches, then the rule's [exclude](#exclude) option
if true, then the interface is not activated, otherwise a socket on that system is checked: if true, then the interface is not activated, otherwise a socket on
interface is opened and the interface's `socket_type` is set to `dgram`. (It that system interface is opened and the interface's
is invalid to explicitly set `socket_type` to other than `dgram` for a match [socket\_type](#socket_type) is implicitly set to `dgram`. (It is invalid to
interface.) explicitly set `socket_type` to other than `dgram` for a match interface.)
If a rule specifies a `file` path, then an interface is created *if the given ### `exclude`
file exists*. The interface's `socket_type` determines how the file is written
and read:
* `file` (the default) creates a “dummy” interface for closed communication If a rule sets its a `exclude` option to *true*, then the interface will never
with other **servald** daemons on the same host -- see below. If the file be activated. This can be useful for writing negative [match](#match) rules to
does not exist, a warning is logged and the interface is not activated. exclude specific interface names before a final match-all rule.
### `file`
If a rule specifies a `file` path, then an interface is created *only if the
given file exists*. The rule's [exclude](#exclude) option is ignored. The
interface's [socket\_type](#socket_type) determines how the file is written and
read.
### `socket_type`
An interface's `socket_type` determines how the its socket file descriptor is
written and read: descriptor is written and read:
* `file` (the default) creates a [dummy interface](#dummy-interface) for
closed communication with other **servald** daemons on the same host. If
the dummy file does not exist, a warning is logged and the interface is not
activated.
* `stream` reads and writes the file as though it were a [character special * `stream` reads and writes the file as though it were a [character special
device][]. If the file does not exist, an error is logged and the device][]. If the file does not exist, an error is logged and the
@ -534,12 +572,17 @@ and read:
* `dgram` is not valid for a file interface. * `dgram` is not valid for a file interface.
The `type` option only affects the default settings the `packet_interval` and ### `type`
`mdp_tick_ms` options, for convenience. In future it may also change the way
the interface behaves, for example, an `ethernet` interface may automatically The `type` option affects the default settings of the
assume that broadcast packets will be filtered out, so will start using MDP [packet\_interval](#packet_interval) and [mdp\_tick\_ms](#mdp_tick_ms) options,
unicast protocols immediately rather than waiting to detect that broadcast for convenience. In future it may also change the way the interface behaves,
packets are not acknowledged. for example, an `ethernet` interface may automatically assume that broadcast
packets will be filtered out, so will start using MDP unicast protocols
immediately rather than waiting to detect that broadcast packets are not
acknowledged.
### `packet_interval`
The `packet_interval` option controls the maximum rate at which packets are The `packet_interval` option controls the maximum rate at which packets are
tramsmitted on the interface. It sets the *average* interval, in microseconds, tramsmitted on the interface. It sets the *average* interval, in microseconds,
@ -548,37 +591,49 @@ transmit a packet, then packets will be sent at maximum speed with no
intervening delay. Otherwise, delays are inserted between packets as needed to intervening delay. Otherwise, delays are inserted between packets as needed to
keep to the average. keep to the average.
### `mdp_tick_ms`
The `mdp_tick_ms` option controls the time interval, in milliseconds, between The `mdp_tick_ms` option controls the time interval, in milliseconds, between
MDB broadcast announcements on the interface. If set to zero, it disables MDP MDB broadcast announcements on the interface. If set to zero, it disables MDP
announcements altogether on the interface (called “tickless” mode). If not announcements altogether on the interface (called “tickless” mode). If not
set, then the value of the `mdp.iftype.IFTYPE.tick_ms` option is used. If that set, then the value of the `mdp.iftype.IFTYPE.tick_ms` option is used. If that
is not set, then **servald** uses a built-in interval that depends on the is not set, then **servald** uses a built-in interval that depends on the
IFTYPE. [type](#type).
The `encapsulation` option controls how MDP packets are written to the ### `encapsulation`
The `encapsulation` option controls how [MDP message][]s are written to the
interface's socket: interface's socket:
* `overlay` (the default) stuffs as many MDP packets as it can into each
[UDP][] frame, to avoid wasting bandwidth on conventional [Wi-Fi][] * `overlay` (the default) aggregates as many messages as possible into
interfaces which have a fixed packet size (the [IEEE 802.11][] [MTU][]) [overlay packet][]s that fit into each [UDP][] packet, in order to take
over the air; full advantage of the bandwidth on conventional [Wi-Fi][] interfaces which
* `single` sends each MDP packet on its own to the socket using [SLIP][] have a fixed packet size (the [IEEE 802.11][] [MTU][]) over the air;
* `single` sends each [MDP message][] on its own to the socket using [SLIP][]
encoding, and is suited to data links with a variable packet size on the encoding, and is suited to data links with a variable packet size on the
air (eg, a serial connection to a [packet radio][] modem). air (eg, a serial connection to a [packet radio][] modem).
The `default_route` option, if true, causes all MDP packets with an unresolved ### `default_route`
recipient address (SID) to be sent to this interface instead of just dropped.
This will allow the node to use [Serval Infrastructure][] to route its packets. The `default_route` option, if true, causes all [MDP message][]s with an
Many interfaces may have the `default_route` set to true, but only the first unresolved [recipient][] address ([SID][]) to be sent to this interface instead
one will be used as the default route. of just dropped. This will allow the node to use [Serval Infrastructure][] to
route its packets. Many interfaces may have the `default_route` set to true,
but only the first one will be used as the default route.
### `prefer_unicast`
The `prefer_unicast` option, if true, causes the interface to send to unicast The `prefer_unicast` option, if true, causes the interface to send to unicast
IP addresses instead of the broadcast IP address if both have been observed to IP addresses instead of the broadcast IP address if both have been observed to
reach the destination. reach the destination.
The `send_broadcasts` option, if false, prevents the interface from sending any ### `send_broadcasts`
broadcast packets whenever a recipient address (SID) cannot be resolved to an
interface. Normally, any MDP packet to an unresolvable recipient gets Normally, any [MDP message][] with an unresolvable [recipient][] gets broadcast
broadcast on all active interfaces. on all active interfaces. The `send_broadcasts` option, if *false*, prevents
the interface from sending any broadcast packets whenever a recipient address
(SID) cannot be resolved to an interface.
Network interface “legacy” syntax Network interface “legacy” syntax
--------------------------------- ---------------------------------
@ -620,8 +675,8 @@ eventually be deprecated and removed. The “legacy” interfaces configuration
incompatible with the modern form; an instance that uses one cannot use the incompatible with the modern form; an instance that uses one cannot use the
other. other.
Dummy network interface Dummy interface
----------------------- ---------------
Sometimes it is helpful to run an isolated group of connected **servald** Sometimes it is helpful to run an isolated group of connected **servald**
instances on a single machine for testing purposes. To make this possible, instances on a single machine for testing purposes. To make this possible,
@ -671,15 +726,23 @@ unless there is traffic explicitly sent to it).
----- -----
**Copyright 2013 Serval Project Inc.** **Copyright 2013 Serval Project Inc.**
**Copyright 2016 Flinders University**
![CC-BY-4.0](./cc-by-4.0.png) ![CC-BY-4.0](./cc-by-4.0.png)
Available under the [Creative Commons Attribution 4.0 International licence][CC BY 4.0]. Available under the [Creative Commons Attribution 4.0 International licence][CC BY 4.0].
[Serval Project]: http://www.servalproject.org/ [Serval Project]: http://www.servalproject.org/
[CC BY 4.0]: ../LICENSE-DOCUMENTATION.md [CC BY 4.0]: ../LICENSE-DOCUMENTATION.md
[Serval DNA]: ../README.md
[SID]: ./REST-API-Keyring.md#serval-id
[Serval Infrastructure]: ./Serval-Infrastructure.md [Serval Infrastructure]: ./Serval-Infrastructure.md
[Rhizome]: ./REST-API-Rhizome.md
[recipient]: ./Mesh-Datagram-Protocol.md#recipient
[MDP message]: ./Mesh-Datagram-Protocol.md#mdp-message
[overlay packet]: ./Mesh-Datagram-Protocol.md#overlay-packet
[US-ASCII]: http://en.wikipedia.org/wiki/ASCII [US-ASCII]: http://en.wikipedia.org/wiki/ASCII
[Bourne shell]: http://en.wikipedia.org/wiki/Bourne_shell [Bourne shell]: http://en.wikipedia.org/wiki/Bourne_shell
[FHS]: https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
[isspace(3)]: http://linux.die.net/man/3/isspace [isspace(3)]: http://linux.die.net/man/3/isspace
[shell wildcard]: http://www.kernel.org/doc/man-pages/online/pages/man7/glob.7.html [shell wildcard]: http://www.kernel.org/doc/man-pages/online/pages/man7/glob.7.html
[open(2)]: http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html [open(2)]: http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
@ -695,3 +758,4 @@ Available under the [Creative Commons Attribution 4.0 International licence][CC
[packet radio]: http://en.wikipedia.org/wiki/Packet_radio [packet radio]: http://en.wikipedia.org/wiki/Packet_radio
[character special device]: http://en.wikipedia.org/wiki/Device_file#Character_devices [character special device]: http://en.wikipedia.org/wiki/Device_file#Character_devices
[FHS]: https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard [FHS]: https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
[automated tests]: ./Testing.md