Kodo is a high-performance erasure coding library with a special focus on
network coding algorithms and codecs. Kodo is written in C++ and
it was designed to ensure high performance, testability, flexibility and
extendability.

The Kodo libraries expose a simple Application Programming Interface (API)
which allows a programmer to take advantage of network coding in a
custom application. Kodo supports various network coding codecs, e.g. standard
Random Linear Network Coding (RLNC), Systematic RLNC, Sparse RLNC.
Each algorithm offers unique advantages and drawbacks as well as a different
set of parameters that can be tuned in real time. For example, this can
be employed to adapt to varying cellular channels, to change the amount of
redundancy in a distributed storage network, or to adapt to node failures in
meshed networks.

Kodo is available under a research- and education-friendly license, and
it enables researchers to implement new codes and algorithms,
perform simulations, and benchmark the coding operations on any platform
where a modern C++ compiler is available. The library provides a multitude of
building blocks and parameters that can be combined to create custom codes.

The Kodo libraries implement various codecs and each codec has its own git
repository. As a first step, it is recommended to choose a single codec/project
and work with the API that is exposed by that project.

Note that these repositories are private on Github, so you need to complete
all steps in the Getting Started guide before you can access them.

This project implements a standard RLNC codec and provides
a simple, high-level C++ API which is the the recommended starting
option for most users. The RLNC codec has a number of parameters that
can be configured to fit the user requirements: e.g. the code density
can be adjusted and the coding vector representation can include the
full vector or just a random seed to reduce overhead.

The Fulcrum network codes use a concatenated code structure with an “outer”
and “inner” code. They provide an end-to-end performance that is close
to that of a large field size network coding system for high–end receivers,
while simultaneously catering to low–end ones that can only decode in GF(2).
For a detailed description of the Fulcrum codec, see the following
paper by Lucani et. al.

Perpetual RLNC is a sparse and structured code where the non-zero coding
coefficients are localized to a specific part of the coding vector.
The width of this non-zero part is analogous to the density parameter of
random sparse codes. This approach allows for structured decoding, which
can yield a substantially higher throughput than random sparse codes,
especially for large generation sizes.

The kodo-core repository contains general erasure coding components that
are used by the other codec implementations that are listed above.
This project also includes a carousel code (or repetition code) where
the data is simply transmitted in a round-robin fashion. This code can
be useful for simulation and testing purposes.

This library provides high-level Python bindings for Kodo. The simple
examples demonstrate how to use the basic functionality of Kodo through
the Python API. This option is recommended for Python-based projects
and for programmers who are not familiar with C++.

The kodo-rlnc-c library provides a simple C API that allows the programmer
to use kodo-rlnc in a C program. The C API also enables interoperability
with other programming languages that are not directly supported by the
Kodo libraries.

The kodo-c library is a deprecated project that was created to
provide a C wrapper over some earlier implementation of our RLNC codecs.
This project will not be updated, please use kodo-rlnc-c if a C wrapper
is needed.

The kodo-cpp library is a deprecated project that was
designed as a high-level C++ wrapper over kodo-c and it only exposed
a limited API to access the Kodo codecs. This project will not be updated,
please use kodo-rlnc that provides a complete C++ API.

The following generic features are available in the various Kodo libraries.

Recoding

One of the most prominent features of Network Coding is the
possibility to use coding at the intermediate network nodes
(recoding) and not only at the sender (encoding) and the receiver
(decoding).

Systematic coding

The sender can send some or all of the original symbols within a
given block uncoded. Coded packets can be generated later to repair
any packet losses. Systematic coding is useful in simple topologies
as it increases the decoding throughput and decreases the coding
overhead.

On-the-fly coding

The sender can encode over a growing block of data. This is useful
for live content where the data becomes available over time,
potentially at a variable rate.

Partial decoding

The receiver can decode some of the original symbols before the
entire data block is decoded. This approach is more compatible with
error-resilient codecs (video, audio) as instead of receiving the
whole data block or nothing, a partial data block can be retrieved.

Real-time adjustable density

The density at the sender can be adjusted in real time which permits
adaptation to changing network conditions.

File encoder

The sender can directly encode data files that are automatically split
into generations.

Zero-copy API

The encoder and decoder can operate directly on user provided buffers,
eliminating the need for costly copy operations.

Kodo is portable to a wide range of platforms (both hardware platforms and
operating systems).

We ensure compatibility with the supported platforms through a suite of unit
tests, the current status can be checked at the Steinwurf Buildbot page.
At the bottom of the main page, you can find detailed information
about which platforms and compilers are currently tested by Steinwurf.

Note

The Buildbot is used for several different libraries. The
various Kodo libraries can be found in the overview on the main page.

One of the initial reasons for building Kodo was to make a tool for doing
research on erasure correcting codes with a specific focus on network
codes. So if you have used or plan to use Kodo for your research, we would
love to hear about it!

If you are doing a publication using Kodo, all we ask is that you cite our
work. Find the pdf and bibtex of the initial Kodo paper here.