The Multipath TCP Daemon - mptcpd - is a daemon for Linux based
operating systems that performs multipath
TCP path
management
related operations in the user space. It interacts with the Linux
kernel through a generic netlink connection to track per-connection
information (e.g. available remote addresses), available network
interfaces, request new MPTCP subflows, handle requests for subflows,
etc.
By default, this daemon will load the addr_adv plugin, which will
add MPTCP endpoints with the subflow flag ("client" mode) for the
default in-kernel path-manager. Note that this is something
NetworkManager 1.40 or newer
does by default. Having several daemons configuring the MPTCP
endpoints at the same time should be avoided. This daemon is usually
recommended when NetworkManager 1.40 or newer is not available, or
when advanced per-connection path management is needed, using the
userspace path-manager and a custom made
plugin using
the C API.
To change this behavior, with NetworkManager, look for the
connection.mptcp-flags option in the
settings,
while for mptcpd, look at the /etc/mptcpd/mptcpd.conf config
file, or disable the service if it is not needed. Make sure not to
have both NetworkManager and mptcpd conflicting to configure the
MPTCP endpoints.
mptcpd is packaged in most major distributions:
Do not hesitate to help with the packaging.
mptcpd is built in much the same way most
Autotool-enabled
software packages are built. This includes the build approach for both
clones of the mptcpd Git repository and self-contained mptcpd
release tar archive (e.g. mptcpd-0.1.tar.gz).
Build dependencies for mptcpd vary depending on whether or not you
are building from a self-contained maintainer generated mptcpd tar
archive or from a cloned Git mptcpd repository, for example.
- Basic
mptcpdBuild Dependencies- C compiler (C99 compliant)
- Embedded Linux Library >= v0.30
- Argp library (either the GNU libc built-in or standalone)
- Linux kernel MPTCP user API headers
- pkg-config
- Additional Build Dependencies for Maintainers, and
mptcpdGit Repository Clones- GNU Autoconf
- GNU Automake
- GNU Libtool
- GNU Autoconf Archive
- Pandoc >= 2.2.1 (needed to convert
README.mdcontents from the GitHub markdown format content to plain text) - Doxygen (only needed to build documentation)
Bootstrapping the mptcpd source distribution is only necessary when
building a clone of the mptcpd Git repository for the first time, or
possibly after making modifications to the mptcpd build
infrastructure (e.g. configure Makefile, etc). There is no need
to bootstrap self-contained mptcpd releases generated by the
canonical make dist command.
Assuming all maintainer related build dependencies listed above are
installed, bootstrapping mptcpd simply requires running the
bootstrap script in the top-level source directory, e.g.:
$ ./bootstrapMove on to the common build steps below once bootstrapping is complete.
mptcpd shares the usual build procedure found in all Autotool
enabled software packages, i.e. running the configure script in the
desired build directory, and running make afterward:
./configure
makeor for an alternate build directory:
mkdir the_build
cd the_build
../configure
makeRun configure --help to list all command line build configuration
options. Further generic configuration and build details may be found
in the INSTALL file.
Unit tests included in the mptcpd source distribution may be run
like so:
./configure
make checkOnce again, these steps may be performed in an alternate build directory.
Whether or not debugging support (e.g. debug symbols) is compiled by
default into mptcpd binaries depends on how the mptcpd source was
obtained, i.e. as a cloned git repository or as a "released" tar
archive. It boils downs to the existence of a ".git" directory in
the top level mptcpd source directory. Debug symbols will be
enabled and optimization disabled by default if such a directory
exists, and vice versa if doesn't exist. The default behavior may be
overriden by using the --enable-debug configuration option:
--enable-debug=[yes/info/profile/no]
compile with debugging
The usual build flags, such as CFLAGS, LDFLAGS, etc, may be
provided on the configure script command line. See the output from
./configure --help, or the INSTALL file, for additional details.
To aid with identifying areas of the mptcpd code that are or are not
exercised by its unit tests or when deployed, mptcpd may be
instrumented for code coverage when it is built with GCC. Code
coverage reports will also require the tools gcov, lcov and
genhtml to be installed as well.
To enable mptcpd code coverage instrumentation, and generate reports
from unit tests in the top level source directory, for example, build
mptcpd like so:
./configure --enable-code-coverage
make check-code-coverageThe location of the HTML formatted code coverage results will be displayed after the report is generated.
HTML formatted code documentaton for mptcpd may be generated if
Doxygen is installed by running the doxygen-doc make target, e.g.:
./configure
make doxygen-docGenerated documentation will be placed in the doc/html directory.
PostScript and PDF formatted documentation generation is disabled by
default but may be explicitly generated using the doxygen-ps and
doxygen-pdf make targets.
Additional Doxygen based documentation generation options are
described in the configure script help output (e.g. ./configure --help).
The mptcpd source package provides the same installation related
make targets found in most GNU style and Autotool enabled software
packages. The most basic way to install mptcpd is:
make installBy default mptcpd will be installed in appropriate directories under
the directory /usr/local. Fine tuning of installation directories
may be done using several configure script command line options.
See the help output from ./configure --help as well as the INSTALL
file for details.
Super user (root) permissions may be necessary if installing into
directories owned by root.
If systemd is detected a service
file
will be installed in the appropriate location
(e.g. /lib/systemd/system). That installation directory is
independendent of the default directories mentioned above. If
necessary, the systemd service file installation directory may be
changed using the following configure script command line option.
--with-systemdsystemunitdir=DIR
Directory for systemd service files
mptcpd may be started in a number of ways depending on whether or
not systemd is used to run installed binaries, or if it is run
directly from the source tree (e.g. when debugging development
versions) without installation.
mptcpd currently does not provide traditional System V "init
scripts". In general the mptcpd program may be run directly from
the installed directory, e.g.:
/usr/bin/mptcpdHowever, it may be necessary to explicitly set the library load path
through the LD_LIBRARY_PATH environment path if mptcpd is
installed in a set of directories unknown to the dynamic linker, e.g.:
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH /usr/local/bin/mptcpdor:
# Assumes Bourne shell style environment variable assignment.
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
/usr/local/bin/mptcpdAlternatively, update the dynamic linker run-time bindings by running
ldconfig after installation
of mptcpd.
NOTE: mptcpd requires the CAP_NET_ADMIN
capability to be fully
functional. If not using the provided systemd service file
mptcp.service, the necessary capability may be
granted to mptcpd by any of the following:
- Run as
root(generally not desirable) - Run with a wrapper such as,
capsh - Attach the required capabilities to the installed
mptcpdexecutable throughsetcap
To start mptcpd immediately after installation using systemd run
the following commands:
systemctl daemon-reload
systemctl start mptcp.serviceThese steps are not necessary if the system is rebooted after
installation of mptcpd.
Since mptcpd is built with libtool support it is generally best to
execute mptcpd using libtool. For example, to run mptcpd under
the gdb debugger one could do the following, assuming mptcpd was
configured and built from the top level source directory:
./libtool --mode=execute gdb ./src/mptcpd
Further help is available through the Linux kernel MPTCP community:
- E-mail: MPTCP mailing list
- IRC: #mptcp on Libera.Chat