The Serval Project's core daemon that implements Distributed Numbering Architecture (DNA), MDP, VoMP, Rhizome, MeshMS, etc.
C Shell Java M4 C++ Assembly Other
Clone or download
Permalink
Failed to load latest commit information.
Debian/etc Improve Debian init.d script and default file Jan 24, 2013
doc Fix broken link in tech doc Apr 22, 2018
fec-3.0.1 Fix -Wsign-compare warnings: use size_t or unsigned for byte counts Dec 10, 2013
ios Add iOS Framework Bundle build Mar 6, 2018
java-api Always return null once a json parser has closed Jun 26, 2018
libsodium Merge libsodium 1.0.14 Sep 27, 2017
m4 Add Swift keyring client API with tests Mar 6, 2018
openwrt/packages/serval-dna Modify OpenWRT Makefile for development Mar 3, 2014
sqlite-amalgamation-3140200 Remove -Wimplicit-fallthrough #pragma from sqlite3.c (fixes #128) Apr 5, 2018
swift-client-api Fix calls to deprecated String.substring() method Apr 30, 2018
swift-daemon-api Add Swift daemon API, use in 'servaldswift' Mar 6, 2018
tests Rewrite json parser to encapsulate object and array parsing Jun 19, 2018
utilities Fix Markdown formatting Feb 22, 2013
win32 Allow clients to request variables for all records by passing empty did. Apr 27, 2011
.dir-locals.el Add file to set emacs variables to match the prevailing style. Jul 29, 2012
.gitignore Add iOS Framework Bundle build Mar 6, 2018
Android.mk Change Android.mk to only compile a single .a file Apr 3, 2018
CC-BY-4.0.md Add text of CC BY 4.0 license May 21, 2014
CONTRIBUTORS.md Add CONTRIBUTORS.md file, fix alternative links in README.md Dec 3, 2013
COPYRIGHT.txt Update COPYRIGHT.txt Mar 6, 2018
GPL-2.0.txt Add full text of GPL version 2.0 Dec 3, 2013
INSTALL.md Specify Apple Mac OS build dependencies in more detail (fixes #127) May 18, 2018
LICENSE-DOCUMENTATION.md Add text of CC BY 4.0 license May 21, 2014
Makefile.dbg Move debug options to Makefile.dbg so we don't have to re-run configure. Jul 29, 2012
Makefile.in pass exec_prefix to libsodium recursed make Apr 18, 2018
README.md Add iOS Framework Bundle build Mar 6, 2018
android.c Add 'cmd_cleanup' trigger Nov 14, 2016
base64.c Add FALLTHROUGH macro to silence -Wimplicit-fallthrough in GCC7 Sep 11, 2017
base64.h Updated some copyright messages and COPYRIGHT.txt Oct 13, 2016
cc-by-4.0.png Add copyright notices and CC-BY license to README.md and INSTALL.md May 20, 2014
check-in-out-return.c Uniform copyright notices Dec 4, 2013
cli.c Improve validation of keyring DID and Name (fixes #131) Mar 6, 2018
cli.h Improve validation of keyring DID and Name (fixes #131) Mar 6, 2018
cli_stdio.c Add Swift daemon API, use in 'servaldswift' Mar 6, 2018
cli_stdio.h Refactor JNI out of CLI and server main loop Oct 13, 2016
commandline.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
commandline.h Minor clean-ups Apr 4, 2018
conf.c Rewrite logging system Mar 6, 2018
conf.h Fix header files for Xcode iOS build Mar 6, 2018
conf_cli.c Fix header files for Xcode iOS build Mar 6, 2018
conf_om.c Improve config overflow message Dec 14, 2015
conf_parse.c Improve config overflow message Dec 14, 2015
conf_schema.c Use predefined constants for comparing out of range integer values May 28, 2018
conf_schema.h Improve Rhizome DB path configuration Apr 17, 2018
config.guess Update config.guess and config.sub scripts Jan 18, 2016
config.h.in Configure and build libsodium from subtree Sep 27, 2017
config.sub Update config.guess and config.sub scripts Jan 18, 2016
configure.ac Remove -Wimplicit-fallthrough #pragma from sqlite3.c (fixes #128) Apr 5, 2018
console.c Don't continuously toggle fd blocking mode Mar 30, 2016
console.h Overhaul Makefile and header files May 26, 2014
constants.h Fix header files for Xcode iOS build Mar 6, 2018
context1.c Fix compiler warning Nov 21, 2013
crypto.c Generalise deterministic key generation Nov 21, 2016
crypto.h Fix header files for Xcode iOS build Mar 6, 2018
dataformats.c Improve validation of keyring DID and Name (fixes #131) Mar 6, 2018
dataformats.h Fix header files for Xcode iOS build Mar 6, 2018
debug.h Fix header files for Xcode iOS build Mar 6, 2018
directory_client.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
directory_service.c Use config.h instead of -DHAVE_FOO=1 Oct 19, 2016
dna_helper.c Use explicit serverMode enum values everywhere Jun 1, 2018
echo_cli.c Switch to feature-driven linking Oct 18, 2016
fakeradio.c Rewrite logging system Mar 6, 2018
fdqueue.c Fix header files for Xcode iOS build Mar 6, 2018
fdqueue.h Fix header files for Xcode iOS build Mar 6, 2018
feature.h Switch to feature-driven linking Oct 18, 2016
fifo.h Fix header files for Xcode iOS build Mar 6, 2018
golay.c Refactor to fix some OS-X compile warnings Aug 14, 2014
golay.h Uniform #ifdef __SERVAL_DNA__... for headers Dec 4, 2013
headerfiles.mk Remove duplicate log.h definition in headerfiles.mk Apr 30, 2018
http_server.c Add 'Location' header to HTTP server 301 and 302 responses Mar 19, 2018
http_server.h Add 'Location' header to HTTP server 301 and 302 responses Mar 19, 2018
httpd.c Fix header files for Xcode iOS build Mar 6, 2018
httpd.h Add Route REST API (fixes #96) Mar 29, 2018
idebug.h Fix header files for Xcode iOS build Mar 6, 2018
install-sh Artefacts created by libtoolize -c -i Sep 12, 2012
instance.c Improve Rhizome DB path configuration Apr 17, 2018
instance.h Improve Rhizome DB path configuration Apr 17, 2018
jni_commandline.c Link java api into shared library by specifying features Apr 3, 2018
jni_common.c Refactor JNI out of CLI and server main loop Oct 13, 2016
jni_common.h Use config.h instead of -DHAVE_FOO=1 Oct 19, 2016
jni_server.c Link java api into shared library by specifying features Apr 3, 2018
keyring.c Add more assertions to keyring functions May 17, 2018
keyring.h Add more assertions to keyring functions May 17, 2018
keyring_cli.c Add more assertions to keyring functions May 17, 2018
keyring_restful.c Fix response of PUT /restful/keyring/SID/lock (fixes #139) May 17, 2018
lang.h Fix header files for Xcode iOS build Mar 6, 2018
limit.c Move rate limit code to separate file May 12, 2014
limit.h Fix header files for Xcode iOS build Mar 6, 2018
log.c Fix use of va_copy() in logging functions May 7, 2018
log.h Rewrite logging system Mar 6, 2018
log_cli.c Rewrite logging system Mar 6, 2018
log_context.c Add log_context Jun 29, 2015
log_inline.c Rewrite logging system Mar 6, 2018
log_output.h Rewrite logging system Mar 6, 2018
log_output_android.c Remove dump_config from android specific code Mar 26, 2018
log_output_console.c Rewrite logging system Mar 6, 2018
log_output_delegate.c Don't allow a delegate log to be opened if it isn't used Mar 28, 2018
log_output_delegate.h Add Swift daemon API, use in 'servaldswift' Mar 6, 2018
log_output_file.c Rewrite logging system Mar 6, 2018
log_prolog.h Rewrite logging system Mar 6, 2018
log_stderr.c Replace cf_on_config_change() with "config_change" trigger Oct 18, 2016
log_util.c Fix a bug in debug hexdumps Mar 9, 2018
lsif.c Fix header files for Xcode iOS build Mar 6, 2018
ltmain.sh Artefacts created by libtoolize -c -i Sep 12, 2012
macconfig Fixed broadcast address discovery to work on Mac. Aug 8, 2011
main.c Add Swift 3/4 'servaldswift' executable Mar 6, 2018
mdp_client.c Improve MDP request debug logging Mar 6, 2018
mdp_client.h Add MDP_INTERFACE_PEER for external unicast peer discovery to trigger… May 15, 2018
mdp_filter.c Use explicit serverMode enum values everywhere Jun 1, 2018
mdp_services.h Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
mem.c Add restful API's for follow and ignore Apr 19, 2017
mem.h Add restful API's for follow and ignore Apr 19, 2017
meshmb.c Don't fail in meshmb if we re-create the same index payload Jun 26, 2018
meshmb.h Fix header files for Xcode iOS build Mar 6, 2018
meshmb_cli.c Allow following a feed that isn't in rhizome yet, and override the di… Jun 20, 2017
meshmb_restful.c Use config to set and remember rhizome database location Apr 10, 2018
meshms.c Clean up a number of memory leaks, as revealed by clang's sanitiser Sep 11, 2017
meshms.h Fix header files for Xcode iOS build Mar 6, 2018
meshms_cli.c Fix header files for Xcode iOS build Mar 6, 2018
meshms_restful.c Fix header files for Xcode iOS build Mar 6, 2018
meshpotato_build Assorted unknown changes. Updated Makefile.in etc to properly build s… Jun 15, 2011
message_ply.c Fix header files for Xcode iOS build Mar 6, 2018
message_ply.h Ack the senders ply and thread into activity feed May 10, 2017
module.modulemap Add Swift daemon API, use in 'servaldswift' Mar 6, 2018
monitor-cli.c Rewrite logging system Mar 6, 2018
monitor-client.c Fix header files for Xcode iOS build Mar 6, 2018
monitor-client.h Uniform #ifdef __SERVAL_DNA__... for headers Dec 4, 2013
monitor.c Use explicit serverMode enum values everywhere Jun 1, 2018
mpbuild Added mesh potato build script. Aug 10, 2011
msp_client.c Add API for msp from within the daemon May 9, 2016
msp_client.h Add API for msp from within the daemon May 9, 2016
msp_common.h Fix header files for Xcode iOS build Mar 6, 2018
msp_proxy.c Switch to feature-driven linking Oct 18, 2016
msp_server.c Lower mdp qos priority of new rhizome sync, bias bundles with no reac… May 10, 2016
msp_server.h Lower mdp qos priority of new rhizome sync, bias bundles with no reac… May 10, 2016
net.c Absorb ENOTRECOVERABLE in read_nonblock() Sep 6, 2016
net.h Use config.h instead of -DHAVE_FOO=1 Oct 19, 2016
network_cli.c Fix header files for Xcode iOS build Mar 6, 2018
nibble_tree.c Add missing include for bzero Apr 3, 2018
nibble_tree.h Add nibble-tree iterator Mar 29, 2018
numeric_str.c Updated some copyright messages and COPYRIGHT.txt Oct 13, 2016
numeric_str.h Updated some copyright messages and COPYRIGHT.txt Oct 13, 2016
os.c Fallback to streaming bytes when rename() fails due to crossing files… May 22, 2018
os.h Improve get_self_executable_path() on Mac OS Apr 30, 2018
overlay_address.c Use explicit serverMode enum values everywhere Jun 1, 2018
overlay_address.h Add Route REST API (fixes #96) Mar 29, 2018
overlay_buffer.c Fix a bug in MDP_IDENTITY request handling Mar 9, 2018
overlay_buffer.h Switch to feature-driven linking Oct 18, 2016
overlay_interface.c Use explicit serverMode enum values everywhere Jun 1, 2018
overlay_interface.h Keep AF_UNIX and file-based interfaces up whenever config re-loads Apr 5, 2018
overlay_link.c Keep AF_UNIX and file-based interfaces up whenever config re-loads Apr 5, 2018
overlay_mdp.c Use explicit serverMode enum values everywhere Jun 1, 2018
overlay_mdp_dnalookup.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
overlay_mdp_echo.c Switch to feature-driven linking Oct 18, 2016
overlay_mdp_keymaprequest.c Send route change when we detect a peer has a combined key Nov 16, 2017
overlay_mdp_rhizome.c Fix header files for Xcode iOS build Mar 6, 2018
overlay_mdp_trace.c Report the state of each network interface in routing table Oct 20, 2016
overlay_olsr.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
overlay_packet.h Tweak structure initialisation to avoid old gcc warnings Jun 28, 2017
overlay_packetformats.c Fix header files for Xcode iOS build Mar 6, 2018
overlay_packetradio.c Fix header files for Xcode iOS build Mar 6, 2018
overlay_payload.c Allow for different routes per packet destination Sep 23, 2014
overlay_probe.c Fix header files for Xcode iOS build Mar 6, 2018
overlay_queue.c Fix header files for Xcode iOS build Mar 6, 2018
overlay_stun.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
overlay_stunreq.c Fix header files for Xcode iOS build Mar 6, 2018
performance_timing.c Fix header files for Xcode iOS build Mar 6, 2018
radio_link.c Fix header files for Xcode iOS build Mar 6, 2018
radio_link.h Uniform #ifdef __SERVAL_DNA__... for headers Dec 4, 2013
rhizome.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome.h Move Rhizome function declaration from server.h to rhizome.h and rename Jun 1, 2018
rhizome_bundle.c Fix header files for Xcode iOS build Mar 6, 2018
rhizome_cli.c Improve Rhizome DB path configuration Apr 17, 2018
rhizome_crypto.c Fix header files for Xcode iOS build Mar 6, 2018
rhizome_database.c Use explicit serverMode enum values everywhere Jun 1, 2018
rhizome_direct.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome_direct_cli.c Clean up a number of memory leaks, as revealed by clang's sanitiser Sep 11, 2017
rhizome_direct_http.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome_fetch.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
rhizome_http.c Improve HTTP Content-Type handling Oct 19, 2017
rhizome_packetformats.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome_restful.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome_store.c Improve Rhizome DB path configuration Apr 17, 2018
rhizome_sync.c Use config to set and remember rhizome database location Apr 10, 2018
rhizome_sync_keys.c Keep rhizome sync state for up to 5s while routes flap May 14, 2018
rhizome_types.h Fix header files for Xcode iOS build Mar 6, 2018
rotbuf.c Fix bug in rotbuf_next_chunk() when rotation == 0 May 15, 2013
rotbuf.h Remove spurious rotbuf_log() declaration, fixes #75 Apr 3, 2014
route_link.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
route_link.h Fix header files for Xcode iOS build Mar 6, 2018
route_restful.c Add Route Java API Apr 5, 2018
section.h Rename "features.h" to "lang.h" Oct 18, 2016
serval.h Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
serval_packetvisualise.c Compile without warnings with android ndk 15 beta 2 Jun 6, 2017
serval_types.h Fix header files for Xcode iOS build Mar 6, 2018
serval_uuid.c Fix header files for Xcode iOS build Mar 6, 2018
serval_uuid.h Improve Rhizome DB path configuration Apr 17, 2018
servald_features.c Minor clean-ups Apr 4, 2018
servald_jni_features.c Link java api into shared library by specifying features Apr 3, 2018
servald_main.c Reduce coupling with console, dna_helper, monitor & directory_client … Apr 3, 2018
servald_main.h Add Swift 3/4 'servaldswift' executable Mar 6, 2018
servaldswift.swift Add Swift daemon API, use in 'servaldswift' Mar 6, 2018
servalwrap.c Clean up some more warnings Nov 21, 2016
server.c Use explicit serverMode enum values everywhere Jun 1, 2018
server.h Add comments and assertions to server.h and server.c Jun 1, 2018
server_httpd.c Set Content-Type in static file HTTP responses Oct 19, 2017
sighandlers.c Switch to feature-driven linking Oct 18, 2016
sighandlers.h Overhaul Makefile and header files May 26, 2014
simulator.c Fix header files for Xcode iOS build Mar 6, 2018
simulator.h Create new AF_UNIX based network simulator May 23, 2014
socket.c Improve Rhizome DB path configuration Apr 17, 2018
socket.h Refactor dns lookups to reuse the code Jul 11, 2017
sourcefiles.mk Move nibble_tree.c into client library Apr 24, 2018
str.c Fix header files for Xcode iOS build Mar 6, 2018
str.h Add str_endswith() and strcase_endswith() Oct 19, 2017
strbuf.c Optimise strbuf_ncat() Nov 16, 2015
strbuf.h Fix compile error in strbuf_local_buf() with CFLAGS=-g Mar 6, 2018
strbuf_helpers.c remove C99-ism Apr 18, 2018
strbuf_helpers.h Add strbuf_json_integer() Mar 29, 2018
strlcpy.c Fix strlcpy.c compile error on OS X Nov 9, 2016
strlcpy.h Use config.h instead of -DHAVE_FOO=1 Oct 19, 2016
sync_keys.c Fix freeing peer state (Issue #121) May 10, 2017
sync_keys.h Fix header files for Xcode iOS build Mar 6, 2018
test_cli.c Add nibble-tree iterator Mar 29, 2018
test_features.c Link java api into shared library by specifying features Apr 3, 2018
testconfig.sh.in Add Swift keyring client API with tests Mar 6, 2018
testdefs.sh Replace netcat6 with OpenBSD netcat Apr 27, 2018
testdefs_java.sh Fix the $JAVAC conditional in tests/all Mar 6, 2018
testdefs_meshms.sh Reduce redundant reading of message ply's Aug 23, 2016
testdefs_rest.sh Refactor routing and Swift test set-up Apr 8, 2018
testdefs_rhizome.sh Improve Rhizome DB path configuration Apr 17, 2018
testdefs_routing.sh Refactor routing and Swift test set-up Apr 8, 2018
testdefs_swift.sh Refactor routing and Swift test set-up Apr 8, 2018
testframework.sh Replace netcat6 with OpenBSD netcat Apr 27, 2018
testnacl.c Swap from included nacl to host libsodium May 9, 2016
tfw_createfile.c Fix tfw_createfile utility Mar 29, 2018
timeit.c add context switching speed test to "test memory" command. Oct 22, 2013
trigger.h Remove terminating semicolons from within macros Nov 1, 2015
uri.c Clean up some more warnings Nov 21, 2016
uri.h Updated some copyright messages and COPYRIGHT.txt Oct 13, 2016
version_cli.c Switch to feature-driven linking Oct 18, 2016
version_servald.c Rewrite logging system Mar 6, 2018
version_servald.h Switch to feature-driven linking Oct 18, 2016
version_string.sh Don't depend on .git folders or on error text strings Dec 12, 2014
vomp.c Fix header files for Xcode iOS build Mar 6, 2018
vomp_console.c Rewrite logging system Mar 6, 2018
whence.c Add alloca_sourceloc(), refactored from log.c Jun 29, 2015
whence.h Rewrite logging system Mar 6, 2018
xprintf.c Fix use of va_copy() in logging functions May 7, 2018
xprintf.h Rewrite logging system Mar 6, 2018

README.md

Serval DNA

Serval Project, September 2017

Serval DNA is the core component of the Serval Mesh app for Android and the Serval Mesh Extender long-range mesh networking device. It is a daemon process that performs all the central services of the Serval mesh network such as dynamic routing, encryption and authentication, file distribution, messaging, and voice telephony.

Any device with Wi-Fi connectivity that runs the Serval DNA daemon can participate in the Serval mesh network.

Download, build and test

  • INSTALL.md contains instructions for downloading, building and testing Serval DNA on Linux, Mac OS-X, and similar platforms

  • Notes for Developers contains useful information for developers of Serval DNA, which may also help resolve build issues

Configuration

Documentation

Bugs and issues

Bugs can be reported and inspected using the GitHub issue tracker.

What is in this repository?

This repository contains:

The servald executable is a multi-purpose program that can be invoked directly from the command line, run as a daemon process, or invoked via JNI from within a Java program or via the [Swift module][] from within a Swift program. The servald executable is really many commands built into one; the command-line arguments select which command to run. Some commands are stand-alone utilities, some start and stop the servald daemon process, some communicate with the servald daemon as an MDP client, and others via a two-way pipe called the monitor interface.

The following protocols and services are implemented in servald:

  • The Distributed Numbering Architecture (DNA) is the key innovation that makes mesh telephony viable in the absence of any infrastructure, eg, in the aftermath of a natural disaster or in remote locations. DNA is a protocol carried over MDP (see below) that asks many devices at once if they will answer a phone number (DID). A device will respond with its own subscriber identity (SID) if its user has “claimed” that DID. This allows phone calls to be established over the mesh using conventional phone numbers.

  • The Serval Keyring is a flat file containing all the user identities on a single device. Each identity is a set of elliptic curve secret cryptographic keys that belong to a single “mesh subscriber”, indexed by the subscriber's 256-bit public key, called a SID. Each identity in the keyring is locked by its own user-chosen password (called a PIN in the code and documentation), using elliptic curve cryptography to protect locked entries from theft or tampering, and steganography to allow the user to plausibly deny the existence of locked identities.

  • The Mesh Datagram Protocol (MDP) is Serval's own layer 3 protocol designed for secure mesh networking. It is completely independent of Internet protocols such as IP and UDP, although for the time being it is implemented as an “overlay” network based on UDP/IP because that is the interface that Linux and other operating systems provide for sending data over Wi-Fi. However, MDP could easily be implemented directly over a layer 2 data link such as Wi-Fi or Ethernet MAC. MDP uses subscribers' public keys (SID) as source and destination addresses, has a 32-bit port number analogous to the 16-bit port number used in TCP/IP, and encrypts all packet contents by default, using the public key (SID) of the destination.

  • The Voice over Mesh Protocol (VoMP) is Serval's own call negotiation and two-way audio streaming protocol used to implement mesh voice calls. It fills the same role as SIP/RTS, the dominant protocol used for Voice over Internet Protocol, but VoMP is designed for the variable and unstable conditions of wireless mesh networks. VoMP's session state model and signalling can handle packet loss, mid-call re-routing and re-connection where SIP would fail. VoMP's audio streaming can encapsulate many codecs and even DTMF (dialpad button) signalling.

  • Rhizome is a content storage and distribution service implemented using SQLite and a content-exchange protocol based on MDP. It can be used to disseminate content like images, videos, documents, software upgrades, etc. Each piece of content in Rhizome is called a “bundle”, which has two parts: a manifest that describes the content, and the payload, which is the content itself. Each bundle has its own unique cryptographic identifier that allows any recipient to verify that it has not been tampered with. A bundle's payload may be encrypted by the author so that only the designated recipient can read it.

  • The MeshMS messaging service sends short text messages using Rhizome as its transport. Each message thread is stored and carried in a pair of journal bundles, one for each direction (ply).

  • Serval Infrastructure services may optionally be deployed on any devices in the mesh to expose external services to mesh subscribers and vice versa (eg, VoIP gateways, SMS satellite links, packetised web), and to overcome scalability limitations of a perfectly decentralised mesh (eg, central telephone directory). Serval Infrastructure is implemented as a daemon with its own executable called directory_service.

Copyright and licensing

Serval DNA is free software produced by the Serval Project and many contributors. Its source code is licensed to the public under the GNU General Public License version 2. Its technical documentation is licensed to the public under the Creative Commons Attribution 4.0 International licence. All source code and technical documentation is freely available from the Serval Project's serval-dna Git repository on GitHub.

The copyright in most of the source code in Serval DNA is held by Serval Project Inc., a not-for-profit association incorporated in the state of South Australia in the Commonwealth of Australia for the purpose of developing the Serval mesh software. The COPYRIGHT file contains a full list of all those who hold copyright in portions of the Serval DNA source code.

The Serval Project will accept contributions for which copyright has been assigned to Serval Project Inc., or which are licensed to either Serval Project Inc. or to the public on terms that allow the Serval Project to freely redistribute and re-license the code under non-restrictive terms, for example, to release Serval DNA as part of a product distributed through the Apple app store.

Individual developers may assign copyright in their contributions by signing the Serval Project Developer Agreement - Individual, and organisations by signing the Serval Project Developer Agreement - Entity.


Copyright 2015 Serval Project Inc.
Copyright 2016-2017 Flinders University
CC-BY-4.0 This document is available under the Creative Commons Attribution 4.0 International licence.