aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rw-r--r--README4
-rwxr-xr-xbootstrap5
-rw-r--r--configure.ac6
-rw-r--r--contrib/Makefile.am15
-rw-r--r--contrib/packages/guix/gnunet-doc.scm14
-rw-r--r--contrib/packages/guix/gnunet.scm14
-rw-r--r--contrib/packages/guix/guix-env.scm1
-rw-r--r--contrib/packages/guix/packages/gnunet/packages/gnunet.scm4
-rw-r--r--doc/.gitignore11
-rw-r--r--doc/Makefile.am227
-rw-r--r--doc/README.txt42
-rw-r--r--doc/chapters/developer.texi7487
-rw-r--r--doc/chapters/installation.texi3625
-rw-r--r--doc/chapters/user.texi1819
-rw-r--r--doc/documentation/Makefile.am227
-rw-r--r--doc/documentation/README.txt69
-rw-r--r--doc/documentation/chapters/configuration.texi5
-rw-r--r--doc/documentation/chapters/developer.texi8304
-rw-r--r--doc/documentation/chapters/installation.texi3995
-rw-r--r--doc/documentation/chapters/philosophy.texi (renamed from doc/chapters/philosophy.texi)312
-rw-r--r--doc/documentation/chapters/user.texi2009
-rw-r--r--doc/documentation/chapters/vocabulary.texi57
-rw-r--r--doc/documentation/docstyle.css76
-rw-r--r--doc/documentation/fdl-1.3.texi (renamed from doc/fdl-1.3.texi)0
-rwxr-xr-xdoc/documentation/gendocs.sh504
-rw-r--r--doc/documentation/gendocs_template91
-rw-r--r--doc/documentation/gendocs_template_min93
-rw-r--r--doc/documentation/gnunet-c-tutorial.texi (renamed from doc/gnunet-c-tutorial.texi)826
-rw-r--r--doc/documentation/gnunet.texi (renamed from doc/gnunet.texi)129
-rw-r--r--doc/documentation/gpl-3.0.texi (renamed from doc/gpl-3.0.texi)0
-rw-r--r--doc/documentation/htmlxref.cnf668
-rw-r--r--doc/documentation/images/daemon_lego_block.png (renamed from doc/images/daemon_lego_block.png)bin7636 -> 7636 bytes
-rw-r--r--doc/documentation/images/daemon_lego_block.svg (renamed from doc/images/daemon_lego_block.svg)0
-rw-r--r--doc/documentation/images/gnunet-0-10-peerinfo.png (renamed from doc/images/gnunet-0-10-peerinfo.png)bin80127 -> 80127 bytes
-rw-r--r--doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png (renamed from doc/images/gnunet-fs-gtk-0-10-star-tab.png)bin63464 -> 63464 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-download-area.png (renamed from doc/images/gnunet-gtk-0-10-download-area.png)bin7634 -> 7634 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-menu.png (renamed from doc/images/gnunet-gtk-0-10-fs-menu.png)bin8614 -> 8614 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png (renamed from doc/images/gnunet-gtk-0-10-fs-publish-editing.png)bin55507 -> 55507 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png (renamed from doc/images/gnunet-gtk-0-10-fs-publish-select.png)bin43448 -> 43448 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png (renamed from doc/images/gnunet-gtk-0-10-fs-publish-with-file.png)bin27371 -> 27371 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file_0.png (renamed from doc/images/gnunet-gtk-0-10-fs-publish-with-file_0.png)bin27371 -> 27371 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish.png (renamed from doc/images/gnunet-gtk-0-10-fs-publish.png)bin26496 -> 26496 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-published.png (renamed from doc/images/gnunet-gtk-0-10-fs-published.png)bin59635 -> 59635 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-search.png (renamed from doc/images/gnunet-gtk-0-10-fs-search.png)bin72151 -> 72151 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs.png (renamed from doc/images/gnunet-gtk-0-10-fs.png)bin55706 -> 55706 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png (renamed from doc/images/gnunet-gtk-0-10-gns-a-done.png)bin30880 -> 30880 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns-a.png (renamed from doc/images/gnunet-gtk-0-10-gns-a.png)bin29895 -> 29895 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns.png (renamed from doc/images/gnunet-gtk-0-10-gns.png)bin63783 -> 63783 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-identity.png (renamed from doc/images/gnunet-gtk-0-10-identity.png)bin62404 -> 62404 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-search-selected.png (renamed from doc/images/gnunet-gtk-0-10-search-selected.png)bin104599 -> 104599 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-traffic.png (renamed from doc/images/gnunet-gtk-0-10-traffic.png)bin68515 -> 68515 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10.png (renamed from doc/images/gnunet-gtk-0-10.png)bin72897 -> 72897 bytes
-rw-r--r--doc/documentation/images/gnunet-namestore-gtk-phone.png (renamed from doc/images/gnunet-namestore-gtk-phone.png)bin32631 -> 32631 bytes
-rw-r--r--doc/documentation/images/gnunet-namestore-gtk-vpn.png (renamed from doc/images/gnunet-namestore-gtk-vpn.png)bin35836 -> 35836 bytes
-rw-r--r--doc/documentation/images/gnunet-setup-exit.png (renamed from doc/images/gnunet-setup-exit.png)bin30062 -> 30062 bytes
-rw-r--r--doc/documentation/images/gnunet-tutorial-service.png (renamed from doc/images/gnunet-tutorial-service.png)bin40142 -> 40142 bytes
-rw-r--r--doc/documentation/images/gnunet-tutorial-system.png (renamed from doc/images/gnunet-tutorial-system.png)bin46982 -> 46982 bytes
-rw-r--r--doc/documentation/images/iceweasel-preferences.png (renamed from doc/images/iceweasel-preferences.png)bin57047 -> 57047 bytes
-rw-r--r--doc/documentation/images/iceweasel-proxy.png (renamed from doc/images/iceweasel-proxy.png)bin38773 -> 38773 bytes
-rw-r--r--doc/documentation/images/lego_stack.svg (renamed from doc/images/lego_stack.svg)0
-rw-r--r--doc/documentation/images/service_lego_block.png (renamed from doc/images/service_lego_block.png)bin15157 -> 15157 bytes
-rw-r--r--doc/documentation/images/service_lego_block.svg (renamed from doc/images/service_lego_block.svg)0
-rw-r--r--doc/documentation/images/service_stack.png (renamed from doc/images/service_stack.png)bin18862 -> 18862 bytes
-rw-r--r--doc/documentation/images/structure.dot (renamed from doc/images/structure.dot)0
-rw-r--r--doc/documentation/index.html31
-rwxr-xr-xdoc/documentation/run-gendocs.sh18
-rw-r--r--doc/documentation/testbed_test.c (renamed from doc/testbed_test.c)0
-rw-r--r--doc/documentation/tutorial-examples/001.c (renamed from doc/tutorial-examples/001.c)0
-rw-r--r--doc/documentation/tutorial-examples/002.c (renamed from doc/tutorial-examples/002.c)0
-rw-r--r--doc/documentation/tutorial-examples/003.c11
-rw-r--r--doc/documentation/tutorial-examples/004.c (renamed from doc/tutorial-examples/004.c)0
-rw-r--r--doc/documentation/tutorial-examples/005.c (renamed from doc/tutorial-examples/005.c)0
-rw-r--r--doc/documentation/tutorial-examples/006.c (renamed from doc/tutorial-examples/006.c)0
-rw-r--r--doc/documentation/tutorial-examples/007.c (renamed from doc/tutorial-examples/007.c)0
-rw-r--r--doc/documentation/tutorial-examples/008.c (renamed from doc/tutorial-examples/008.c)0
-rw-r--r--doc/documentation/tutorial-examples/009.c (renamed from doc/tutorial-examples/009.c)0
-rw-r--r--doc/documentation/tutorial-examples/010.c (renamed from doc/tutorial-examples/010.c)0
-rw-r--r--doc/documentation/tutorial-examples/011.c (renamed from doc/tutorial-examples/011.c)0
-rw-r--r--doc/documentation/tutorial-examples/012.c (renamed from doc/tutorial-examples/012.c)0
-rw-r--r--doc/documentation/tutorial-examples/013.1.c3
-rw-r--r--doc/documentation/tutorial-examples/013.c (renamed from doc/tutorial-examples/013.c)0
-rw-r--r--doc/documentation/tutorial-examples/014.c (renamed from doc/tutorial-examples/014.c)0
-rw-r--r--doc/documentation/tutorial-examples/015.c (renamed from doc/tutorial-examples/015.c)0
-rw-r--r--doc/documentation/tutorial-examples/016.c (renamed from doc/tutorial-examples/016.c)3
-rw-r--r--doc/documentation/tutorial-examples/017.c4
-rw-r--r--doc/documentation/tutorial-examples/018.c (renamed from doc/tutorial-examples/018.c)0
-rw-r--r--doc/documentation/tutorial-examples/019.c (renamed from doc/tutorial-examples/019.c)7
-rw-r--r--doc/documentation/tutorial-examples/020.c (renamed from doc/tutorial-examples/020.c)3
-rw-r--r--doc/documentation/tutorial-examples/021.c (renamed from doc/tutorial-examples/021.c)0
-rw-r--r--doc/documentation/tutorial-examples/022.c (renamed from doc/tutorial-examples/022.c)0
-rw-r--r--doc/documentation/tutorial-examples/023.c (renamed from doc/tutorial-examples/023.c)0
-rw-r--r--doc/documentation/tutorial-examples/024.c (renamed from doc/tutorial-examples/024.c)0
-rw-r--r--doc/documentation/tutorial-examples/025.c (renamed from doc/tutorial-examples/025.c)0
-rw-r--r--doc/documentation/tutorial-examples/026.c (renamed from doc/tutorial-examples/026.c)0
-rw-r--r--doc/hacks.el17
-rw-r--r--doc/tutorial-examples/003.c7
-rw-r--r--doc/tutorial-examples/017.c3
-rw-r--r--src/arm/Makefile.am3
-rw-r--r--src/dht/Makefile.am3
-rw-r--r--src/include/gnunet_scheduler_lib.h16
-rw-r--r--src/integration-tests/Makefile.am3
-rw-r--r--src/statistics/Makefile.am3
-rw-r--r--src/util/scheduler.c48
104 files changed, 17113 insertions, 13711 deletions
diff --git a/AUTHORS b/AUTHORS
index b4ff5b571..e49319ac0 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -32,7 +32,6 @@ Werner Koch <wk@gnupg.org>
32Contributions also came from: 32Contributions also came from:
33Adam Warrington [ UPnP ] 33Adam Warrington [ UPnP ]
34Adriano Peluso [ Documentation export to Texinfo ] 34Adriano Peluso [ Documentation export to Texinfo ]
35ng0 <ng0@infotropique.org> [ Documentation export to Texinfo ]
36Alex Harper [ OS X CPU load ] 35Alex Harper [ OS X CPU load ]
37Andrew McDonald <andrew@mcdonald.org.uk> [ SHA-512] 36Andrew McDonald <andrew@mcdonald.org.uk> [ SHA-512]
38Andy Green <andy@warmcat.com> 37Andy Green <andy@warmcat.com>
@@ -69,6 +68,7 @@ Marko Räihä
69Michael John Wensley <michael@wensley.org.uk> 68Michael John Wensley <michael@wensley.org.uk>
70Milan Bouchet-Valat <nalimilan@club.fr> 69Milan Bouchet-Valat <nalimilan@club.fr>
71Nathan Evans <evans@net.in.tum.de> 70Nathan Evans <evans@net.in.tum.de>
71ng0 <ng0@infotropique.org> [ Documentation export to Texinfo ]
72Paul Ruth <ruth@cs.purdue.edu> 72Paul Ruth <ruth@cs.purdue.edu>
73Philipp Tölke <toelke@in.tum.de>, <pt@philipptoelke.de> 73Philipp Tölke <toelke@in.tum.de>, <pt@philipptoelke.de>
74Renaldo Ferreira <rf@cs.purdue.edu> 74Renaldo Ferreira <rf@cs.purdue.edu>
diff --git a/README b/README
index 30ebf5f4f..db64bc17a 100644
--- a/README
+++ b/README
@@ -51,7 +51,7 @@ These are the direct dependencies for running GNUnet:
51- Texinfo >= 5.2 51- Texinfo >= 5.2
52- libglpk >= 4.45 (optional for experimental code) 52- libglpk >= 4.45 (optional for experimental code)
53 53
54Recommended autotools for compiling the SVN version are: 54Recommended autotools for compiling the git version are:
55- autoconf >= 2.59 55- autoconf >= 2.59
56- automake >= 1.11.1 56- automake >= 1.11.1
57- libtool >= 2.2 57- libtool >= 2.2
@@ -135,7 +135,7 @@ install' process with SUDO rights, the libraries will be installed to
135"$GNUNET_PREFIX" and you will have to move them to "/lib/" 135"$GNUNET_PREFIX" and you will have to move them to "/lib/"
136manually. 136manually.
137 137
138Finally, if you are compiling the code from subversion, you have to 138Finally, if you are compiling the code from git, you have to
139run ". bootstrap" before ./configure. If you receive an error during 139run ". bootstrap" before ./configure. If you receive an error during
140the running of ". bootstrap" that looks like "macro `AM_PATH_GTK' not 140the running of ". bootstrap" that looks like "macro `AM_PATH_GTK' not
141found in library", you may need to run aclocal by hand with the -I 141found in library", you may need to run aclocal by hand with the -I
diff --git a/bootstrap b/bootstrap
index 99de68521..f13919ba8 100755
--- a/bootstrap
+++ b/bootstrap
@@ -1,4 +1,9 @@
1#!/bin/sh 1#!/bin/sh
2rm -rf libltdl 2rm -rf libltdl
3echo -n "checking for libtoolize / libtool... "
4which glibtoolize || which libtoolize || which libtool || {
5 echo "*** No libtoolize (libtool) or libtool found, please install it ***"
6 exit 1
7}
3autoreconf -if 8autoreconf -if
4contrib/pogen.sh 9contrib/pogen.sh
diff --git a/configure.ac b/configure.ac
index 9d1fb9ab3..c97596971 100644
--- a/configure.ac
+++ b/configure.ac
@@ -248,6 +248,11 @@ then
248fi 248fi
249AC_DEFINE_UNQUOTED([NEED_LIBGCRYPT_VERSION], "$NEED_LIBGCRYPT_VERSION", [required libgcrypt version]) 249AC_DEFINE_UNQUOTED([NEED_LIBGCRYPT_VERSION], "$NEED_LIBGCRYPT_VERSION", [required libgcrypt version])
250 250
251# TODO: add check for VERSION
252# TODO: add check for alternatives
253# TODO: add switch to skip documentation building
254AM_MISSING_PROG([MAKEINFO], [makeinfo])
255
251# Adam shostack suggests the following for Windows: 256# Adam shostack suggests the following for Windows:
252# -D_FORTIFY_SOURCE=2 -fstack-protector-all 257# -D_FORTIFY_SOURCE=2 -fstack-protector-all
253AC_ARG_ENABLE(gcc-hardening, 258AC_ARG_ENABLE(gcc-hardening,
@@ -1526,6 +1531,7 @@ contrib/Makefile
1526doc/Makefile 1531doc/Makefile
1527doc/man/Makefile 1532doc/man/Makefile
1528doc/doxygen/Makefile 1533doc/doxygen/Makefile
1534doc/documentation/Makefile
1529m4/Makefile 1535m4/Makefile
1530po/Makefile.in 1536po/Makefile.in
1531src/Makefile 1537src/Makefile
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 07cff424c..ac8b15188 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -70,7 +70,20 @@ CLEANFILES = \
70 70
71do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' 71do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
72 72
73%.py: %.py.in Makefile 73# Use SUFFIX Extension rules, they are more portable for every
74# implementation of 'make'.
75# You'll also run into the "'%' is a GNU make extension warning"
76# if you use this:
77#
78#%.py: %.py.in Makefile
79# $(do_subst) < $< > $@
80# chmod +x $@
81#
82# instead of this:
83
84SUFFIXES = .py.in .py
85
86.py.in.py:
74 $(do_subst) < $< > $@ 87 $(do_subst) < $< > $@
75 chmod +x $@ 88 chmod +x $@
76 89
diff --git a/contrib/packages/guix/gnunet-doc.scm b/contrib/packages/guix/gnunet-doc.scm
index 9974c1b51..b1ede6612 100644
--- a/contrib/packages/guix/gnunet-doc.scm
+++ b/contrib/packages/guix/gnunet-doc.scm
@@ -94,7 +94,7 @@
94 ("gnurl" ,gnurl) 94 ("gnurl" ,gnurl)
95 ("gstreamer" ,gstreamer) 95 ("gstreamer" ,gstreamer)
96 ("gst-plugins-base" ,gst-plugins-base) 96 ("gst-plugins-base" ,gst-plugins-base)
97 ("gnutls" ,gnutls) ;Change to gnutls/dane once it is merged. 97 ("gnutls/dane" ,gnutls/dane)
98 ("libextractor" ,libextractor) 98 ("libextractor" ,libextractor)
99 ("libgcrypt" ,libgcrypt) 99 ("libgcrypt" ,libgcrypt)
100 ("libidn" ,libidn) 100 ("libidn" ,libidn)
@@ -109,7 +109,7 @@
109 ("mysql" ,mysql) 109 ("mysql" ,mysql)
110 ("zlib" ,zlib) 110 ("zlib" ,zlib)
111 ("perl" ,perl) 111 ("perl" ,perl)
112 ("python" ,python) ; tests and gnunet-qr 112 ("python-2" ,python-2) ; tests and gnunet-qr
113 ("jansson" ,jansson) 113 ("jansson" ,jansson)
114 ("nss" ,nss) 114 ("nss" ,nss)
115 ("glib" ,glib "bin") 115 ("glib" ,glib "bin")
@@ -126,6 +126,7 @@
126 ("gnu-gettext" ,gnu-gettext) 126 ("gnu-gettext" ,gnu-gettext)
127 ("graphviz" ,graphviz) ; dot 127 ("graphviz" ,graphviz) ; dot
128 ("texinfo-5" ,texinfo-5) ; Debian stable 128 ("texinfo-5" ,texinfo-5) ; Debian stable
129 ("which" ,which)
129 ("libtool" ,libtool))) 130 ("libtool" ,libtool)))
130 (arguments 131 (arguments
131 `(#:configure-flags 132 `(#:configure-flags
@@ -142,8 +143,13 @@
142 (zero? (system* "sh" "bootstrap")))) 143 (zero? (system* "sh" "bootstrap"))))
143 (replace 'build 144 (replace 'build
144 (lambda _ 145 (lambda _
145 (chdir "doc") 146 (chdir "doc/documentation")
146 (zero? (system* "make" "doc-all-give-me-the-noise")))) 147 ;;(zero? (system* "make" "dev-build"))))
148 (zero? (system* "sh" "run-gendocs.sh"))))
149 ;; (zero? (system* "make" "pdf"))
150 ;; (zero? (system* "make" "html"))
151 ;; (zero? (system* "make" "info"))))
152 ;;(zero? (system* "make" "doc-all-give-me-the-noise"))))
147 (replace 'install 153 (replace 'install
148 (lambda _ 154 (lambda _
149 (zero? (system* "make" "doc-all-install"))))))) 155 (zero? (system* "make" "doc-all-install")))))))
diff --git a/contrib/packages/guix/gnunet.scm b/contrib/packages/guix/gnunet.scm
index a358fcecc..d8eee1805 100644
--- a/contrib/packages/guix/gnunet.scm
+++ b/contrib/packages/guix/gnunet.scm
@@ -60,6 +60,7 @@
60 (gnu packages texinfo) 60 (gnu packages texinfo)
61 (gnu packages tex) 61 (gnu packages tex)
62 (gnu packages tls) 62 (gnu packages tls)
63 (gnu packages upnp)
63 (gnu packages video) 64 (gnu packages video)
64 (gnu packages web) 65 (gnu packages web)
65 (gnu packages xiph) 66 (gnu packages xiph)
@@ -91,7 +92,7 @@
91 ("gnurl" ,gnurl) 92 ("gnurl" ,gnurl)
92 ("gstreamer" ,gstreamer) 93 ("gstreamer" ,gstreamer)
93 ("gst-plugins-base" ,gst-plugins-base) 94 ("gst-plugins-base" ,gst-plugins-base)
94 ("gnutls" ,gnutls) ;Change to gnutls/dane once it is merged. 95 ("gnutls/dane" ,gnutls/dane) ;Change to gnutls/dane once it is merged.
95 ("libextractor" ,libextractor) 96 ("libextractor" ,libextractor)
96 ("libgcrypt" ,libgcrypt) 97 ("libgcrypt" ,libgcrypt)
97 ("libidn" ,libidn) 98 ("libidn" ,libidn)
@@ -113,24 +114,25 @@
113 ("gmp" ,gmp) 114 ("gmp" ,gmp)
114 ("bluez" ,bluez) ; for optional bluetooth feature 115 ("bluez" ,bluez) ; for optional bluetooth feature
115 ("glib" ,glib) 116 ("glib" ,glib)
116 ;; There are currently no binary substitutes for texlive on 117 ;; TODO: figure out the right texlive parts.
117 ;; hydra.gnu.org or its mirrors due to its size. Uncomment if you need it. 118 ;;("texlive-minimal" ,texlive-minimal)
118 ;;("texlive-minimal" ,texlive-minimal) ; optional.
119 ("texlive" ,texlive) 119 ("texlive" ,texlive)
120 ("miniupnpc" ,miniupnpc)
120 ("libogg" ,libogg))) 121 ("libogg" ,libogg)))
121 (native-inputs 122 (native-inputs
122 `(("pkg-config" ,pkg-config) 123 `(("pkg-config" ,pkg-config)
123 ("autoconf" ,autoconf) 124 ("autoconf" ,autoconf)
124 ("automake" ,automake) 125 ("automake" ,automake)
125 ("gnu-gettext" ,gnu-gettext) 126 ("gnu-gettext" ,gnu-gettext)
127 ("which" ,which)
126 ("texinfo" ,texinfo-5) ; Debian stable: 5.2 128 ("texinfo" ,texinfo-5) ; Debian stable: 5.2
127 ("libtool" ,libtool))) 129 ("libtool" ,libtool)))
128 (outputs '("out" "debug")) 130 (outputs '("out" "debug"))
129 (arguments 131 (arguments
130 `(#:configure-flags 132 `(#:configure-flags
131 (list (string-append "--with-nssdir=" %output "/lib") 133 (list (string-append "--with-nssdir=" %output "/lib")
132 "--enable-gcc-hardening" 134 ;;"--enable-gcc-hardening"
133 "--enable-linker-hardening" 135 ;;"--enable-linker-hardening"
134 "--enable-logging=verbose" 136 "--enable-logging=verbose"
135 "CFLAGS=-ggdb -O0") 137 "CFLAGS=-ggdb -O0")
136 #:phases 138 #:phases
diff --git a/contrib/packages/guix/guix-env.scm b/contrib/packages/guix/guix-env.scm
index c62a713a2..da4a60b73 100644
--- a/contrib/packages/guix/guix-env.scm
+++ b/contrib/packages/guix/guix-env.scm
@@ -146,6 +146,7 @@
146 ("autoconf" ,autoconf) 146 ("autoconf" ,autoconf)
147 ("automake" ,automake) 147 ("automake" ,automake)
148 ("gnu-gettext" ,gnu-gettext) 148 ("gnu-gettext" ,gnu-gettext)
149 ("which" ,which)
149 ("texinfo" ,texinfo-5) ; Debian stable: 5.2 150 ("texinfo" ,texinfo-5) ; Debian stable: 5.2
150 ("libtool" ,libtool))) 151 ("libtool" ,libtool)))
151 ;; TODO: To make use of out:debug, which carries the symbols, 152 ;; TODO: To make use of out:debug, which carries the symbols,
diff --git a/contrib/packages/guix/packages/gnunet/packages/gnunet.scm b/contrib/packages/guix/packages/gnunet/packages/gnunet.scm
index fbc132d78..be529ec1d 100644
--- a/contrib/packages/guix/packages/gnunet/packages/gnunet.scm
+++ b/contrib/packages/guix/packages/gnunet/packages/gnunet.scm
@@ -26,6 +26,7 @@
26 #:use-module (gnu packages admin) 26 #:use-module (gnu packages admin)
27 #:use-module (gnu packages aidc) 27 #:use-module (gnu packages aidc)
28 #:use-module (gnu packages autotools) 28 #:use-module (gnu packages autotools)
29 #:use-module (gnu packages base)
29 #:use-module (gnu packages bison) 30 #:use-module (gnu packages bison)
30 #:use-module (gnu packages compression) 31 #:use-module (gnu packages compression)
31 #:use-module (gnu packages databases) 32 #:use-module (gnu packages databases)
@@ -60,6 +61,7 @@
60;; TODO: Use HEAD without checking sum of it. 61;; TODO: Use HEAD without checking sum of it.
61;; Explanation for name scheme: UNIXPATH is capped at 108 characters, 62;; Explanation for name scheme: UNIXPATH is capped at 108 characters,
62;; this causes lots of tests to fail. 63;; this causes lots of tests to fail.
64;; FIXME: make this file MUCH shorter.
63(define-public gnunetg 65(define-public gnunetg
64 (let* ((commit "3c3090717610ea787fdd3562901329254a6af0d6") 66 (let* ((commit "3c3090717610ea787fdd3562901329254a6af0d6")
65 (revision "32")) 67 (revision "32"))
@@ -112,6 +114,7 @@
112 ("autoconf" ,autoconf) 114 ("autoconf" ,autoconf)
113 ("automake" ,automake) 115 ("automake" ,automake)
114 ("gnu-gettext" ,gnu-gettext) 116 ("gnu-gettext" ,gnu-gettext)
117 ("which" ,which)
115 ("texinfo" ,texinfo) 118 ("texinfo" ,texinfo)
116 ("libtool" ,libtool))) 119 ("libtool" ,libtool)))
117 (outputs '("out" "debug")) 120 (outputs '("out" "debug"))
@@ -199,6 +202,7 @@
199 (native-inputs 202 (native-inputs
200 `(("pkg-config" ,pkg-config) 203 `(("pkg-config" ,pkg-config)
201 ("autoconf" ,autoconf) 204 ("autoconf" ,autoconf)
205 ("which" ,which)
202 ("automake" ,automake) 206 ("automake" ,automake)
203 ("gnu-gettext" ,gnu-gettext) 207 ("gnu-gettext" ,gnu-gettext)
204 ("texinfo" ,texinfo) 208 ("texinfo" ,texinfo)
diff --git a/doc/.gitignore b/doc/.gitignore
index 25617d1b0..656026fe7 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -5,14 +5,17 @@
5*.toc 5*.toc
6*.cp 6*.cp
7*.cps 7*.cps
8*.html
9*~ 8*~
10*.info 9*.info
10*.info-1
11*.info-2
12*.info-3
11\#*\# 13\#*\#
12version.texi 14version.texi
13gnunet.info-1
14gnunet.info-2
15gnunet.info-3
16mdate-sh 15mdate-sh
17stamp-vti 16stamp-vti
18texinfo.tex 17texinfo.tex
18gnunet.t2p/
19gnunet-c-tutorial.t2p/
20*.t2p/
21documentation/manuals \ No newline at end of file
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 1a8bb64b9..f84c66753 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,232 +1,7 @@
1# This Makefile.am is in the public domain 1# This Makefile.am is in the public domain
2SUBDIRS = man doxygen 2SUBDIRS = man doxygen documentation
3
4docdir = $(datadir)/doc/gnunet/
5
6infoimagedir = $(infodir)/images
7
8#DOT_FILES = images/$(wildcard *.dot)
9
10#DOT_VECTOR_GRAPHICS = \
11# $(DOT_FILES:%.dot=%.eps) \
12# $(DOT_FILES:%.dot=%.pdf)
13
14dist_infoimage_DATA = \
15 images/gnunet-gtk-0-10-gns-a-done.png \
16 images/gnunet-gtk-0-10-gns-a.png \
17 images/daemon_lego_block.png \
18 images/gnunet-gtk-0-10-gns.png \
19 images/gnunet-0-10-peerinfo.png \
20 images/gnunet-gtk-0-10-identity.png \
21 images/gnunet-fs-gtk-0-10-star-tab.png \
22 images/gnunet-gtk-0-10.png \
23 images/gnunet-gtk-0-10-download-area.png \
24 images/gnunet-gtk-0-10-search-selected.png \
25 images/gnunet-gtk-0-10-fs-menu.png \
26 images/gnunet-gtk-0-10-traffic.png \
27 images/gnunet-gtk-0-10-fs.png \
28 images/gnunet-namestore-gtk-phone.png \
29 images/gnunet-gtk-0-10-fs-publish-editing.png \
30 images/gnunet-namestore-gtk-vpn.png \
31 images/gnunet-gtk-0-10-fs-published.png \
32 images/gnunet-setup-exit.png \
33 images/gnunet-gtk-0-10-fs-publish.png \
34 images/iceweasel-preferences.png \
35 images/gnunet-gtk-0-10-fs-publish-select.png \
36 images/iceweasel-proxy.png \
37 images/gnunet-gtk-0-10-fs-publish-with-file_0.png \
38 images/service_lego_block.png \
39 images/gnunet-gtk-0-10-fs-publish-with-file.png \
40 images/service_stack.png \
41 images/gnunet-gtk-0-10-fs-search.png \
42 images/gnunet-tutorial-service.png \
43 images/gnunet-tutorial-system.png \
44 images/daemon_lego_block.svg \
45 images/lego_stack.svg \
46 images/service_lego_block.svg \
47 images/structure.dot
48
49# images/$(wildcard *.png) \
50# images/$(wildcard *.svg)
51# $(DOT_FILES:%.dot=%.png)
52
53#DOT_OPTIONS = \
54# -Gratio=.9 -Gnodesep=.005 -Granksep=.00005 \
55# -Nfontsite=9 -Nheight=.1 -Nwidth=.1
56
57# .dot.png:
58# $(AM_V_DOT)$(DOT) -Tpng $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
59# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
60
61# .dot.pdf:
62# $(AM_V_DOT)$(DOT) -Tpdf $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
63# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
64
65# .dot.eps:
66# $(AM_V_DOT)$(DOT) -Teps $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
67# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
68
69# .png.eps:
70# $(AM_V_GEN)convert "$<" "$@-tmp.eps"; \
71# mv "$@-tmp.eps" "$@"
72
73# pdf-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.pdf)
74# info-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.png)
75# ps-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.eps) \
76# $(top_srcdir)/%D%/images/coreutils-size-map.eps
77# dvi-local: ps-local
78
79gnunet_tutorial_examples = \
80 001.c \
81 002.c \
82 003.c \
83 004.c \
84 005.c \
85 006.c \
86 007.c \
87 008.c \
88 009.c \
89 010.c \
90 011.c \
91 012.c \
92 013.c \
93 014.c \
94 015.c \
95 016.c \
96 017.c \
97 018.c \
98 019.c \
99 020.c \
100 021.c \
101 022.c \
102 023.c \
103 024.c \
104 025.c \
105 026.c
106
107info_TEXINFOS = \
108 gnunet.texi \
109 gnunet-c-tutorial.texi
110
111gnunet_TEXINFOS = \
112 chapters/developer.texi \
113 chapters/installation.texi \
114 chapters/philosophy.texi \
115 chapters/user.texi \
116 fdl-1.3.texi \
117 gpl-3.0.texi
118 3
119EXTRA_DIST = \ 4EXTRA_DIST = \
120 $(gnunet_TEXINFOS) \
121 outdated-and-old-installation-instructions.txt \ 5 outdated-and-old-installation-instructions.txt \
122 gnunet-c-tutorial-v1.pdf \ 6 gnunet-c-tutorial-v1.pdf \
123 $(gnunet_tutorial_examples) \
124 README.txt 7 README.txt
125
126
127# $(DOT_FILES) \
128# $(DOT_VECTOR_GRAPHICS)
129
130DISTCLEANFILES = \
131 gnunet.cps \
132 gnunet-c-tutorial.cps \
133 chapters/developer.cps \
134 chapters/installation.cps \
135 chapter/philosophy.cps \
136 chapters/user.cps \
137 fdl-1.3.cps \
138 gpl-3.0.cps
139
140# if HAVE_EXTENDED_DOCUMENTATION_BUILDING
141daemon_lego_block.png: images/daemon_lego_block.svg
142 convert images/daemon_lego_block.svg images/daemon_lego_block.png &&
143 pngcrush images/daemon_lego_block.png images/daemon_lego_block.png
144
145service_lego_block.png: images/service_lego_block.svg
146 convert images/service_lego_block.svg images/service_lego_block.png &&
147 pngcrush images/service_lego_block.png images/serivce_lego_block.png
148
149lego_stack.png: images/lego_stack.svg
150 convert images/lego_stack.svg images/lego_stack.png &&
151 pngcrush images/lego_stack.png images/lego_stack.png
152
153version.texi:
154 echo "@set UPDATED $(date +'%d %B %Y')" > $@
155 echo "@set UPDATED-MONTH $(date +'%B %Y')" >> $@
156 echo "@set EDITION $(PACKAGE_VERSION)" >> $@
157 echo "@set VERSION $(PACKAGE_VERSION)" >> $@
158
159doc-pdf: version.texi
160 @makeinfo --pdf --quiet gnunet.texi
161doc-pdf-tutorial: version.texi
162 @makeinfo --pdf --quiet gnunet-c-tutorial.texi
163
164doc-html: version.texi
165 @makeinfo --html gnunet.texi
166doc-html-tutorial: version.texi
167 @makeinfo --html gnunet-c-tutorial.texi
168
169doc-info: version.texi
170 @makeinfo --no-split gnunet.texi
171doc-info-tutorial: version.texi
172 @makeinfo --no-split gnunet-c-tutorial.texi
173
174# FIXME: rm *.html and *.pdf
175doc-clean:
176 @rm *.aux *.log *.toc *.cp *.cps
177
178doc-all: doc-pdf doc-html doc-info doc-pdf-tutorial doc-html-tutorial doc-info-tutorial
179
180doc-pdf-noise: version.texi
181 @makeinfo --pdf gnunet.texi
182doc-pdf-tutorial-noise: version.texi
183 @makeinfo --pdf gnunet-c-tutorial.texi
184
185doc-html-noise: version.texi
186 @makeinfo --html gnunet.texi
187doc-html-tutorial-noise: version.texi
188 @makeinfo --html gnunet-c-tutorial.texi
189
190doc-info-noise: version.texi
191 @makeinfo --no-split gnunet.texi
192doc-info-tutorial-noise: version.texi
193 @makeinfo --no-split gnunet-c-tutorial.texi
194
195doc-all-give-me-the-noise: doc-pdf-noise doc-html-noise doc-info-noise doc-pdf-tutorial-noise doc-html-tutorial-noise doc-info-tutorial-noise
196
197doc-all-install: doc-all-give-me-the-noise
198 @mkdir -p $(DESTDIR)/$(docdir)
199 @mkdir -p $(DESTDIR)/$(infoimagedir)
200 @mkdir -p $(DESTDIR)/$(infodir)
201 @install -m 0755 gnunet.pdf $(DESTDIR)/$(docdir)
202 @install -m 0755 gnunet-c-tutorial.pdf $(DESTDIR)/$(docdir)
203 @install -m 0755 gnunet-c-tutorial.info $(DESTDIR)/$(infodir)
204 @install -m 0755 gnunet.info $(DESTDIR)/$(infodir)
205 @cp -r gnunet $(DESTDIR)/$(docdir)
206 @cp -r gnunet-c-tutorial $(DESTDIR)/$(docdir)
207
208# @cp -r images $(DESTDIR)/$(infoimagedir)
209
210# TODO: Add more to clean.
211# clean:
212# @rm gnunet.pdf
213# @rm gnunet-c-tutorial.pdf
214# @rm gnunet.info
215# @rm gnunet-c-tutorial.info
216
217# CLEANFILES = \
218# gnunet.log \
219# gnunet-c-tutorial.log \
220# $(wildcard *.aux) \
221# $(wildcard *.toc) \
222# $(wildcard *.cp) \
223# $(wildcard *.cps)
224
225.PHONY: version.texi
226# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_PDF
227
228# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_HTML
229
230# endif
231# endif
232# endif
diff --git a/doc/README.txt b/doc/README.txt
deleted file mode 100644
index fbbc24424..000000000
--- a/doc/README.txt
+++ /dev/null
@@ -1,42 +0,0 @@
1* What's left to do
2
3- Which Texlive modules are needed? Decrease the size.
4- Update the content of gnunet documentation.
5
6* How to use (hack) on this
7
8** with guix
9
10export the environment variable GUIX_PACKAGE_PATH as $GUIX_PACKAGE_PATH:gnunet/contrib/packages/guix/packages
11guix environment gnunet-doc
12
13** without guix
14
15You need to have Texinfo and Texlive in your path.
16sh bootstrap
17./configure --enable-documentation
18cd doc
19make doc-all-give-me-the-noise
20
21* structure (relations)
22
23** gnunet.texi
24 -> chapters/developer.texi
25 -> chapters/installation.texi
26 -> chapters/philosophy.texi
27 -> chapters/user.texi
28 -> images/*
29 -> gpl-3.0.texi
30 -> fdl-1.3.texi
31
32** gnunet-c-tutorial.texi
33 -> figs/Service.pdf
34 -> figs/System.pdf
35 -> tutorial-examples/*.c
36 -> gpl-3.0.texi
37 -> fdl-1.3.texi
38
39- gnunet-c-tutorial-v1.pdf: original LaTeX "gnunet-c-tutorial.pdf".
40- man folder: the man pages.
41- doxygen folder
42- outdated-and-old-installation-instructions.txt: self described within the file.
diff --git a/doc/chapters/developer.texi b/doc/chapters/developer.texi
deleted file mode 100644
index f5493fd63..000000000
--- a/doc/chapters/developer.texi
+++ /dev/null
@@ -1,7487 +0,0 @@
1@c ***************************************************************************
2@node GNUnet Developer Handbook
3@chapter GNUnet Developer Handbook
4
5This book is intended to be an introduction for programmers that want to
6extend the GNUnet framework. GNUnet is more than a simple peer-to-peer
7application. For developers, GNUnet is:
8
9@itemize @bullet
10@item Free software under the GNU General Public License, with a community
11that believes in the GNU philosophy
12@item
13A set of standards, including coding conventions and architectural rules
14@item
15A set of layered protocols, both specifying the communication between peers as
16well as the communication between components of a single peer.
17@item
18A set of libraries with well-defined APIs suitable for writing extensions
19@end itemize
20
21In particular, the architecture specifies that a peer consists of many
22processes communicating via protocols. Processes can be written in almost
23any language. C and Java APIs exist for accessing existing services and for
24writing extensions. It is possible to write extensions in other languages by
25implementing the necessary IPC protocols.
26
27GNUnet can be extended and improved along many possible dimensions, and anyone
28interested in free software and freedom-enhancing networking is welcome to
29join the effort. This developer handbook attempts to provide an initial
30introduction to some of the key design choices and central components of the
31system. This manual is far from complete, and we welcome informed
32contributions, be it in the form of new chapters or insightful comments.
33
34However, the website is experiencing a constant onslaught of sophisticated
35link-spam entered manually by exploited workers solving puzzles and
36customizing text. To limit this commercial defacement, we are strictly
37moderating comments and have disallowed "normal" users from posting new
38content. However, this is really only intended to keep the spam at bay. If
39you are a real user or aspiring developer, please drop us a note (IRC, e-mail,
40contact form) with your user profile ID number included. We will then relax
41these restrictions on your account. We're sorry for this inconvenience;
42however, few people would want to read this site if 99% of it was
43advertisements for bogus websites.
44
45
46
47@c ***************************************************************************
48
49
50
51
52
53
54
55
56@menu
57* Developer Introduction::
58* Code overview::
59* System Architecture::
60* Subsystem stability::
61* Naming conventions and coding style guide::
62* Build-system::
63* Developing extensions for GNUnet using the gnunet-ext template::
64* Writing testcases::
65* GNUnet's TESTING library::
66* Performance regression analysis with Gauger::
67* GNUnet's TESTBED Subsystem::
68* libgnunetutil::
69* The Automatic Restart Manager (ARM)::
70* GNUnet's TRANSPORT Subsystem::
71* NAT library::
72* Distance-Vector plugin::
73* SMTP plugin::
74* Bluetooth plugin::
75* WLAN plugin::
76* The ATS Subsystem::
77* GNUnet's CORE Subsystem::
78* GNUnet's CADET subsystem::
79* GNUnet's NSE subsystem::
80* GNUnet's HOSTLIST subsystem::
81* GNUnet's IDENTITY subsystem::
82* GNUnet's NAMESTORE Subsystem::
83* GNUnet's PEERINFO subsystem::
84* GNUnet's PEERSTORE subsystem::
85* GNUnet's SET Subsystem::
86* GNUnet's STATISTICS subsystem::
87* GNUnet's Distributed Hash Table (DHT)::
88* The GNU Name System (GNS)::
89* The GNS Namecache::
90* The REVOCATION Subsystem::
91* GNUnet's File-sharing (FS) Subsystem::
92* GNUnet's REGEX Subsystem::
93@end menu
94
95@node Developer Introduction
96@section Developer Introduction
97
98This developer handbook is intended as first introduction to GNUnet for new
99developers that want to extend the GNUnet framework. After the introduction,
100each of the GNUnet subsystems (directories in the @file{src/} tree) is (supposed to
101be) covered in its own chapter. In addition to this documentation, GNUnet
102developers should be aware of the services available on the GNUnet server to
103them.
104
105New developers can have a look a the GNUnet tutorials for C and java available
106in the @file{src/} directory of the repository or under the following links:
107
108@c ** FIXME: Link to files in source, not online.
109@c ** FIXME: Where is the Java tutorial?
110@itemize @bullet
111@item @uref{https://gnunet.org/git/gnunet.git/plain/doc/gnunet-c-tutorial.pdf, GNUnet C tutorial}
112@item GNUnet Java tutorial
113@end itemize
114
115In addition to this book, the GNUnet server contains various resources for
116GNUnet developers. They are all conveniently reachable via the "Developer"
117entry in the navigation menu. Some additional tools (such as static analysis
118reports) require a special developer access to perform certain operations. If
119you feel you need access, you should contact
120@uref{http://grothoff.org/christian/, Christian Grothoff}, GNUnet's maintainer.
121
122The public subsystems on the GNUnet server that help developers are:
123
124@itemize @bullet
125@item The Version control system keeps our code and enables distributed
126development. Only developers with write access can commit code, everyone else
127is encouraged to submit patches to the
128@uref{https://lists.gnu.org/mailman/listinfo/gnunet-developers, GNUnet-developers mailinglist}.
129@item The GNUnet bugtracking system is used to track feature requests, open bug
130reports and their resolutions. Anyone can report bugs, only developers can
131claim to have fixed them.
132@item A buildbot is used to check GNUnet builds automatically on a range of
133platforms. Builds are triggered automatically after 30 minutes of no changes to
134Git.
135@item The current quality of our automated test suite is assessed using Code
136coverage analysis. This analysis is run daily; however the webpage is only
137updated if all automated tests pass at that time. Testcases that improve our
138code coverage are always welcome.
139@item We try to automatically find bugs using a static analysis scan. This scan
140is run daily; however the webpage is only updated if all automated tests pass
141at the time. Note that not everything that is flagged by the analysis is a bug,
142sometimes even good code can be marked as possibly problematic. Nevertheless,
143developers are encouraged to at least be aware of all issues in their code that
144are listed.
145@item We use Gauger for automatic performance regression visualization. Details
146on how to use Gauger are here.
147@item We use @uref{http://junit.org/, junit} to automatically test gnunet-java.
148Automatically generated, current reports on the test suite are here.
149@item We use Cobertura to generate test coverage reports for gnunet-java.
150Current reports on test coverage are here.
151@end itemize
152
153
154
155@c ***************************************************************************
156@menu
157* Project overview::
158@end menu
159
160@node Project overview
161@subsection Project overview
162
163The GNUnet project consists at this point of several sub-projects. This section
164is supposed to give an initial overview about the various sub-projects. Note
165that this description also lists projects that are far from complete, including
166even those that have literally not a single line of code in them yet.
167
168GNUnet sub-projects in order of likely relevance are currently:
169
170@table @asis
171
172@item gnunet Core of the P2P framework, including file-sharing, VPN and
173chat applications; this is what the developer handbook covers mostly
174@item gnunet-gtk Gtk+-based user interfaces, including gnunet-fs-gtk
175(file-sharing), gnunet-statistics-gtk (statistics over time),
176gnunet-peerinfo-gtk (information about current connections and known peers),
177gnunet-chat-gtk (chat GUI) and gnunet-setup (setup tool for "everything")
178@item gnunet-fuse Mounting directories shared via GNUnet's file-sharing on Linux
179@item gnunet-update Installation and update tool
180@item gnunet-ext Template for starting 'external' GNUnet projects
181@item gnunet-java Java APIs for writing GNUnet services and applications
182@c ** FIXME: Point to new website repository once we have it:
183@c ** @item svn/gnunet-www/ Code and media helping drive the GNUnet website
184@item eclectic Code to run
185GNUnet nodes on testbeds for research, development, testing and evaluation
186@c ** FIXME: Solve the status and location of gnunet-qt
187@item gnunet-qt qt-based GNUnet GUI (dead?)
188@item gnunet-cocoa cocoa-based GNUnet GUI (dead?)
189
190@end table
191
192We are also working on various supporting libraries and tools:
193@c ** FIXME: What about gauger, and what about libmwmodem?
194
195@table @asis
196@item libextractor GNU libextractor (meta data extraction)
197@item libmicrohttpd GNU libmicrohttpd (embedded HTTP(S) server library)
198@item gauger Tool for performance regression analysis
199@item monkey Tool for automated debugging of distributed systems
200@item libmwmodem Library for accessing satellite connection quality reports
201@end table
202
203Finally, there are various external projects (see links for a list of those
204that have a public website) which build on top of the GNUnet framework.
205
206@c ***************************************************************************
207@node Code overview
208@section Code overview
209
210This section gives a brief overview of the GNUnet source code. Specifically, we
211sketch the function of each of the subdirectories in the @file{gnunet/src/}
212directory. The order given is roughly bottom-up (in terms of the layers of the
213system).
214@table @asis
215
216@item util/ --- libgnunetutil Library with general utility functions, all
217GNUnet binaries link against this library. Anything from memory allocation and
218data structures to cryptography and inter-process communication. The goal is to
219provide an OS-independent interface and more 'secure' or convenient
220implementations of commonly used primitives. The API is spread over more than a
221dozen headers, developers should study those closely to avoid duplicating
222existing functions.
223@item hello/ --- libgnunethello HELLO messages are used to
224describe under which addresses a peer can be reached (for example, protocol,
225IP, port). This library manages parsing and generating of HELLO messages.
226@item block/ --- libgnunetblock The DHT and other components of GNUnet store
227information in units called 'blocks'. Each block has a type and the type
228defines a particular format and how that binary format is to be linked to a
229hash code (the key for the DHT and for databases). The block library is a
230wapper around block plugins which provide the necessary functions for each
231block type.
232@item statistics/ The statistics service enables associating
233values (of type uint64_t) with a componenet name and a string. The main uses is
234debugging (counting events), performance tracking and user entertainment (what
235did my peer do today?).
236@item arm/ The automatic-restart-manager (ARM) service
237is the GNUnet master service. Its role is to start gnunet-services, to re-start
238them when they crashed and finally to shut down the system when requested.
239@item peerinfo/ The peerinfo service keeps track of which peers are known to
240the local peer and also tracks the validated addresses for each peer (in the
241form of a HELLO message) for each of those peers. The peer is not necessarily
242connected to all peers known to the peerinfo service. Peerinfo provides
243persistent storage for peer identities --- peers are not forgotten just because
244of a system restart.
245@item datacache/ --- libgnunetdatacache The datacache
246library provides (temporary) block storage for the DHT. Existing plugins can
247store blocks in Sqlite, Postgres or MySQL databases. All data stored in the
248cache is lost when the peer is stopped or restarted (datacache uses temporary
249tables).
250@item datastore/ The datastore service stores file-sharing blocks in
251databases for extended periods of time. In contrast to the datacache, data is
252not lost when peers restart. However, quota restrictions may still cause old,
253expired or low-priority data to be eventually discarded. Existing plugins can
254store blocks in Sqlite, Postgres or MySQL databases.
255@item template/ Template
256for writing a new service. Does nothing.
257@item ats/ The automatic transport
258selection (ATS) service is responsible for deciding which address (i.e. which
259transport plugin) should be used for communication with other peers, and at
260what bandwidth.
261@item nat/ --- libgnunetnat Library that provides basic
262functions for NAT traversal. The library supports NAT traversal with manual
263hole-punching by the user, UPnP and ICMP-based autonomous NAT traversal. The
264library also includes an API for testing if the current configuration works and
265the @code{gnunet-nat-server} which provides an external service to test the
266local configuration.
267@item fragmentation/ --- libgnunetfragmentation Some
268transports (UDP and WLAN, mostly) have restrictions on the maximum transfer
269unit (MTU) for packets. The fragmentation library can be used to break larger
270packets into chunks of at most 1k and transmit the resulting fragments
271reliabily (with acknowledgement, retransmission, timeouts, etc.).
272@item transport/ The transport service is responsible for managing the basic P2P
273communication. It uses plugins to support P2P communication over TCP, UDP,
274HTTP, HTTPS and other protocols.The transport service validates peer addresses,
275enforces bandwidth restrictions, limits the total number of connections and
276enforces connectivity restrictions (i.e. friends-only).
277@item peerinfo-tool/
278This directory contains the gnunet-peerinfo binary which can be used to inspect
279the peers and HELLOs known to the peerinfo service.
280@item core/ The core
281service is responsible for establishing encrypted, authenticated connections
282with other peers, encrypting and decrypting messages and forwarding messages to
283higher-level services that are interested in them.
284@item testing/ ---
285libgnunettesting The testing library allows starting (and stopping) peers for
286writing testcases.@
287It also supports automatic generation of configurations for
288peers ensuring that the ports and paths are disjoint. libgnunettesting is also
289the foundation for the testbed service
290@item testbed/ The testbed service is
291used for creating small or large scale deployments of GNUnet peers for
292evaluation of protocols. It facilitates peer depolyments on multiple hosts (for
293example, in a cluster) and establishing varous network topologies (both
294underlay and overlay).
295@item nse/ The network size estimation (NSE) service
296implements a protocol for (securely) estimating the current size of the P2P
297network.
298@item dht/ The distributed hash table (DHT) service provides a
299distributed implementation of a hash table to store blocks under hash keys in
300the P2P network.
301@item hostlist/ The hostlist service allows learning about
302other peers in the network by downloading HELLO messages from an HTTP server,
303can be configured to run such an HTTP server and also implements a P2P protocol
304to advertise and automatically learn about other peers that offer a public
305hostlist server.
306@item topology/ The topology service is responsible for
307maintaining the mesh topology. It tries to maintain connections to friends
308(depending on the configuration) and also tries to ensure that the peer has a
309decent number of active connections at all times. If necessary, new connections
310are added. All peers should run the topology service, otherwise they may end up
311not being connected to any other peer (unless some other service ensures that
312core establishes the required connections). The topology service also tells the
313transport service which connections are permitted (for friend-to-friend
314networking)
315@item fs/ The file-sharing (FS) service implements GNUnet's
316file-sharing application. Both anonymous file-sharing (using gap) and
317non-anonymous file-sharing (using dht) are supported.
318@item cadet/ The CADET
319service provides a general-purpose routing abstraction to create end-to-end
320encrypted tunnels in mesh networks. We wrote a paper documenting key aspects of
321the design.
322@item tun/ --- libgnunettun Library for building IPv4, IPv6
323packets and creating checksums for UDP, TCP and ICMP packets. The header
324defines C structs for common Internet packet formats and in particular structs
325for interacting with TUN (virtual network) interfaces.
326@item mysql/ ---
327libgnunetmysql Library for creating and executing prepared MySQL statements and
328to manage the connection to the MySQL database. Essentially a lightweight
329wrapper for the interaction between GNUnet components and libmysqlclient.
330@item dns/ Service that allows intercepting and modifying DNS requests of the
331local machine. Currently used for IPv4-IPv6 protocol translation (DNS-ALG) as
332implemented by "pt/" and for the GNUnet naming system. The service can also be
333configured to offer an exit service for DNS traffic.
334@item vpn/ The virtual
335public network (VPN) service provides a virtual tunnel interface (VTUN) for IP
336routing over GNUnet. Needs some other peers to run an "exit" service to work.
337Can be activated using the "gnunet-vpn" tool or integrated with DNS using the
338"pt" daemon.
339@item exit/ Daemon to allow traffic from the VPN to exit this
340peer to the Internet or to specific IP-based services of the local peer.
341Currently, an exit service can only be restricted to IPv4 or IPv6, not to
342specific ports and or IP address ranges. If this is not acceptable, additional
343firewall rules must be added manually. exit currently only works for normal
344UDP, TCP and ICMP traffic; DNS queries need to leave the system via a DNS
345service.
346@item pt/ protocol translation daemon. This daemon enables 4-to-6,
3476-to-4, 4-over-6 or 6-over-4 transitions for the local system. It essentially
348uses "DNS" to intercept DNS replies and then maps results to those offered by
349the VPN, which then sends them using mesh to some daemon offering an
350appropriate exit service.
351@item identity/ Management of egos (alter egos) of a
352user; identities are essentially named ECC private keys and used for zones in
353the GNU name system and for namespaces in file-sharing, but might find other
354uses later
355@item revocation/ Key revocation service, can be used to revoke the
356private key of an identity if it has been compromised
357@item namecache/ Cache
358for resolution results for the GNU name system; data is encrypted and can be
359shared among users, loss of the data should ideally only result in a
360performance degradation (persistence not required)
361@item namestore/ Database
362for the GNU name system with per-user private information, persistence required
363@item gns/ GNU name system, a GNU approach to DNS and PKI.
364@item dv/ A plugin
365for distance-vector (DV)-based routing. DV consists of a service and a
366transport plugin to provide peers with the illusion of a direct P2P connection
367for connections that use multiple (typically up to 3) hops in the actual
368underlay network.
369@item regex/ Service for the (distributed) evaluation of
370regular expressions.
371@item scalarproduct/ The scalar product service offers an
372API to perform a secure multiparty computation which calculates a scalar
373product between two peers without exposing the private input vectors of the
374peers to each other.
375@item consensus/ The consensus service will allow a set
376of peers to agree on a set of values via a distributed set union computation.
377@item rest/ The rest API allows access to GNUnet services using RESTful
378interaction. The services provide plugins that can exposed by the rest server.
379@item experimentation/ The experimentation daemon coordinates distributed
380experimentation to evaluate transport and ats properties
381@end table
382
383@c ***************************************************************************
384@node System Architecture
385@section System Architecture
386
387GNUnet developers like legos. The blocks are indestructible, can be stacked
388together to construct complex buildings and it is generally easy to swap one
389block for a different one that has the same shape. GNUnet's architecture is
390based on legos:
391
392
393
394This chapter documents the GNUnet lego system, also known as GNUnet's system
395architecture.
396
397The most common GNUnet component is a service. Services offer an API (or
398several, depending on what you count as "an API") which is implemented as a
399library. The library communicates with the main process of the service using a
400service-specific network protocol. The main process of the service typically
401doesn't fully provide everything that is needed --- it has holes to be filled
402by APIs to other services.
403
404A special kind of component in GNUnet are user interfaces and daemons. Like
405services, they have holes to be filled by APIs of other services. Unlike
406services, daemons do not implement their own network protocol and they have no
407API:
408
409The GNUnet system provides a range of services, daemons and user interfaces,
410which are then combined into a layered GNUnet instance (also known as a peer).
411
412Note that while it is generally possible to swap one service for another
413compatible service, there is often only one implementation. However, during
414development we often have a "new" version of a service in parallel with an
415"old" version. While the "new" version is not working, developers working on
416other parts of the service can continue their development by simply using the
417"old" service. Alternative design ideas can also be easily investigated by
418swapping out individual components. This is typically achieved by simply
419changing the name of the "BINARY" in the respective configuration section.
420
421Key properties of GNUnet services are that they must be separate processes and
422that they must protect themselves by applying tight error checking against the
423network protocol they implement (thereby achieving a certain degree of
424robustness).
425
426On the other hand, the APIs are implemented to tolerate failures of the
427service, isolating their host process from errors by the service. If the
428service process crashes, other services and daemons around it should not also
429fail, but instead wait for the service process to be restarted by ARM.
430
431
432@c ***************************************************************************
433@node Subsystem stability
434@section Subsystem stability
435
436This page documents the current stability of the various GNUnet subsystems.
437Stability here describes the expected degree of compatibility with future
438versions of GNUnet. For each subsystem we distinguish between compatibility on
439the P2P network level (communication protocol between peers), the IPC level
440(communication between the service and the service library) and the API level
441(stability of the API). P2P compatibility is relevant in terms of which
442applications are likely going to be able to communicate with future versions of
443the network. IPC communication is relevant for the implementation of language
444bindings that re-implement the IPC messages. Finally, API compatibility is
445relevant to developers that hope to be able to avoid changes to applications
446build on top of the APIs of the framework.
447
448The following table summarizes our current view of the stability of the
449respective protocols or APIs:
450
451@multitable @columnfractions .20 .20 .20 .20
452@headitem Subsystem @tab P2P @tab IPC @tab C API
453@item util @tab n/a @tab n/a @tab stable
454@item arm @tab n/a @tab stable @tab stable
455@item ats @tab n/a @tab unstable @tab testing
456@item block @tab n/a @tab n/a @tab stable
457@item cadet @tab testing @tab testing @tab testing
458@item consensus @tab experimental @tab experimental @tab experimental
459@item core @tab stable @tab stable @tab stable
460@item datacache @tab n/a @tab n/a @tab stable
461@item datastore @tab n/a @tab stable @tab stable
462@item dht @tab stable @tab stable @tab stable
463@item dns @tab stable @tab stable @tab stable
464@item dv @tab testing @tab testing @tab n/a
465@item exit @tab testing @tab n/a @tab n/a
466@item fragmentation @tab stable @tab n/a @tab stable
467@item fs @tab stable @tab stable @tab stable
468@item gns @tab stable @tab stable @tab stable
469@item hello @tab n/a @tab n/a @tab testing
470@item hostlist @tab stable @tab stable @tab n/a
471@item identity @tab stable @tab stable @tab n/a
472@item multicast @tab experimental @tab experimental @tab experimental
473@item mysql @tab stable @tab n/a @tab stable
474@item namestore @tab n/a @tab stable @tab stable
475@item nat @tab n/a @tab n/a @tab stable
476@item nse @tab stable @tab stable @tab stable
477@item peerinfo @tab n/a @tab stable @tab stable
478@item psyc @tab experimental @tab experimental @tab experimental
479@item pt @tab n/a @tab n/a @tab n/a
480@item regex @tab stable @tab stable @tab stable
481@item revocation @tab stable @tab stable @tab stable
482@item social @tab experimental @tab experimental @tab experimental
483@item statistics @tab n/a @tab stable @tab stable
484@item testbed @tab n/a @tab testing @tab testing
485@item testing @tab n/a @tab n/a @tab testing
486@item topology @tab n/a @tab n/a @tab n/a
487@item transport @tab stable @tab stable @tab stable
488@item tun @tab n/a @tab n/a @tab stable
489@item vpn @tab testing @tab n/a @tab n/a
490@end multitable
491
492Here is a rough explanation of the values:
493
494@table @samp
495@item stable
496No incompatible changes are planned at this time; for IPC/APIs, if
497there are incompatible changes, they will be minor and might only require
498minimal changes to existing code; for P2P, changes will be avoided if at all
499possible for the 0.10.x-series
500
501@item testing
502No incompatible changes are
503planned at this time, but the code is still known to be in flux; so while we
504have no concrete plans, our expectation is that there will still be minor
505modifications; for P2P, changes will likely be extensions that should not break
506existing code
507
508@item unstable
509Changes are planned and will happen; however, they
510will not be totally radical and the result should still resemble what is there
511now; nevertheless, anticipated changes will break protocol/API compatibility
512
513@item experimental
514Changes are planned and the result may look nothing like
515what the API/protocol looks like today
516
517@item unknown
518Someone should think about where this subsystem headed
519
520@item n/a
521This subsystem does not have an API/IPC-protocol/P2P-protocol
522@end table
523
524@c ***************************************************************************
525@node Naming conventions and coding style guide
526@section Naming conventions and coding style guide
527
528Here you can find some rules to help you write code for GNUnet.
529
530
531
532@c ***************************************************************************
533@menu
534* Naming conventions::
535* Coding style::
536@end menu
537
538@node Naming conventions
539@subsection Naming conventions
540
541
542@c ***************************************************************************
543@menu
544* include files::
545* binaries::
546* logging::
547* configuration::
548* exported symbols::
549* private (library-internal) symbols (including structs and macros)::
550* testcases::
551* performance tests::
552* src/ directories::
553@end menu
554
555@node include files
556@subsubsection include files
557
558@itemize @bullet
559@item _lib: library without need for a process
560@item _service: library that needs a service process
561@item _plugin: plugin definition
562@item _protocol: structs used in network protocol
563@item exceptions:
564@itemize @bullet
565@item gnunet_config.h --- generated
566@item platform.h --- first included
567@item plibc.h --- external library
568@item gnunet_common.h --- fundamental routines
569@item gnunet_directories.h --- generated
570@item gettext.h --- external library
571@end itemize
572@end itemize
573
574@c ***************************************************************************
575@node binaries
576@subsubsection binaries
577
578@itemize @bullet
579@item gnunet-service-xxx: service process (has listen socket)
580@item gnunet-daemon-xxx: daemon process (no listen socket)
581@item gnunet-helper-xxx[-yyy]: SUID helper for module xxx
582@item gnunet-yyy: command-line tool for end-users
583@item libgnunet_plugin_xxx_yyy.so: plugin for API xxx
584@item libgnunetxxx.so: library for API xxx
585@end itemize
586
587@c ***************************************************************************
588@node logging
589@subsubsection logging
590
591@itemize @bullet
592@item services and daemons use their directory name in GNUNET_log_setup (i.e.
593'core') and log using plain 'GNUNET_log'.
594@item command-line tools use their full name in GNUNET_log_setup (i.e.
595'gnunet-publish') and log using plain 'GNUNET_log'.
596@item service access libraries log using 'GNUNET_log_from' and use
597'DIRNAME-api' for the component (i.e. 'core-api')
598@item pure libraries (without associated service) use 'GNUNET_log_from' with
599the component set to their library name (without lib or '.so'), which should
600also be their directory name (i.e. 'nat')
601@item plugins should use 'GNUNET_log_from' with the directory name and the
602plugin name combined to produce the component name (i.e. 'transport-tcp').
603@item logging should be unified per-file by defining a LOG macro with the
604appropriate arguments, along these lines:@ #define LOG(kind,...)
605GNUNET_log_from (kind, "example-api",__VA_ARGS__)
606@end itemize
607
608@c ***************************************************************************
609@node configuration
610@subsubsection configuration
611
612@itemize @bullet
613@item paths (that are substituted in all filenames) are in PATHS (have as few
614as possible)
615@item all options for a particular module (src/MODULE) are under [MODULE]
616@item options for a plugin of a module are under [MODULE-PLUGINNAME]
617@end itemize
618
619@c ***************************************************************************
620@node exported symbols
621@subsubsection exported symbols
622
623@itemize @bullet
624@item must start with "GNUNET_modulename_" and be defined in "modulename.c"
625@item exceptions: those defined in gnunet_common.h
626@end itemize
627
628@c ***************************************************************************
629@node private (library-internal) symbols (including structs and macros)
630@subsubsection private (library-internal) symbols (including structs and macros)
631
632@itemize @bullet
633@item must NOT start with any prefix
634@item must not be exported in a way that linkers could use them or@ other
635libraries might see them via headers; they must be either@ declared/defined in
636C source files or in headers that are in@ the respective directory under
637src/modulename/ and NEVER be@ declared in src/include/.
638@end itemize
639
640@node testcases
641@subsubsection testcases
642
643@itemize @bullet
644@item must be called "test_module-under-test_case-description.c"
645@item "case-description" maybe omitted if there is only one test
646@end itemize
647
648@c ***************************************************************************
649@node performance tests
650@subsubsection performance tests
651
652@itemize @bullet
653@item must be called "perf_module-under-test_case-description.c"
654@item "case-description" maybe omitted if there is only one performance test
655@item Must only be run if HAVE_BENCHMARKS is satisfied
656@end itemize
657
658@c ***************************************************************************
659@node src/ directories
660@subsubsection src/ directories
661
662@itemize @bullet
663@item gnunet-NAME: end-user applications (i.e., gnunet-search, gnunet-arm)
664@item gnunet-service-NAME: service processes with accessor library (i.e.,
665gnunet-service-arm)
666@item libgnunetNAME: accessor library (_service.h-header) or standalone library
667(_lib.h-header)
668@item gnunet-daemon-NAME: daemon process without accessor library (i.e.,
669gnunet-daemon-hostlist) and no GNUnet management port
670@item libgnunet_plugin_DIR_NAME: loadable plugins (i.e.,
671libgnunet_plugin_transport_tcp)
672@end itemize
673
674@c ***************************************************************************
675@node Coding style
676@subsection Coding style
677
678@itemize @bullet
679@item GNU guidelines generally apply
680@item Indentation is done with spaces, two per level, no tabs
681@item C99 struct initialization is fine
682@item declare only one variable per line, so@
683
684@example
685int i; int j;
686@end example
687
688instead of
689
690@example
691int i,j;
692@end example
693
694This helps keep diffs small and forces developers to think precisely about the
695type of every variable. Note that @code{char *} is different from @code{const
696char*} and @code{int} is different from @code{unsigned int} or @code{uint32_t}.
697Each variable type should be chosen with care.
698
699@item While @code{goto} should generally be avoided, having a @code{goto} to
700the end of a function to a block of clean up statements (free, close, etc.) can
701be acceptable.
702
703@item Conditions should be written with constants on the left (to avoid
704accidental assignment) and with the 'true' target being either the 'error' case
705or the significantly simpler continuation. For example:@
706
707@example
708if (0 != stat ("filename," &sbuf)) @{ error(); @} else @{
709 /* handle normal case here */
710@}
711@end example
712
713
714instead of
715@example
716if (stat ("filename," &sbuf) == 0) @{
717 /* handle normal case here */
718@} else @{ error(); @}
719@end example
720
721
722If possible, the error clause should be terminated with a 'return' (or 'goto'
723to some cleanup routine) and in this case, the 'else' clause should be omitted:
724@example
725if (0 != stat ("filename," &sbuf)) @{ error(); return; @}
726/* handle normal case here */
727@end example
728
729
730This serves to avoid deep nesting. The 'constants on the left' rule applies to
731all constants (including. @code{GNUNET_SCHEDULER_NO_TASK}), NULL, and enums).
732With the two above rules (constants on left, errors in 'true' branch), there is
733only one way to write most branches correctly.
734
735@item Combined assignments and tests are allowed if they do not hinder code
736clarity. For example, one can write:@
737
738@example
739if (NULL == (value = lookup_function())) @{ error(); return; @}
740@end example
741
742
743@item Use @code{break} and @code{continue} wherever possible to avoid deep(er)
744nesting. Thus, we would write:@
745
746@example
747next = head; while (NULL != (pos = next)) @{ next = pos->next; if (!
748should_free (pos)) continue; GNUNET_CONTAINER_DLL_remove (head, tail, pos);
749GNUNET_free (pos); @}
750@end example
751
752
753instead of
754@example
755next = head; while (NULL != (pos = next)) @{ next =
756pos->next; if (should_free (pos)) @{
757 /* unnecessary nesting! */
758 GNUNET_CONTAINER_DLL_remove (head, tail, pos); GNUNET_free (pos); @} @}
759@end example
760
761
762@item We primarily use @code{for} and @code{while} loops. A @code{while} loop
763is used if the method for advancing in the loop is not a straightforward
764increment operation. In particular, we use:@
765
766@example
767next = head;
768while (NULL != (pos = next))
769@{
770 next = pos->next;
771 if (! should_free (pos))
772 continue;
773 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
774 GNUNET_free (pos);
775@}
776@end example
777
778
779to free entries in a list (as the iteration changes the structure of the list
780due to the free; the equivalent @code{for} loop does no longer follow the
781simple @code{for} paradigm of @code{for(INIT;TEST;INC)}). However, for loops
782that do follow the simple @code{for} paradigm we do use @code{for}, even if it
783involves linked lists:
784@example
785/* simple iteration over a linked list */
786for (pos = head; NULL != pos; pos = pos->next)
787@{
788 use (pos);
789@}
790@end example
791
792
793@item The first argument to all higher-order functions in GNUnet must be
794declared to be of type @code{void *} and is reserved for a closure. We do not
795use inner functions, as trampolines would conflict with setups that use
796non-executable stacks.@ The first statement in a higher-order function, which
797unusually should be part of the variable declarations, should assign the
798@code{cls} argument to the precise expected type. For example:
799@example
800int callback (void *cls, char *args) @{
801 struct Foo *foo = cls; int other_variables;
802
803 /* rest of function */
804@}
805@end example
806
807
808@item It is good practice to write complex @code{if} expressions instead of
809using deeply nested @code{if} statements. However, except for addition and
810multiplication, all operators should use parens. This is fine:@
811
812@example
813if ( (1 == foo) || ((0 == bar) && (x != y)) )
814 return x;
815@end example
816
817
818However, this is not:
819@example
820if (1 == foo)
821 return x;
822if (0 == bar && x != y)
823 return x;
824@end example
825
826
827Note that splitting the @code{if} statement above is debateable as the
828@code{return x} is a very trivial statement. However, once the logic after the
829branch becomes more complicated (and is still identical), the "or" formulation
830should be used for sure.
831
832@item There should be two empty lines between the end of the function and the
833comments describing the following function. There should be a single empty line
834after the initial variable declarations of a function. If a function has no
835local variables, there should be no initial empty line. If a long function
836consists of several complex steps, those steps might be separated by an empty
837line (possibly followed by a comment describing the following step). The code
838should not contain empty lines in arbitrary places; if in doubt, it is likely
839better to NOT have an empty line (this way, more code will fit on the screen).
840@end itemize
841
842@c ***************************************************************************
843@node Build-system
844@section Build-system
845
846If you have code that is likely not to compile or build rules you might want to
847not trigger for most developers, use "if HAVE_EXPERIMENTAL" in your
848Makefile.am. Then it is OK to (temporarily) add non-compiling (or
849known-to-not-port) code.
850
851If you want to compile all testcases but NOT run them, run configure with the@
852@code{--enable-test-suppression} option.
853
854If you want to run all testcases, including those that take a while, run
855configure with the@ @code{--enable-expensive-testcases} option.
856
857If you want to compile and run benchmarks, run configure with the@
858@code{--enable-benchmarks} option.
859
860If you want to obtain code coverage results, run configure with the@
861@code{--enable-coverage} option and run the coverage.sh script in contrib/.
862
863@c ***************************************************************************
864@node Developing extensions for GNUnet using the gnunet-ext template
865@section Developing extensions for GNUnet using the gnunet-ext template
866
867
868For developers who want to write extensions for GNUnet we provide the
869gnunet-ext template to provide an easy to use skeleton.
870
871gnunet-ext contains the build environment and template files for the
872development of GNUnet services, command line tools, APIs and tests.
873
874First of all you have to obtain gnunet-ext from git:
875
876@code{git clone https://gnunet.org/git/gnunet-ext.git}
877
878The next step is to bootstrap and configure it. For configure you have to
879provide the path containing GNUnet with @code{--with-gnunet=/path/to/gnunet}
880and the prefix where you want the install the extension using
881@code{--prefix=/path/to/install}@ @code{@ ./bootstrap@ ./configure
882--prefix=/path/to/install --with-gnunet=/path/to/gnunet@ }
883
884When your GNUnet installation is not included in the default linker search
885path, you have to add @code{/path/to/gnunet} to the file @code{/etc/ld.so.conf}
886and run @code{ldconfig} or your add it to the environmental variable
887@code{LD_LIBRARY_PATH} by using
888
889@code{export LD_LIBRARY_PATH=/path/to/gnunet/lib}
890
891@c ***************************************************************************
892@node Writing testcases
893@section Writing testcases
894
895Ideally, any non-trivial GNUnet code should be covered by automated testcases.
896Testcases should reside in the same place as the code that is being tested. The
897name of source files implementing tests should begin with "test_" followed by
898the name of the file that contains the code that is being tested.
899
900Testcases in GNUnet should be integrated with the autotools build system. This
901way, developers and anyone building binary packages will be able to run all
902testcases simply by running @code{make check}. The final testcases shipped with
903the distribution should output at most some brief progress information and not
904display debug messages by default. The success or failure of a testcase must be
905indicated by returning zero (success) or non-zero (failure) from the main
906method of the testcase. The integration with the autotools is relatively
907straightforward and only requires modifications to the @code{Makefile.am} in
908the directory containing the testcase. For a testcase testing the code in
909@code{foo.c} the @code{Makefile.am} would contain the following lines:
910@example
911check_PROGRAMS = test_foo TESTS = $(check_PROGRAMS) test_foo_SOURCES =
912test_foo.c test_foo_LDADD = $(top_builddir)/src/util/libgnunetutil.la
913@end example
914
915Naturally, other libraries used by the testcase may be specified in the
916@code{LDADD} directive as necessary.
917
918Often testcases depend on additional input files, such as a configuration file.
919These support files have to be listed using the EXTRA_DIST directive in order
920to ensure that they are included in the distribution. Example:
921@example
922EXTRA_DIST = test_foo_data.conf
923@end example
924
925
926Executing @code{make check} will run all testcases in the current directory and
927all subdirectories. Testcases can be compiled individually by running
928@code{make test_foo} and then invoked directly using @code{./test_foo}. Note
929that due to the use of plugins in GNUnet, it is typically necessary to run
930@code{make install} before running any testcases. Thus the canonical command
931@code{make check install} has to be changed to @code{make install check} for
932GNUnet.
933
934@c ***************************************************************************
935@node GNUnet's TESTING library
936@section GNUnet's TESTING library
937
938The TESTING library is used for writing testcases which involve starting a
939single or multiple peers. While peers can also be started by testcases using
940the ARM subsystem, using TESTING library provides an elegant way to do this.
941The configurations of the peers are auto-generated from a given template to
942have non-conflicting port numbers ensuring that peers' services do not run into
943bind errors. This is achieved by testing ports' availability by binding a
944listening socket to them before allocating them to services in the generated
945configurations.
946
947An another advantage while using TESTING is that it shortens the testcase
948startup time as the hostkeys for peers are copied from a pre-computed set of
949hostkeys instead of generating them at peer startup which may take a
950considerable amount of time when starting multiple peers or on an embedded
951processor.
952
953TESTING also allows for certain services to be shared among peers. This feature
954is invaluable when testing with multiple peers as it helps to reduce the number
955of services run per each peer and hence the total number of processes run per
956testcase.
957
958TESTING library only handles creating, starting and stopping peers. Features
959useful for testcases such as connecting peers in a topology are not available
960in TESTING but are available in the TESTBED subsystem. Furthermore, TESTING
961only creates peers on the localhost, however by using TESTBED testcases can
962benefit from creating peers across multiple hosts.
963
964@menu
965* API::
966* Finer control over peer stop::
967* Helper functions::
968* Testing with multiple processes::
969@end menu
970
971@c ***************************************************************************
972@node API
973@subsection API
974
975TESTING abstracts a group of peers as a TESTING system. All peers in a system
976have common hostname and no two services of these peers have a same port or a
977UNIX domain socket path.
978
979TESTING system can be created with the function
980@code{GNUNET_TESTING_system_create()} which returns a handle to the system.
981This function takes a directory path which is used for generating the
982configurations of peers, an IP address from which connections to the peers'
983services should be allowed, the hostname to be used in peers' configuration,
984and an array of shared service specifications of type @code{struct
985GNUNET_TESTING_SharedService}.
986
987The shared service specification must specify the name of the service to share,
988the configuration pertaining to that shared service and the maximum number of
989peers that are allowed to share a single instance of the shared service.
990
991TESTING system created with @code{GNUNET_TESTING_system_create()} chooses ports
992from the default range 12000 - 56000 while auto-generating configurations for
993peers. This range can be customised with the function
994@code{GNUNET_TESTING_system_create_with_portrange()}. This function is similar
995to @code{GNUNET_TESTING_system_create()} except that it take 2 additional
996parameters --- the start and end of the port range to use.
997
998A TESTING system is destroyed with the funciton
999@code{GNUNET_TESTING_system_destory()}. This function takes the handle of the
1000system and a flag to remove the files created in the directory used to generate
1001configurations.
1002
1003A peer is created with the function @code{GNUNET_TESTING_peer_configure()}.
1004This functions takes the system handle, a configuration template from which the
1005configuration for the peer is auto-generated and the index from where the
1006hostkey for the peer has to be copied from. When successfull, this function
1007returs a handle to the peer which can be used to start and stop it and to
1008obtain the identity of the peer. If unsuccessful, a NULL pointer is returned
1009with an error message. This function handles the generated configuration to
1010have non-conflicting ports and paths.
1011
1012Peers can be started and stopped by calling the functions
1013@code{GNUNET_TESTING_peer_start()} and @code{GNUNET_TESTING_peer_stop()}
1014respectively. A peer can be destroyed by calling the function
1015@code{GNUNET_TESTING_peer_destroy}. When a peer is destroyed, the ports and
1016paths in allocated in its configuration are reclaimed for usage in new
1017peers.
1018
1019@c ***************************************************************************
1020@node Finer control over peer stop
1021@subsection Finer control over peer stop
1022
1023Using @code{GNUNET_TESTING_peer_stop()} is normally fine for testcases.
1024However, calling this function for each peer is inefficient when trying to
1025shutdown multiple peers as this function sends the termination signal to the
1026given peer process and waits for it to terminate. It would be faster in this
1027case to send the termination signals to the peers first and then wait on them.
1028This is accomplished by the functions @code{GNUNET_TESTING_peer_kill()} which
1029sends a termination signal to the peer, and the function
1030@code{GNUNET_TESTING_peer_wait()} which waits on the peer.
1031
1032Further finer control can be achieved by choosing to stop a peer asynchronously
1033with the function @code{GNUNET_TESTING_peer_stop_async()}. This function takes
1034a callback parameter and a closure for it in addition to the handle to the peer
1035to stop. The callback function is called with the given closure when the peer
1036is stopped. Using this function eliminates blocking while waiting for the peer
1037to terminate.
1038
1039An asynchronous peer stop can be cancelled by calling the function
1040@code{GNUNET_TESTING_peer_stop_async_cancel()}. Note that calling this function
1041does not prevent the peer from terminating if the termination signal has
1042already been sent to it. It does, however, cancels the callback to be called
1043when the peer is stopped.
1044
1045@c ***************************************************************************
1046@node Helper functions
1047@subsection Helper functions
1048
1049Most of the testcases can benefit from an abstraction which configures a peer
1050and starts it. This is provided by the function
1051@code{GNUNET_TESTING_peer_run()}. This function takes the testing directory
1052pathname, a configuration template, a callback and its closure. This function
1053creates a peer in the given testing directory by using the configuration
1054template, starts the peer and calls the given callback with the given closure.
1055
1056The function @code{GNUNET_TESTING_peer_run()} starts the ARM service of the
1057peer which starts the rest of the configured services. A similar function
1058@code{GNUNET_TESTING_service_run} can be used to just start a single service of
1059a peer. In this case, the peer's ARM service is not started; instead, only the
1060given service is run.
1061
1062@c ***************************************************************************
1063@node Testing with multiple processes
1064@subsection Testing with multiple processes
1065
1066When testing GNUnet, the splitting of the code into a services and clients
1067often complicates testing. The solution to this is to have the testcase fork
1068@code{gnunet-service-arm}, ask it to start the required server and daemon
1069processes and then execute appropriate client actions (to test the client APIs
1070or the core module or both). If necessary, multiple ARM services can be forked
1071using different ports (!) to simulate a network. However, most of the time only
1072one ARM process is needed. Note that on exit, the testcase should shutdown ARM
1073with a @code{TERM} signal (to give it the chance to cleanly stop its child
1074processes).
1075
1076The following code illustrates spawning and killing an ARM process from a
1077testcase:
1078@example
1079static void run (void *cls, char *const *args, const char
1080*cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) @{ struct
1081GNUNET_OS_Process *arm_pid; arm_pid = GNUNET_OS_start_process (NULL, NULL,
1082"gnunet-service-arm", "gnunet-service-arm", "-c", cfgname, NULL);
1083 /* do real test work here */
1084 if (0 != GNUNET_OS_process_kill (arm_pid, SIGTERM)) GNUNET_log_strerror
1085 (GNUNET_ERROR_TYPE_WARNING, "kill"); GNUNET_assert (GNUNET_OK ==
1086 GNUNET_OS_process_wait (arm_pid)); GNUNET_OS_process_close (arm_pid); @}
1087
1088GNUNET_PROGRAM_run (argc, argv, "NAME-OF-TEST", "nohelp", options, &run, cls);
1089@end example
1090
1091
1092An alternative way that works well to test plugins is to implement a
1093mock-version of the environment that the plugin expects and then to simply load
1094the plugin directly.
1095
1096@c ***************************************************************************
1097@node Performance regression analysis with Gauger
1098@section Performance regression analysis with Gauger
1099
1100To help avoid performance regressions, GNUnet uses Gauger. Gauger is a simple
1101logging tool that allows remote hosts to send performance data to a central
1102server, where this data can be analyzed and visualized. Gauger shows graphs of
1103the repository revisions and the performace data recorded for each revision, so
1104sudden performance peaks or drops can be identified and linked to a specific
1105revision number.
1106
1107In the case of GNUnet, the buildbots log the performance data obtained during
1108the tests after each build. The data can be accesed on GNUnet's Gauger page.
1109
1110The menu on the left allows to select either the results of just one build bot
1111(under "Hosts") or review the data from all hosts for a given test result
1112(under "Metrics"). In case of very different absolute value of the results, for
1113instance arm vs. amd64 machines, the option "Normalize" on a metric view can
1114help to get an idea about the performance evolution across all hosts.
1115
1116Using Gauger in GNUnet and having the performance of a module tracked over time
1117is very easy. First of course, the testcase must generate some consistent
1118metric, which makes sense to have logged. Highly volatile or random dependant
1119metrics probably are not ideal candidates for meaningful regression detection.
1120
1121To start logging any value, just include @code{gauger.h} in your testcase code.
1122Then, use the macro @code{GAUGER()} to make the buildbots log whatever value is
1123of interest for you to @code{gnunet.org}'s Gauger server. No setup is necessary
1124as most buildbots have already everything in place and new metrics are created
1125on demand. To delete a metric, you need to contact a member of the GNUnet
1126development team (a file will need to be removed manually from the respective
1127directory).
1128
1129The code in the test should look like this:
1130@example
1131[other includes]
1132#include <gauger.h>
1133
1134int main (int argc, char *argv[]) @{
1135
1136 [run test, generate data] GAUGER("YOUR_MODULE", "METRIC_NAME", (float)value,
1137 "UNIT"); @}
1138@end example
1139
1140
1141Where:
1142@table @asis
1143
1144@item @strong{YOUR_MODULE} is a category in the gauger page and should be the
1145name of the module or subsystem like "Core" or "DHT"
1146@item @strong{METRIC} is
1147the name of the metric being collected and should be concise and descriptive,
1148like "PUT operations in sqlite-datastore".
1149@item @strong{value} is the value
1150of the metric that is logged for this run.
1151@item @strong{UNIT} is the unit in
1152which the value is measured, for instance "kb/s" or "kb of RAM/node".
1153@end table
1154
1155If you wish to use Gauger for your own project, you can grab a copy of the
1156latest stable release or check out Gauger's Subversion repository.
1157
1158@c ***************************************************************************
1159@node GNUnet's TESTBED Subsystem
1160@section GNUnet's TESTBED Subsystem
1161
1162The TESTBED subsystem facilitates testing and measuring of multi-peer
1163deployments on a single host or over multiple hosts.
1164
1165The architecture of the testbed module is divided into the following:
1166@itemize @bullet
1167
1168@item Testbed API: An API which is used by the testing driver programs. It
1169provides with functions for creating, destroying, starting, stopping peers,
1170etc.
1171
1172@item Testbed service (controller): A service which is started through the
1173Testbed API. This service handles operations to create, destroy, start, stop
1174peers, connect them, modify their configurations.
1175
1176@item Testbed helper: When a controller has to be started on a host, the
1177testbed API starts the testbed helper on that host which in turn starts the
1178controller. The testbed helper receives a configuration for the controller
1179through its stdin and changes it to ensure the controller doesn't run into any
1180port conflict on that host.
1181@end itemize
1182
1183
1184The testbed service (controller) is different from the other GNUnet services in
1185that it is not started by ARM and is not supposed to be run as a daemon. It is
1186started by the testbed API through a testbed helper. In a typical scenario
1187involving multiple hosts, a controller is started on each host. Controllers
1188take up the actual task of creating peers, starting and stopping them on the
1189hosts they run.
1190
1191While running deployments on a single localhost the testbed API starts the
1192testbed helper directly as a child process. When running deployments on remote
1193hosts the testbed API starts Testbed Helpers on each remote host through remote
1194shell. By default testbed API uses SSH as a remote shell. This can be changed
1195by setting the environmental variable GNUNET_TESTBED_RSH_CMD to the required
1196remote shell program. This variable can also contain parameters which are to be
1197passed to the remote shell program. For e.g:@ @code{@ export
1198GNUNET_TESTBED_RSH_CMD="ssh -o BatchMode=yes -o
1199NoHostAuthenticationForLocalhost=yes %h"@ }@ Substitutions are allowed int the
1200above command string also allows for substitions. through placemarks which
1201begin with a `%'. At present the following substitutions are supported
1202@itemize @bullet
1203@item
1204%h: hostname
1205@item
1206%u: username
1207@item
1208%p: port
1209@end itemize
1210
1211Note that the substitution placemark is replaced only when the corresponding
1212field is available and only once. Specifying @code{%u@@%h} doesn't work either.
1213If you want to user username substitutions for SSH use the argument @code{-l}
1214before the username substitution. Ex: @code{ssh -l %u -p %p %h}
1215
1216The testbed API and the helper communicate through the helpers stdin and
1217stdout. As the helper is started through a remote shell on remote hosts any
1218output messages from the remote shell interfere with the communication and
1219results in a failure while starting the helper. For this reason, it is
1220suggested to use flags to make the remote shells produce no output messages and
1221to have password-less logins. The default remote shell, SSH, the default
1222options are "-o BatchMode=yes -o NoHostBasedAuthenticationForLocalhost=yes".
1223Password-less logins should be ensured by using SSH keys.
1224
1225Since the testbed API executes the remote shell as a non-interactive shell,
1226certain scripts like .bashrc, .profiler may not be executed. If this is the
1227case testbed API can be forced to execute an interactive shell by setting up
1228the environmental variable `GNUNET_TESTBED_RSH_CMD_SUFFIX' to a shell program.
1229An example could be:@ @code{@ export GNUNET_TESTBED_RSH_CMD_SUFFIX="sh -lc"@ }@
1230The testbed API will then execute the remote shell program as: @code{
1231$GNUNET_TESTBED_RSH_CMD -p $port $dest $GNUNET_TESTBED_RSH_CMD_SUFFIX
1232gnunet-helper-testbed }
1233
1234On some systems, problems may arise while starting testbed helpers if GNUnet is
1235installed into a custom location since the helper may not be found in the
1236standard path. This can be addressed by setting the variable
1237`HELPER_BINARY_PATH' to the path of the testbed helper. Testbed API will then
1238use this path to start helper binaries both locally and remotely.
1239
1240Testbed API can accessed by including "gnunet_testbed_service.h" file and
1241linking with -lgnunettestbed.
1242
1243
1244
1245@c ***************************************************************************
1246@menu
1247* Supported Topologies::
1248* Hosts file format::
1249* Topology file format::
1250* Testbed Barriers::
1251* Automatic large-scale deployment of GNUnet in the PlanetLab testbed::
1252* TESTBED Caveats::
1253@end menu
1254
1255@node Supported Topologies
1256@subsection Supported Topologies
1257
1258While testing multi-peer deployments, it is often needed that the peers are
1259connected in some topology. This requirement is addressed by the function
1260@code{GNUNET_TESTBED_overlay_connect()} which connects any given two peers in
1261the testbed.
1262
1263The API also provides a helper function
1264@code{GNUNET_TESTBED_overlay_configure_topology()} to connect a given set of
1265peers in any of the following supported topologies:
1266@itemize @bullet
1267
1268@item @code{GNUNET_TESTBED_TOPOLOGY_CLIQUE}: All peers are connected with each
1269other
1270
1271@item @code{GNUNET_TESTBED_TOPOLOGY_LINE}: Peers are connected to form a line
1272
1273@item @code{GNUNET_TESTBED_TOPOLOGY_RING}: Peers are connected to form a ring
1274topology
1275
1276@item @code{GNUNET_TESTBED_TOPOLOGY_2D_TORUS}: Peers are connected to form a 2
1277dimensional torus topology. The number of peers may not be a perfect square, in
1278that case the resulting torus may not have the uniform poloidal and toroidal
1279lengths
1280
1281@item @code{GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI}: Topology is generated to form
1282a random graph. The number of links to be present should be given
1283
1284@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD}: Peers are connected to form a
12852D Torus with some random links among them. The number of random links are to
1286be given
1287
1288@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING}: Peers are connected to
1289form a ring with some random links among them. The number of random links are
1290to be given
1291
1292@item @code{GNUNET_TESTBED_TOPOLOGY_SCALE_FREE}: Connects peers in a topology
1293where peer connectivity follows power law - new peers are connected with high
1294probabililty to well connected peers. See Emergence of Scaling in Random
1295Networks. Science 286, 509-512, 1999.
1296
1297@item @code{GNUNET_TESTBED_TOPOLOGY_FROM_FILE}: The topology information is
1298loaded from a file. The path to the file has to be given. See Topology file
1299format for the format of this file.
1300
1301@item @code{GNUNET_TESTBED_TOPOLOGY_NONE}: No topology
1302@end itemize
1303
1304
1305The above supported topologies can be specified respectively by setting the
1306variable @code{OVERLAY_TOPOLOGY} to the following values in the configuration
1307passed to Testbed API functions @code{GNUNET_TESTBED_test_run()} and
1308@code{GNUNET_TESTBED_run()}:
1309@itemize @bullet
1310@item @code{CLIQUE}
1311@item @code{RING}
1312@item @code{LINE}
1313@item @code{2D_TORUS}
1314@item @code{RANDOM}
1315@item @code{SMALL_WORLD}
1316@item @code{SMALL_WORLD_RING}
1317@item @code{SCALE_FREE}
1318@item @code{FROM_FILE}
1319@item @code{NONE}
1320@end itemize
1321
1322
1323Topologies @code{RANDOM}, @code{SMALL_WORLD} and @code{SMALL_WORLD_RING}
1324require the option @code{OVERLAY_RANDOM_LINKS} to be set to the number of
1325random links to be generated in the configuration. The option will be ignored
1326for the rest of the topologies.
1327
1328Topology @code{SCALE_FREE} requires the options @code{SCALE_FREE_TOPOLOGY_CAP}
1329to be set to the maximum number of peers which can connect to a peer and
1330@code{SCALE_FREE_TOPOLOGY_M} to be set to how many peers a peer should be
1331atleast connected to.
1332
1333Similarly, the topology @code{FROM_FILE} requires the option
1334@code{OVERLAY_TOPOLOGY_FILE} to contain the path of the file containing the
1335topology information. This option is ignored for the rest of the topologies.
1336See Topology file format for the format of this file.
1337
1338@c ***************************************************************************
1339@node Hosts file format
1340@subsection Hosts file format
1341
1342The testbed API offers the function GNUNET_TESTBED_hosts_load_from_file() to
1343load from a given file details about the hosts which testbed can use for
1344deploying peers. This function is useful to keep the data about hosts separate
1345instead of hard coding them in code.
1346
1347Another helper function from testbed API, GNUNET_TESTBED_run() also takes a
1348hosts file name as its parameter. It uses the above function to populate the
1349hosts data structures and start controllers to deploy peers.
1350
1351These functions require the hosts file to be of the following format:
1352@itemize @bullet
1353@item Each line is interpreted to have details about a host
1354@item Host details should include the username to use for logging into the
1355host, the hostname of the host and the port number to use for the remote shell
1356program. All thee values should be given.
1357@item These details should be given in the following format:
1358@code{<username>@@<hostname>:<port>}
1359@end itemize
1360
1361Note that having canonical hostnames may cause problems while resolving the IP
1362addresses (See this bug). Hence it is advised to provide the hosts' IP
1363numerical addresses as hostnames whenever possible.
1364
1365@c ***************************************************************************
1366@node Topology file format
1367@subsection Topology file format
1368
1369A topology file describes how peers are to be connected. It should adhere to
1370the following format for testbed to parse it correctly.
1371
1372Each line should begin with the target peer id. This should be followed by a
1373colon(`:') and origin peer ids seperated by `|'. All spaces except for newline
1374characters are ignored. The API will then try to connect each origin peer to
1375the target peer.
1376
1377For example, the following file will result in 5 overlay connections: [2->1],
1378[3->1],[4->3], [0->3], [2->0]@ @code{@ 1:2|3@ 3:4| 0@ 0: 2@ }
1379
1380@c ***************************************************************************
1381@node Testbed Barriers
1382@subsection Testbed Barriers
1383
1384The testbed subsystem's barriers API facilitates coordination among the peers
1385run by the testbed and the experiment driver. The concept is similar to the
1386barrier synchronisation mechanism found in parallel programming or
1387multi-threading paradigms - a peer waits at a barrier upon reaching it until
1388the barrier is reached by a predefined number of peers. This predefined number
1389of peers required to cross a barrier is also called quorum. We say a peer has
1390reached a barrier if the peer is waiting for the barrier to be crossed.
1391Similarly a barrier is said to be reached if the required quorum of peers reach
1392the barrier. A barrier which is reached is deemed as crossed after all the
1393peers waiting on it are notified.
1394
1395The barriers API provides the following functions:
1396@itemize @bullet
1397@item @strong{@code{GNUNET_TESTBED_barrier_init()}:} function to initialse a
1398barrier in the experiment
1399@item @strong{@code{GNUNET_TESTBED_barrier_cancel()}:} function to cancel a
1400barrier which has been initialised before
1401@item @strong{@code{GNUNET_TESTBED_barrier_wait()}:} function to signal barrier
1402service that the caller has reached a barrier and is waiting for it to be
1403crossed
1404@item @strong{@code{GNUNET_TESTBED_barrier_wait_cancel()}:} function to stop
1405waiting for a barrier to be crossed
1406@end itemize
1407
1408
1409Among the above functions, the first two, namely
1410@code{GNUNET_TESTBED_barrier_init()} and @code{GNUNET_TESTBED_barrier_cancel()}
1411are used by experiment drivers. All barriers should be initialised by the
1412experiment driver by calling @code{GNUNET_TESTBED_barrier_init()}. This
1413function takes a name to identify the barrier, the quorum required for the
1414barrier to be crossed and a notification callback for notifying the experiment
1415driver when the barrier is crossed. @code{GNUNET_TESTBED_barrier_cancel()}
1416cancels an initialised barrier and frees the resources allocated for it. This
1417function can be called upon a initialised barrier before it is crossed.
1418
1419The remaining two functions @code{GNUNET_TESTBED_barrier_wait()} and
1420@code{GNUNET_TESTBED_barrier_wait_cancel()} are used in the peer's processes.
1421@code{GNUNET_TESTBED_barrier_wait()} connects to the local barrier service
1422running on the same host the peer is running on and registers that the caller
1423has reached the barrier and is waiting for the barrier to be crossed. Note that
1424this function can only be used by peers which are started by testbed as this
1425function tries to access the local barrier service which is part of the testbed
1426controller service. Calling @code{GNUNET_TESTBED_barrier_wait()} on an
1427uninitialised barrier results in failure.
1428@code{GNUNET_TESTBED_barrier_wait_cancel()} cancels the notification registered
1429by @code{GNUNET_TESTBED_barrier_wait()}.
1430
1431
1432@c ***************************************************************************
1433@menu
1434* Implementation::
1435@end menu
1436
1437@node Implementation
1438@subsubsection Implementation
1439
1440Since barriers involve coordination between experiment driver and peers, the
1441barrier service in the testbed controller is split into two components. The
1442first component responds to the message generated by the barrier API used by
1443the experiment driver (functions @code{GNUNET_TESTBED_barrier_init()} and
1444@code{GNUNET_TESTBED_barrier_cancel()}) and the second component to the
1445messages generated by barrier API used by peers (functions
1446@code{GNUNET_TESTBED_barrier_wait()} and
1447@code{GNUNET_TESTBED_barrier_wait_cancel()}).
1448
1449Calling @code{GNUNET_TESTBED_barrier_init()} sends a
1450@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_INIT} message to the master
1451controller. The master controller then registers a barrier and calls
1452@code{GNUNET_TESTBED_barrier_init()} for each its subcontrollers. In this way
1453barrier initialisation is propagated to the controller hierarchy. While
1454propagating initialisation, any errors at a subcontroller such as timeout
1455during further propagation are reported up the hierarchy back to the experiment
1456driver.
1457
1458Similar to @code{GNUNET_TESTBED_barrier_init()},
1459@code{GNUNET_TESTBED_barrier_cancel()} propagates
1460@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_CANCEL} message which causes
1461controllers to remove an initialised barrier.
1462
1463The second component is implemented as a separate service in the binary
1464`gnunet-service-testbed' which already has the testbed controller service.
1465Although this deviates from the gnunet process architecture of having one
1466service per binary, it is needed in this case as this component needs access to
1467barrier data created by the first component. This component responds to
1468@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages from local peers when
1469they call @code{GNUNET_TESTBED_barrier_wait()}. Upon receiving
1470@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} message, the service checks if
1471the requested barrier has been initialised before and if it was not
1472initialised, an error status is sent through
1473@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to the local peer and
1474the connection from the peer is terminated. If the barrier is initialised
1475before, the barrier's counter for reached peers is incremented and a
1476notification is registered to notify the peer when the barrier is reached. The
1477connection from the peer is left open.
1478
1479When enough peers required to attain the quorum send
1480@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages, the controller sends
1481a @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to its parent
1482informing that the barrier is crossed. If the controller has started further
1483subcontrollers, it delays this message until it receives a similar notification
1484from each of those subcontrollers. Finally, the barriers API at the experiment
1485driver receives the @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} when the
1486barrier is reached at all the controllers.
1487
1488The barriers API at the experiment driver responds to the
1489@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message by echoing it back to
1490the master controller and notifying the experiment controller through the
1491notification callback that a barrier has been crossed. The echoed
1492@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message is propagated by the
1493master controller to the controller hierarchy. This propagation triggers the
1494notifications registered by peers at each of the controllers in the hierarchy.
1495Note the difference between this downward propagation of the
1496@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message from its upward
1497propagation --- the upward propagation is needed for ensuring that the barrier
1498is reached by all the controllers and the downward propagation is for
1499triggering that the barrier is crossed.
1500
1501@c ***************************************************************************
1502@node Automatic large-scale deployment of GNUnet in the PlanetLab testbed
1503@subsection Automatic large-scale deployment of GNUnet in the PlanetLab testbed
1504
1505PlanetLab is as a testbed for computer networking and distributed systems
1506research. It was established in 2002 and as of June 2010 was composed of 1090
1507nodes at 507 sites worldwide.
1508
1509To automate the GNUnet we created a set of automation tools to simplify the
1510large-scale deployment. We provide you a set of scripts you can use to deploy
1511GNUnet on a set of nodes and manage your installation.
1512
1513Please also check @uref{https://gnunet.org/installation-fedora8-svn} and@
1514@uref{https://gnunet.org/installation-fedora12-svn} to find detailled
1515instructions how to install GNUnet on a PlanetLab node.
1516
1517
1518@c ***************************************************************************
1519@menu
1520* PlanetLab Automation for Fedora8 nodes::
1521* Install buildslave on PlanetLab nodes running fedora core 8::
1522* Setup a new PlanetLab testbed using GPLMT::
1523* Why do i get an ssh error when using the regex profiler?::
1524@end menu
1525
1526@node PlanetLab Automation for Fedora8 nodes
1527@subsubsection PlanetLab Automation for Fedora8 nodes
1528
1529@c ***************************************************************************
1530@node Install buildslave on PlanetLab nodes running fedora core 8
1531@subsubsection Install buildslave on PlanetLab nodes running fedora core 8
1532@c ** Actually this is a subsubsubsection, but must be fixed differently
1533@c ** as subsubsection is the lowest.
1534
1535Since most of the PlanetLab nodes are running the very old fedora core 8 image,
1536installing the buildslave software is quite some pain. For our PlanetLab
1537testbed we figured out how to install the buildslave software best.
1538
1539Install Distribute for python:@ @code{@ curl
1540http://python-distribute.org/distribute_setup.py | sudo python@ }
1541
1542Install Distribute for zope.interface <= 3.8.0 (4.0 and 4.0.1 will not work):@
1543@code{@ wget
1544http://pypi.python.org/packages/source/z/zope.interface/zope.interface-3.8.0.tar.gz@
1545tar zvfz zope.interface-3.8.0.tar.gz@ cd zope.interface-3.8.0@ sudo python
1546setup.py install@ }
1547
1548Install the buildslave software (0.8.6 was the latest version):@ @code{@ wget
1549http://buildbot.googlecode.com/files/buildbot-slave-0.8.6p1.tar.gz@ tar xvfz
1550buildbot-slave-0.8.6p1.tar.gz@ cd buildslave-0.8.6p1@ sudo python setup.py
1551install@ }
1552
1553The setup will download the matching twisted package and install it.@ It will
1554also try to install the latest version of zope.interface which will fail to
1555install. Buildslave will work anyway since version 3.8.0 was installed before!
1556
1557@c ***************************************************************************
1558@node Setup a new PlanetLab testbed using GPLMT
1559@subsubsection Setup a new PlanetLab testbed using GPLMT
1560
1561@itemize @bullet
1562@item Get a new slice and assign nodes
1563Ask your PlanetLab PI to give you a new slice and assign the nodes you need
1564@item Install a buildmaster
1565You can stick to the buildbot documentation:@
1566@uref{http://buildbot.net/buildbot/docs/current/manual/installation.html}
1567@item Install the buildslave software on all nodes
1568To install the buildslave on all nodes assigned to your slice you can use the
1569tasklist @code{install_buildslave_fc8.xml} provided with GPLMT:
1570
1571@code{@ ./gplmt.py -c contrib/tumple_gnunet.conf -t
1572contrib/tasklists/install_buildslave_fc8.xml -a -p <planetlab password>@ }
1573
1574@item Create the buildmaster configuration and the slave setup commands
1575
1576The master and the and the slaves have need to have credentials and the master
1577has to have all nodes configured. This can be done with the
1578@code{create_buildbot_configuration.py} script in the @code{scripts} directory
1579
1580This scripts takes a list of nodes retrieved directly from PlanetLab or read
1581from a file and a configuration template and creates:@
1582 - a tasklist which can be executed with gplmt to setup the slaves@
1583 - a master.cfg file containing a PlanetLab nodes
1584
1585A configuration template is included in the <contrib>, most important is that
1586the script replaces the following tags in the template:
1587
1588%GPLMT_BUILDER_DEFINITION :@ GPLMT_BUILDER_SUMMARY@ GPLMT_SLAVES@
1589%GPLMT_SCHEDULER_BUILDERS
1590
1591Create configuration for all nodes assigned to a slice:@ @code{@
1592./create_buildbot_configuration.py -u <planetlab username> -p <planetlab
1593password> -s <slice> -m <buildmaster+port> -t <template>@ }@ Create
1594configuration for some nodes in a file:@ @code{@
1595./create_buildbot_configuration.p -f <node_file> -m <buildmaster+port> -t
1596<template>@ }
1597
1598@item Copy the @code{master.cfg} to the buildmaster and start it
1599Use @code{buildbot start <basedir>} to start the server
1600@item Setup the buildslaves
1601@end itemize
1602
1603@c ***************************************************************************
1604@node Why do i get an ssh error when using the regex profiler?
1605@subsubsection Why do i get an ssh error when using the regex profiler?
1606
1607Why do i get an ssh error "Permission denied (publickey,password)." when using
1608the regex profiler although passwordless ssh to localhost works using publickey
1609and ssh-agent?
1610
1611You have to generate a public/private-key pair with no password:@
1612@code{ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_localhost}@
1613and then add the following to your ~/.ssh/config file:
1614
1615@code{Host 127.0.0.1@ IdentityFile ~/.ssh/id_localhost}
1616
1617now make sure your hostsfile looks like@
1618
1619[USERNAME]@@127.0.0.1:22@
1620[USERNAME]@@127.0.0.1:22
1621
1622You can test your setup by running `ssh 127.0.0.1` in a terminal and then in
1623the opened session run it again. If you were not asked for a password on either
1624login, then you should be good to go.
1625
1626@c ***************************************************************************
1627@node TESTBED Caveats
1628@subsection TESTBED Caveats
1629
1630This section documents a few caveats when using the GNUnet testbed
1631subsystem.
1632
1633
1634@c ***************************************************************************
1635@menu
1636* CORE must be started::
1637* ATS must want the connections::
1638@end menu
1639
1640@node CORE must be started
1641@subsubsection CORE must be started
1642
1643A simple issue is #3993: Your configuration MUST somehow ensure that for each
1644peer the CORE service is started when the peer is setup, otherwise TESTBED may
1645fail to connect peers when the topology is initialized, as TESTBED will start
1646some CORE services but not necessarily all (but it relies on all of them
1647running). The easiest way is to set 'FORCESTART = YES' in the '[core]' section
1648of the configuration file. Alternatively, having any service that directly or
1649indirectly depends on CORE being started with FORCESTART will also do. This
1650issue largely arises if users try to over-optimize by not starting any services
1651with FORCESTART.
1652
1653@c ***************************************************************************
1654@node ATS must want the connections
1655@subsubsection ATS must want the connections
1656
1657When TESTBED sets up connections, it only offers the respective HELLO
1658information to the TRANSPORT service. It is then up to the ATS service to
1659@strong{decide} to use the connection. The ATS service will typically eagerly
1660establish any connection if the number of total connections is low (relative to
1661bandwidth). Details may further depend on the specific ATS backend that was
1662configured. If ATS decides to NOT establish a connection (even though TESTBED
1663provided the required information), then that connection will count as failed
1664for TESTBED. Note that you can configure TESTBED to tolerate a certain number
1665of connection failures (see '-e' option of gnunet-testbed-profiler). This issue
1666largely arises for dense overlay topologies, especially if you try to create
1667cliques with more than 20 peers.
1668
1669@c ***************************************************************************
1670@node libgnunetutil
1671@section libgnunetutil
1672
1673libgnunetutil is the fundamental library that all GNUnet code builds upon.
1674Ideally, this library should contain most of the platform dependent code
1675(except for user interfaces and really special needs that only few applications
1676have). It is also supposed to offer basic services that most if not all GNUnet
1677binaries require. The code of libgnunetutil is in the src/util/ directory. The
1678public interface to the library is in the gnunet_util.h header. The functions
1679provided by libgnunetutil fall roughly into the following categories (in
1680roughly the order of importance for new developers):
1681@itemize @bullet
1682@item logging (common_logging.c)
1683@item memory allocation (common_allocation.c)
1684@item endianess conversion (common_endian.c)
1685@item internationalization (common_gettext.c)
1686@item String manipulation (string.c)
1687@item file access (disk.c)
1688@item buffered disk IO (bio.c)
1689@item time manipulation (time.c)
1690@item configuration parsing (configuration.c)
1691@item command-line handling (getopt*.c)
1692@item cryptography (crypto_*.c)
1693@item data structures (container_*.c)
1694@item CPS-style scheduling (scheduler.c)
1695@item Program initialization (program.c)
1696@item Networking (network.c, client.c, server*.c, service.c)
1697@item message queueing (mq.c)
1698@item bandwidth calculations (bandwidth.c)
1699@item Other OS-related (os*.c, plugin.c, signal.c)
1700@item Pseudonym management (pseudonym.c)
1701@end itemize
1702
1703It should be noted that only developers that fully understand this entire API
1704will be able to write good GNUnet code.
1705
1706Ideally, porting GNUnet should only require porting the gnunetutil library.
1707More testcases for the gnunetutil APIs are therefore a great way to make
1708porting of GNUnet easier.
1709
1710@menu
1711* Logging::
1712* Interprocess communication API (IPC)::
1713* Cryptography API::
1714* Message Queue API::
1715* Service API::
1716* Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps::
1717* The CONTAINER_MDLL API::
1718@end menu
1719
1720@c ***************************************************************************
1721@node Logging
1722@subsection Logging
1723
1724GNUnet is able to log its activity, mostly for the purposes of debugging the
1725program at various levels.
1726
1727@file{gnunet_common.h} defines several @strong{log levels}:
1728@table @asis
1729
1730@item ERROR for errors (really problematic situations, often leading to
1731crashes)
1732@item WARNING for warnings (troubling situations that might have
1733negative consequences, although not fatal)
1734@item INFO for various information.
1735Used somewhat rarely, as GNUnet statistics is used to hold and display most of
1736the information that users might find interesting.
1737@item DEBUG for debugging.
1738Does not produce much output on normal builds, but when extra logging is
1739enabled at compile time, a staggering amount of data is outputted under this
1740log level.
1741@end table
1742
1743
1744Normal builds of GNUnet (configured with @code{--enable-logging[=yes]}) are
1745supposed to log nothing under DEBUG level. The @code{--enable-logging=verbose}
1746configure option can be used to create a build with all logging enabled.
1747However, such build will produce large amounts of log data, which is
1748inconvenient when one tries to hunt down a specific problem.
1749
1750To mitigate this problem, GNUnet provides facilities to apply a filter to
1751reduce the logs:
1752@table @asis
1753
1754@item Logging by default When no log levels are configured in any other way
1755(see below), GNUnet will default to the WARNING log level. This mostly applies
1756to GNUnet command line utilities, services and daemons; tests will always set
1757log level to WARNING or, if @code{--enable-logging=verbose} was passed to
1758configure, to DEBUG. The default level is suggested for normal operation.
1759@item The -L option Most GNUnet executables accept an "-L loglevel" or
1760"--log=loglevel" option. If used, it makes the process set a global log level
1761to "loglevel". Thus it is possible to run some processes with -L DEBUG, for
1762example, and others with -L ERROR to enable specific settings to diagnose
1763problems with a particular process.
1764@item Configuration files. Because GNUnet
1765service and deamon processes are usually launched by gnunet-arm, it is not
1766possible to pass different custom command line options directly to every one of
1767them. The options passed to @code{gnunet-arm} only affect gnunet-arm and not
1768the rest of GNUnet. However, one can specify a configuration key "OPTIONS" in
1769the section that corresponds to a service or a daemon, and put a value of "-L
1770loglevel" there. This will make the respective service or daemon set its log
1771level to "loglevel" (as the value of OPTIONS will be passed as a command-line
1772argument).
1773
1774To specify the same log level for all services without creating separate
1775"OPTIONS" entries in the configuration for each one, the user can specify a
1776config key "GLOBAL_POSTFIX" in the [arm] section of the configuration file. The
1777value of GLOBAL_POSTFIX will be appended to all command lines used by the ARM
1778service to run other services. It can contain any option valid for all GNUnet
1779commands, thus in particular the "-L loglevel" option. The ARM service itself
1780is, however, unaffected by GLOBAL_POSTFIX; to set log level for it, one has to
1781specify "OPTIONS" key in the [arm] section.
1782@item Environment variables.
1783Setting global per-process log levels with "-L loglevel" does not offer
1784sufficient log filtering granularity, as one service will call interface
1785libraries and supporting libraries of other GNUnet services, potentially
1786producing lots of debug log messages from these libraries. Also, changing the
1787config file is not always convenient (especially when running the GNUnet test
1788suite).@ To fix that, and to allow GNUnet to use different log filtering at
1789runtime without re-compiling the whole source tree, the log calls were changed
1790to be configurable at run time. To configure them one has to define environment
1791variables "GNUNET_FORCE_LOGFILE", "GNUNET_LOG" and/or "GNUNET_FORCE_LOG":
1792@itemize @bullet
1793
1794@item "GNUNET_LOG" only affects the logging when no global log level is
1795configured by any other means (that is, the process does not explicitly set its
1796own log level, there are no "-L loglevel" options on command line or in
1797configuration files), and can be used to override the default WARNING log
1798level.
1799
1800@item "GNUNET_FORCE_LOG" will completely override any other log configuration
1801options given.
1802
1803@item "GNUNET_FORCE_LOGFILE" will completely override the location of the file
1804to log messages to. It should contain a relative or absolute file name. Setting
1805GNUNET_FORCE_LOGFILE is equivalent to passing "--log-file=logfile" or "-l
1806logfile" option (see below). It supports "[]" format in file names, but not
1807"@{@}" (see below).
1808@end itemize
1809
1810
1811Because environment variables are inherited by child processes when they are
1812launched, starting or re-starting the ARM service with these variables will
1813propagate them to all other services.
1814
1815"GNUNET_LOG" and "GNUNET_FORCE_LOG" variables must contain a specially
1816formatted @strong{logging definition} string, which looks like this:@ @code{@
1817[component];[file];[function];[from_line[-to_line]];loglevel@emph{[/component...]}@
1818}@ That is, a logging definition consists of definition entries, separated by
1819slashes ('/'). If only one entry is present, there is no need to add a slash
1820to its end (although it is not forbidden either).@ All definition fields
1821(component, file, function, lines and loglevel) are mandatory, but (except for
1822the loglevel) they can be empty. An empty field means "match anything". Note
1823that even if fields are empty, the semicolon (';') separators must be
1824present.@ The loglevel field is mandatory, and must contain one of the log
1825level names (ERROR, WARNING, INFO or DEBUG).@ The lines field might contain
1826one non-negative number, in which case it matches only one line, or a range
1827"from_line-to_line", in which case it matches any line in the interval
1828[from_line;to_line] (that is, including both start and end line).@ GNUnet
1829mostly defaults component name to the name of the service that is implemented
1830in a process ('transport', 'core', 'peerinfo', etc), but logging calls can
1831specify custom component names using @code{GNUNET_log_from}.@ File name and
1832function name are provided by the compiler (__FILE__ and __FUNCTION__
1833built-ins).
1834
1835Component, file and function fields are interpreted as non-extended regular
1836expressions (GNU libc regex functions are used). Matching is case-sensitive, ^
1837and $ will match the beginning and the end of the text. If a field is empty,
1838its contents are automatically replaced with a ".*" regular expression, which
1839matches anything. Matching is done in the default way, which means that the
1840expression matches as long as it's contained anywhere in the string. Thus
1841"GNUNET_" will match both "GNUNET_foo" and "BAR_GNUNET_BAZ". Use '^' and/or '$'
1842to make sure that the expression matches at the start and/or at the end of the
1843string.@ The semicolon (';') can't be escaped, and GNUnet will not use it in
1844component names (it can't be used in function names and file names anyway).@
1845
1846@end table
1847
1848
1849Every logging call in GNUnet code will be (at run time) matched against the
1850log definitions passed to the process. If a log definition fields are matching
1851the call arguments, then the call log level is compared the the log level of
1852that definition. If the call log level is less or equal to the definition log
1853level, the call is allowed to proceed. Otherwise the logging call is
1854forbidden, and nothing is logged. If no definitions matched at all, GNUnet
1855will use the global log level or (if a global log level is not specified) will
1856default to WARNING (that is, it will allow the call to proceed, if its level
1857is less or equal to the global log level or to WARNING).
1858
1859That is, definitions are evaluated from left to right, and the first matching
1860definition is used to allow or deny the logging call. Thus it is advised to
1861place narrow definitions at the beginning of the logdef string, and generic
1862definitions - at the end.
1863
1864Whether a call is allowed or not is only decided the first time this particular
1865call is made. The evaluation result is then cached, so that any attempts to
1866make the same call later will be allowed or disallowed right away. Because of
1867that runtime log level evaluation should not significantly affect the process
1868performance.@ Log definition parsing is only done once, at the first call to
1869GNUNET_log_setup () made by the process (which is usually done soon after it
1870starts).
1871
1872At the moment of writing there is no way to specify logging definitions from
1873configuration files, only via environment variables.
1874
1875At the moment GNUnet will stop processing a log definition when it encounters
1876an error in definition formatting or an error in regular expression syntax, and
1877will not report the failure in any way.
1878
1879
1880@c ***************************************************************************
1881@menu
1882* Examples::
1883* Log files::
1884* Updated behavior of GNUNET_log::
1885@end menu
1886
1887@node Examples
1888@subsubsection Examples
1889
1890@table @asis
1891
1892@item @code{GNUNET_FORCE_LOG=";;;;DEBUG" gnunet-arm -s} Start GNUnet process
1893tree, running all processes with DEBUG level (one should be careful with it, as
1894log files will grow at alarming rate!)
1895@item @code{GNUNET_FORCE_LOG="core;;;;DEBUG" gnunet-arm -s} Start GNUnet process
1896tree, running the core service under DEBUG level (everything else will use
1897configured or default level).
1898@item @code{GNUNET_FORCE_LOG=";gnunet-service-transport_validation.c;;;DEBUG" gnunet-arm -s}
1899Start GNUnet process tree, allowing any logging calls from
1900gnunet-service-transport_validation.c (everything else will use configured or
1901default level).
1902@item @code{GNUNET_FORCE_LOG="fs;gnunet-service-fs_push.c;;;DEBUG" gnunet-arm -s}
1903Start GNUnet process tree, allowing any logging calls from
1904gnunet-gnunet-service-fs_push.c (everything else will use configured or default
1905level).
1906@item @code{GNUNET_FORCE_LOG=";;GNUNET_NETWORK_socket_select;;DEBUG" gnunet-arm -s}
1907Start GNUnet process tree, allowing any logging calls from the
1908GNUNET_NETWORK_socket_select function (everything else will use configured or
1909default level).
1910@item @code{GNUNET_FORCE_LOG="transport.*;;.*send.*;;DEBUG/;;;;WARNING" gnunet-arm -s}
1911Start GNUnet process tree, allowing any logging calls from the components
1912that have "transport" in their names, and are made from function that have
1913"send" in their names. Everything else will be allowed to be logged only if it
1914has WARNING level.
1915@end table
1916
1917
1918On Windows, one can use batch files to run GNUnet processes with special
1919environment variables, without affecting the whole system. Such batch file will
1920look like this:@ @code{@ set GNUNET_FORCE_LOG=;;do_transmit;;DEBUG@ gnunet-arm
1921-s@ }@ (note the absence of double quotes in the environment variable
1922definition, as opposed to earlier examples, which use the shell).@ Another
1923limitation, on Windows, GNUNET_FORCE_LOGFILE @strong{MUST} be set in order to
1924GNUNET_FORCE_LOG to work.
1925
1926
1927@c ***************************************************************************
1928@node Log files
1929@subsubsection Log files
1930
1931GNUnet can be told to log everything into a file instead of stderr (which is
1932the default) using the "--log-file=logfile" or "-l logfile" option. This option
1933can also be passed via command line, or from the "OPTION" and "GLOBAL_POSTFIX"
1934configuration keys (see above). The file name passed with this option is
1935subject to GNUnet filename expansion. If specified in "GLOBAL_POSTFIX", it is
1936also subject to ARM service filename expansion, in particular, it may contain
1937"@{@}" (left and right curly brace) sequence, which will be replaced by ARM
1938with the name of the service. This is used to keep logs from more than one
1939service separate, while only specifying one template containing "@{@}" in
1940GLOBAL_POSTFIX.
1941
1942As part of a secondary file name expansion, the first occurrence of "[]"
1943sequence ("left square brace" followed by "right square brace") in the file
1944name will be replaced with a process identifier or the process when it
1945initializes its logging subsystem. As a result, all processes will log into
1946different files. This is convenient for isolating messages of a particular
1947process, and prevents I/O races when multiple processes try to write into the
1948file at the same time. This expansion is done independently of "@{@}"
1949expansion that ARM service does (see above).
1950
1951The log file name that is specified via "-l" can contain format characters
1952from the 'strftime' function family. For example, "%Y" will be replaced with
1953the current year. Using "basename-%Y-%m-%d.log" would include the current
1954year, month and day in the log file. If a GNUnet process runs for long enough
1955to need more than one log file, it will eventually clean up old log files.
1956Currently, only the last three log files (plus the current log file) are
1957preserved. So once the fifth log file goes into use (so after 4 days if you
1958use "%Y-%m-%d" as above), the first log file will be automatically deleted.
1959Note that if your log file name only contains "%Y", then log files would be
1960kept for 4 years and the logs from the first year would be deleted once year 5
1961begins. If you do not use any date-related string format codes, logs would
1962never be automatically deleted by GNUnet.
1963
1964
1965@c ***************************************************************************
1966
1967@node Updated behavior of GNUNET_log
1968@subsubsection Updated behavior of GNUNET_log
1969
1970It's currently quite common to see constructions like this all over the code:
1971@example
1972#if MESH_DEBUG GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MESH: client
1973disconnected\n"); #endif
1974@end example
1975
1976The reason for the #if is not to avoid displaying the message when disabled
1977(GNUNET_ERROR_TYPE takes care of that), but to avoid the compiler including it
1978in the binary at all, when compiling GNUnet for platforms with restricted
1979storage space / memory (MIPS routers, ARM plug computers / dev boards, etc).
1980
1981This presents several problems: the code gets ugly, hard to write and it is
1982very easy to forget to include the #if guards, creating non-consistent code. A
1983new change in GNUNET_log aims to solve these problems.
1984
1985@strong{This change requires to @code{./configure} with at least
1986@code{--enable-logging=verbose} to see debug messages.}
1987
1988Here is an example of code with dense debug statements:
1989@example
1990switch (restrict_topology) @{
1991case GNUNET_TESTING_TOPOLOGY_CLIQUE: #if VERBOSE_TESTING
1992GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but clique
1993topology\n")); #endif unblacklisted_connections = create_clique (pg,
1994&remove_connections, BLACKLIST, GNUNET_NO); break; case
1995GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING: #if VERBOSE_TESTING GNUNET_log
1996(GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but small world (ring)
1997topology\n")); #endif unblacklisted_connections = create_small_world_ring (pg,
1998&remove_connections, BLACKLIST); break;
1999@end example
2000
2001
2002Pretty hard to follow, huh?
2003
2004From now on, it is not necessary to include the #if / #endif statements to
2005acheive the same behavior. The GNUNET_log and GNUNET_log_from macros take care
2006of it for you, depending on the configure option:
2007@itemize @bullet
2008@item If @code{--enable-logging} is set to @code{no}, the binary will contain
2009no log messages at all.
2010@item If @code{--enable-logging} is set to @code{yes}, the binary will contain
2011no DEBUG messages, and therefore running with -L DEBUG will have no effect.
2012Other messages (ERROR, WARNING, INFO, etc) will be included.
2013@item If @code{--enable-logging} is set to @code{verbose}, or
2014@code{veryverbose} the binary will contain DEBUG messages (still, it will be
2015neccessary to run with -L DEBUG or set the DEBUG config option to show them).
2016@end itemize
2017
2018
2019If you are a developer:
2020@itemize @bullet
2021@item please make sure that you @code{./configure
2022--enable-logging=@{verbose,veryverbose@}}, so you can see DEBUG messages.
2023@item please remove the @code{#if} statements around @code{GNUNET_log
2024(GNUNET_ERROR_TYPE_DEBUG, ...)} lines, to improve the readibility of your code.
2025@end itemize
2026
2027Since now activating DEBUG automatically makes it VERBOSE and activates
2028@strong{all} debug messages by default, you probably want to use the
2029https://gnunet.org/logging functionality to filter only relevant messages. A
2030suitable configuration could be:@ @code{$ export
2031GNUNET_FORCE_LOG="^YOUR_SUBSYSTEM$;;;;DEBUG/;;;;WARNING"}@ Which will behave
2032almost like enabling DEBUG in that subsytem before the change. Of course you
2033can adapt it to your particular needs, this is only a quick example.
2034
2035@c ***************************************************************************
2036@node Interprocess communication API (IPC)
2037@subsection Interprocess communication API (IPC)
2038
2039In GNUnet a variety of new message types might be defined and used in
2040interprocess communication, in this tutorial we use the @code{struct
2041AddressLookupMessage} as a example to introduce how to construct our own
2042message type in GNUnet and how to implement the message communication between
2043service and client.@ (Here, a client uses the @code{struct
2044AddressLookupMessage} as a request to ask the server to return the address of
2045any other peer connecting to the service.)
2046
2047
2048@c ***************************************************************************
2049@menu
2050* Define new message types::
2051* Define message struct::
2052* Client - Establish connection::
2053* Client - Initialize request message::
2054* Client - Send request and receive response::
2055* Server - Startup service::
2056* Server - Add new handles for specified messages::
2057* Server - Process request message::
2058* Server - Response to client::
2059* Server - Notification of clients::
2060* Conversion between Network Byte Order (Big Endian) and Host Byte Order::
2061@end menu
2062
2063@node Define new message types
2064@subsubsection Define new message types
2065
2066First of all, you should define the new message type in
2067@code{gnunet_protocols.h}:
2068@example
2069 // Request to look addresses of peers in server.
2070#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP 29
2071 // Response to the address lookup request.
2072#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY 30
2073@end example
2074
2075@c ***************************************************************************
2076@node Define message struct
2077@subsubsection Define message struct
2078
2079After the type definition, the specified message structure should also be
2080described in the header file, e.g. transport.h in our case.
2081@example
2082GNUNET_NETWORK_STRUCT_BEGIN
2083
2084struct AddressLookupMessage @{ struct GNUNET_MessageHeader header; int32_t
2085numeric_only GNUNET_PACKED; struct GNUNET_TIME_AbsoluteNBO timeout; uint32_t
2086addrlen GNUNET_PACKED;
2087 /* followed by 'addrlen' bytes of the actual address, then
2088 followed by the 0-terminated name of the transport */ @};
2089 GNUNET_NETWORK_STRUCT_END
2090@end example
2091
2092
2093Please note @code{GNUNET_NETWORK_STRUCT_BEGIN} and @code{GNUNET_PACKED} which
2094both ensure correct alignment when sending structs over the network
2095
2096@menu
2097@end menu
2098
2099@c ***************************************************************************
2100@node Client - Establish connection
2101@subsubsection Client - Establish connection
2102@c %**end of header
2103
2104
2105At first, on the client side, the underlying API is employed to create a new
2106connection to a service, in our example the transport service would be
2107connected.
2108@example
2109struct GNUNET_CLIENT_Connection *client; client =
2110GNUNET_CLIENT_connect ("transport", cfg);
2111@end example
2112
2113@c ***************************************************************************
2114@node Client - Initialize request message
2115@subsubsection Client - Initialize request message
2116@c %**end of header
2117
2118When the connection is ready, we initialize the message. In this step, all the
2119fields of the message should be properly initialized, namely the size, type,
2120and some extra user-defined data, such as timeout, name of transport, address
2121and name of transport.
2122@example
2123struct AddressLookupMessage *msg; size_t len =
2124sizeof (struct AddressLookupMessage) + addressLen + strlen (nameTrans) + 1;
2125msg->header->size = htons (len); msg->header->type = htons
2126(GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP); msg->timeout =
2127GNUNET_TIME_absolute_hton (abs_timeout); msg->addrlen = htonl (addressLen);
2128char *addrbuf = (char *) &msg[1]; memcpy (addrbuf, address, addressLen); char
2129*tbuf = &addrbuf[addressLen]; memcpy (tbuf, nameTrans, strlen (nameTrans) + 1);
2130@end example
2131
2132Note that, here the functions @code{htonl}, @code{htons} and
2133@code{GNUNET_TIME_absolute_hton} are applied to convert little endian into big
2134endian, about the usage of the big/small edian order and the corresponding
2135conversion function please refer to Introduction of Big Endian and Little
2136Endian.
2137
2138@c ***************************************************************************
2139@node Client - Send request and receive response
2140@subsubsection Client - Send request and receive response
2141@c %**end of header
2142
2143FIXME: This is very outdated, see the tutorial for the
2144current API!
2145
2146Next, the client would send the constructed message as a request to the service
2147and wait for the response from the service. To accomplish this goal, there are
2148a number of API calls that can be used. In this example,
2149@code{GNUNET_CLIENT_transmit_and_get_response} is chosen as the most
2150appropriate function to use.
2151@example
2152GNUNET_CLIENT_transmit_and_get_response
2153(client, msg->header, timeout, GNUNET_YES, &address_response_processor,
2154arp_ctx);
2155@end example
2156
2157the argument @code{address_response_processor} is a function with
2158@code{GNUNET_CLIENT_MessageHandler} type, which is used to process the reply
2159message from the service.
2160
2161@node Server - Startup service
2162@subsubsection Server - Startup service
2163
2164After receiving the request message, we run a standard GNUnet service startup
2165sequence using @code{GNUNET_SERVICE_run}, as follows,
2166@example
2167int main(int
2168argc, char**argv) @{ GNUNET_SERVICE_run(argc, argv, "transport"
2169GNUNET_SERVICE_OPTION_NONE, &run, NULL)); @}
2170@end example
2171
2172@c ***************************************************************************
2173@node Server - Add new handles for specified messages
2174@subsubsection Server - Add new handles for specified messages
2175@c %**end of header
2176
2177in the function above the argument @code{run} is used to initiate transport
2178service,and defined like this:
2179@example
2180static void run (void *cls, struct
2181GNUNET_SERVER_Handle *serv, const struct GNUNET_CONFIGURATION_Handle *cfg) @{
2182GNUNET_SERVER_add_handlers (serv, handlers); @}
2183@end example
2184
2185
2186Here, @code{GNUNET_SERVER_add_handlers} must be called in the run function to
2187add new handlers in the service. The parameter @code{handlers} is a list of
2188@code{struct GNUNET_SERVER_MessageHandler} to tell the service which function
2189should be called when a particular type of message is received, and should be
2190defined in this way:
2191@example
2192static struct GNUNET_SERVER_MessageHandler
2193handlers[] = @{ @{&handle_start, NULL, GNUNET_MESSAGE_TYPE_TRANSPORT_START,
21940@}, @{&handle_send, NULL, GNUNET_MESSAGE_TYPE_TRANSPORT_SEND, 0@},
2195@{&handle_try_connect, NULL, GNUNET_MESSAGE_TYPE_TRANSPORT_TRY_CONNECT, sizeof
2196(struct TryConnectMessage)@}, @{&handle_address_lookup, NULL,
2197GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP, 0@}, @{NULL, NULL, 0, 0@} @};
2198@end example
2199
2200
2201As shown, the first member of the struct in the first area is a callback
2202function, which is called to process the specified message types, given as the
2203third member. The second parameter is the closure for the callback function,
2204which is set to @code{NULL} in most cases, and the last parameter is the
2205expected size of the message of this type, usually we set it to 0 to accept
2206variable size, for special cases the exact size of the specified message also
2207can be set. In addition, the terminator sign depicted as @code{@{NULL, NULL, 0,
22080@}} is set in the last aera.
2209
2210@c ***************************************************************************
2211@node Server - Process request message
2212@subsubsection Server - Process request message
2213@c %**end of header
2214
2215After the initialization of transport service, the request message would be
2216processed. Before handling the main message data, the validity of this message
2217should be checked out, e.g., to check whether the size of message is correct.
2218@example
2219size = ntohs (message->size); if (size < sizeof (struct
2220AddressLookupMessage)) @{ GNUNET_break_op (0); GNUNET_SERVER_receive_done
2221(client, GNUNET_SYSERR); return; @}
2222@end example
2223
2224
2225Note that, opposite to the construction method of the request message in the
2226client, in the server the function @code{nothl} and @code{ntohs} should be
2227employed during the extraction of the data from the message, so that the data
2228in big endian order can be converted back into little endian order. See more in
2229detail please refer to Introduction of Big Endian and Little Endian.
2230
2231Moreover in this example, the name of the transport stored in the message is a
22320-terminated string, so we should also check whether the name of the transport
2233in the received message is 0-terminated:
2234@example
2235nameTransport = (const char *)
2236&address[addressLen]; if (nameTransport[size - sizeof (struct
2237AddressLookupMessage)
2238 - addressLen - 1] != '\0') @{ GNUNET_break_op
2239 (0); GNUNET_SERVER_receive_done (client,
2240 GNUNET_SYSERR); return; @}
2241@end example
2242
2243Here, @code{GNUNET_SERVER_receive_done} should be called to tell the service
2244that the request is done and can receive the next message. The argument
2245@code{GNUNET_SYSERR} here indicates that the service didn't understand the
2246request message, and the processing of this request would be terminated.
2247
2248In comparison to the aforementioned situation, when the argument is equal to
2249@code{GNUNET_OK}, the service would continue to process the requst message.
2250
2251@c ***************************************************************************
2252@node Server - Response to client
2253@subsubsection Server - Response to client
2254@c %**end of header
2255
2256Once the processing of current request is done, the server should give the
2257response to the client. A new @code{struct AddressLookupMessage} would be
2258produced by the server in a similar way as the client did and sent to the
2259client, but here the type should be
2260@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY} rather than
2261@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP} in client.
2262@example
2263struct
2264AddressLookupMessage *msg; size_t len = sizeof (struct AddressLookupMessage) +
2265addressLen + strlen (nameTrans) + 1; msg->header->size = htons (len);
2266msg->header->type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2267
2268// ...
2269
2270struct GNUNET_SERVER_TransmitContext *tc; tc =
2271GNUNET_SERVER_transmit_context_create (client);
2272GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0,
2273GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2274GNUNET_SERVER_transmit_context_run (tc, rtimeout);
2275@end example
2276
2277
2278Note that, there are also a number of other APIs provided to the service to
2279send the message.
2280
2281@c ***************************************************************************
2282@node Server - Notification of clients
2283@subsubsection Server - Notification of clients
2284@c %**end of header
2285
2286Often a service needs to (repeatedly) transmit notifications to a client or a
2287group of clients. In these cases, the client typically has once registered for
2288a set of events and then needs to receive a message whenever such an event
2289happens (until the client disconnects). The use of a notification context can
2290help manage message queues to clients and handle disconnects. Notification
2291contexts can be used to send individualized messages to a particular client or
2292to broadcast messages to a group of clients. An individualized notification
2293might look like this:
2294@example
2295 GNUNET_SERVER_notification_context_unicast(nc,
2296 client, msg, GNUNET_YES);
2297@end example
2298
2299
2300Note that after processing the original registration message for notifications,
2301the server code still typically needs to call@
2302@code{GNUNET_SERVER_receive_done} so that the client can transmit further
2303messages to the server.
2304
2305@c ***************************************************************************
2306@node Conversion between Network Byte Order (Big Endian) and Host Byte Order
2307@subsubsection Conversion between Network Byte Order (Big Endian) and Host Byte Order
2308@c %** subsub? it's a referenced page on the ipc document.
2309@c %**end of header
2310
2311Here we can simply comprehend big endian and little endian as Network Byte
2312Order and Host Byte Order respectively. What is the difference between both
2313two?
2314
2315Usually in our host computer we store the data byte as Host Byte Order, for
2316example, we store a integer in the RAM which might occupies 4 Byte, as Host
2317Byte Order the higher Byte would be stored at the lower address of RAM, and
2318the lower Byte would be stored at the higher address of RAM. However, contrast
2319to this, Network Byte Order just take the totally opposite way to store the
2320data, says, it will store the lower Byte at the lower address, and the higher
2321Byte will stay at higher address.
2322
2323For the current communication of network, we normally exchange the information
2324by surveying the data package, every two host wants to communicate with each
2325other must send and receive data package through network. In order to maintain
2326the identity of data through the transmission in the network, the order of the
2327Byte storage must changed before sending and after receiving the data.
2328
2329There ten convenient functions to realize the conversion of Byte Order in
2330GNUnet, as following:
2331@table @asis
2332
2333@item uint16_t htons(uint16_t hostshort) Convert host byte order to net byte
2334order with short int
2335@item uint32_t htonl(uint32_t hostlong) Convert host byte
2336order to net byte order with long int
2337@item uint16_t ntohs(uint16_t netshort)
2338Convert net byte order to host byte order with short int
2339@item uint32_t
2340ntohl(uint32_t netlong) Convert net byte order to host byte order with long int
2341@item unsigned long long GNUNET_ntohll (unsigned long long netlonglong) Convert
2342net byte order to host byte order with long long int
2343@item unsigned long long
2344GNUNET_htonll (unsigned long long hostlonglong) Convert host byte order to net
2345byte order with long long int
2346@item struct GNUNET_TIME_RelativeNBO
2347GNUNET_TIME_relative_hton (struct GNUNET_TIME_Relative a) Convert relative time
2348to network byte order.
2349@item struct GNUNET_TIME_Relative
2350GNUNET_TIME_relative_ntoh (struct GNUNET_TIME_RelativeNBO a) Convert relative
2351time from network byte order.
2352@item struct GNUNET_TIME_AbsoluteNBO
2353GNUNET_TIME_absolute_hton (struct GNUNET_TIME_Absolute a) Convert relative time
2354to network byte order.
2355@item struct GNUNET_TIME_Absolute
2356GNUNET_TIME_absolute_ntoh (struct GNUNET_TIME_AbsoluteNBO a) Convert relative
2357time from network byte order.
2358@end table
2359
2360@c ***************************************************************************
2361
2362@node Cryptography API
2363@subsection Cryptography API
2364@c %**end of header
2365
2366The gnunetutil APIs provides the cryptographic primitives used in GNUnet.
2367GNUnet uses 2048 bit RSA keys for the session key exchange and for signing
2368messages by peers and most other public-key operations. Most researchers in
2369cryptography consider 2048 bit RSA keys as secure and practically unbreakable
2370for a long time. The API provides functions to create a fresh key pair, read a
2371private key from a file (or create a new file if the file does not exist),
2372encrypt, decrypt, sign, verify and extraction of the public key into a format
2373suitable for network transmission.
2374
2375For the encryption of files and the actual data exchanged between peers GNUnet
2376uses 256-bit AES encryption. Fresh, session keys are negotiated for every new
2377connection.@ Again, there is no published technique to break this cipher in any
2378realistic amount of time. The API provides functions for generation of keys,
2379validation of keys (important for checking that decryptions using RSA
2380succeeded), encryption and decryption.
2381
2382GNUnet uses SHA-512 for computing one-way hash codes. The API provides
2383functions to compute a hash over a block in memory or over a file on disk.
2384
2385The crypto API also provides functions for randomizing a block of memory,
2386obtaining a single random number and for generating a permuation of the numbers
23870 to n-1. Random number generation distinguishes between WEAK and STRONG random
2388number quality; WEAK random numbers are pseudo-random whereas STRONG random
2389numbers use entropy gathered from the operating system.
2390
2391Finally, the crypto API provides a means to deterministically generate a
23921024-bit RSA key from a hash code. These functions should most likely not be
2393used by most applications; most importantly,@
2394GNUNET_CRYPTO_rsa_key_create_from_hash does not create an RSA-key that should
2395be considered secure for traditional applications of RSA.
2396
2397@c ***************************************************************************
2398@node Message Queue API
2399@subsection Message Queue API
2400@c %**end of header
2401
2402@strong{ Introduction }@ Often, applications need to queue messages that are to
2403be sent to other GNUnet peers, clients or services. As all of GNUnet's
2404message-based communication APIs, by design, do not allow messages to be
2405queued, it is common to implement custom message queues manually when they are
2406needed. However, writing very similar code in multiple places is tedious and
2407leads to code duplication.
2408
2409MQ (for Message Queue) is an API that provides the functionality to implement
2410and use message queues. We intend to eventually replace all of the custom
2411message queue implementations in GNUnet with MQ.
2412
2413@strong{ Basic Concepts }@ The two most important entities in MQ are queues and
2414envelopes.
2415
2416Every queue is backed by a specific implementation (e.g. for mesh, stream,
2417connection, server client, etc.) that will actually deliver the queued
2418messages. For convenience,@ some queues also allow to specify a list of message
2419handlers. The message queue will then also wait for incoming messages and
2420dispatch them appropriately.
2421
2422An envelope holds the the memory for a message, as well as metadata (Where is
2423the envelope queued? What should happen after it has been sent?). Any envelope
2424can only be queued in one message queue.
2425
2426@strong{ Creating Queues }@ The following is a list of currently available
2427message queues. Note that to avoid layering issues, message queues for higher
2428level APIs are not part of @code{libgnunetutil}, but@ the respective API itself
2429provides the queue implementation.
2430@table @asis
2431
2432@item @code{GNUNET_MQ_queue_for_connection_client} Transmits queued messages
2433over a @code{GNUNET_CLIENT_Connection}@ handle. Also supports receiving with
2434message handlers.@
2435
2436@item @code{GNUNET_MQ_queue_for_server_client} Transmits queued messages over a
2437@code{GNUNET_SERVER_Client}@ handle. Does not support incoming message
2438handlers.@
2439
2440@item @code{GNUNET_MESH_mq_create} Transmits queued messages over a
2441@code{GNUNET_MESH_Tunnel}@ handle. Does not support incoming message handlers.@
2442
2443@item @code{GNUNET_MQ_queue_for_callbacks} This is the most general
2444implementation. Instead of delivering and receiving messages with one of
2445GNUnet's communication APIs, implementation callbacks are called. Refer to
2446"Implementing Queues" for a more detailed explanation.
2447@end table
2448
2449
2450@strong{ Allocating Envelopes }@ A GNUnet message (as defined by the
2451GNUNET_MessageHeader) has three parts: The size, the type, and the body.
2452
2453MQ provides macros to allocate an envelope containing a message conveniently,@
2454automatically setting the size and type fields of the message.
2455
2456Consider the following simple message, with the body consisting of a single
2457number value.@ @code{}
2458@example
2459struct NumberMessage @{
2460 /** Type: GNUNET_MESSAGE_TYPE_EXAMPLE_1 */
2461 struct GNUNET_MessageHeader header; uint32_t number GNUNET_PACKED; @};
2462@end example
2463
2464An envelope containing an instance of the NumberMessage can be constructed like
2465this:
2466@example
2467struct GNUNET_MQ_Envelope *ev; struct NumberMessage *msg; ev =
2468GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_EXAMPLE_1); msg->number = htonl (42);
2469@end example
2470
2471
2472In the above code, @code{GNUNET_MQ_msg} is a macro. The return value is the
2473newly allocated envelope. The first argument must be a pointer to some
2474@code{struct} containing a @code{struct GNUNET_MessageHeader header} field,
2475while the second argument is the desired message type, in host byte order.
2476
2477The @code{msg} pointer now points to an allocated message, where the message
2478type and the message size are already set. The message's size is inferred from
2479the type of the @code{msg} pointer: It will be set to 'sizeof(*msg)', properly
2480converted to network byte order.
2481
2482If the message body's size is dynamic, the the macro @code{GNUNET_MQ_msg_extra}
2483can be used to allocate an envelope whose message has additional space
2484allocated after the @code{msg} structure.
2485
2486If no structure has been defined for the message,
2487@code{GNUNET_MQ_msg_header_extra} can be used to allocate additional space
2488after the message header. The first argument then must be a pointer to a
2489@code{GNUNET_MessageHeader}.
2490
2491@strong{Envelope Properties}@ A few functions in MQ allow to set additional
2492properties on envelopes:
2493@table @asis
2494
2495@item @code{GNUNET_MQ_notify_sent} Allows to specify a function that will be
2496called once the envelope's message@ has been sent irrevocably. An envelope can
2497be canceled precisely up to the@ point where the notify sent callback has been
2498called.
2499@item @code{GNUNET_MQ_disable_corking} No corking will be used when
2500sending the message. Not every@ queue supports this flag, per default,
2501envelopes are sent with corking.@
2502
2503@end table
2504
2505
2506@strong{Sending Envelopes}@ Once an envelope has been constructed, it can be
2507queued for sending with @code{GNUNET_MQ_send}.
2508
2509Note that in order to avoid memory leaks, an envelope must either be sent (the
2510queue will free it) or destroyed explicitly with @code{GNUNET_MQ_discard}.
2511
2512@strong{Canceling Envelopes}@ An envelope queued with @code{GNUNET_MQ_send} can
2513be canceled with @code{GNUNET_MQ_cancel}. Note that after the notify sent
2514callback has been called, canceling a message results in undefined behavior.
2515Thus it is unsafe to cancel an envelope that does not have a notify sent
2516callback. When canceling an envelope, it is not necessary@ to call
2517@code{GNUNET_MQ_discard}, and the envelope can't be sent again.
2518
2519@strong{ Implementing Queues }@ @code{TODO}
2520
2521@c ***************************************************************************
2522@node Service API
2523@subsection Service API
2524@c %**end of header
2525
2526Most GNUnet code lives in the form of services. Services are processes that
2527offer an API for other components of the system to build on. Those other
2528components can be command-line tools for users, graphical user interfaces or
2529other services. Services provide their API using an IPC protocol. For this,
2530each service must listen on either a TCP port or a UNIX domain socket; for
2531this, the service implementation uses the server API. This use of server is
2532exposed directly to the users of the service API. Thus, when using the service
2533API, one is usually also often using large parts of the server API. The service
2534API provides various convenience functions, such as parsing command-line
2535arguments and the configuration file, which are not found in the server API.
2536The dual to the service/server API is the client API, which can be used to
2537access services.
2538
2539The most common way to start a service is to use the GNUNET_SERVICE_run
2540function from the program's main function. GNUNET_SERVICE_run will then parse
2541the command line and configuration files and, based on the options found there,
2542start the server. It will then give back control to the main program, passing
2543the server and the configuration to the GNUNET_SERVICE_Main callback.
2544GNUNET_SERVICE_run will also take care of starting the scheduler loop. If this
2545is inappropriate (for example, because the scheduler loop is already running),
2546GNUNET_SERVICE_start and related functions provide an alternative to
2547GNUNET_SERVICE_run.
2548
2549When starting a service, the service_name option is used to determine which
2550sections in the configuration file should be used to configure the service. A
2551typical value here is the name of the src/ sub-directory, for example
2552"statistics". The same string would also be given to GNUNET_CLIENT_connect to
2553access the service.
2554
2555Once a service has been initialized, the program should use the@
2556GNUNET_SERVICE_Main callback to register message handlers using
2557GNUNET_SERVER_add_handlers. The service will already have registered a handler
2558for the "TEST" message.
2559
2560The option bitfield (enum GNUNET_SERVICE_Options) determines how a service
2561should behave during shutdown. There are three key strategies:
2562@table @asis
2563
2564@item instant (GNUNET_SERVICE_OPTION_NONE) Upon receiving the shutdown signal
2565from the scheduler, the service immediately terminates the server, closing all
2566existing connections with clients.
2567@item manual
2568(GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN) The service does nothing by itself
2569during shutdown. The main program will need to take the appropriate action by
2570calling GNUNET_SERVER_destroy or GNUNET_SERVICE_stop (depending on how the
2571service was initialized) to terminate the service. This method is used by
2572gnunet-service-arm and rather uncommon.
2573@item soft
2574(GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN) Upon receiving the shutdown signal from
2575the scheduler, the service immediately tells the server to stop listening for
2576incoming clients. Requests from normal existing clients are still processed and
2577the server/service terminates once all normal clients have disconnected.
2578Clients that are not expected to ever disconnect (such as clients that monitor
2579performance values) can be marked as 'monitor' clients using
2580GNUNET_SERVER_client_mark_monitor. Those clients will continue to be processed
2581until all 'normal' clients have disconnected. Then, the server will terminate,
2582closing the monitor connections. This mode is for example used by 'statistics',
2583allowing existing 'normal' clients to set (possibly persistent) statistic
2584values before terminating.
2585@end table
2586
2587@c ***************************************************************************
2588@node Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2589@subsection Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2590@c %**end of header
2591
2592A commonly used data structure in GNUnet is a (multi-)hash map. It is most
2593often used to map a peer identity to some data structure, but also to map
2594arbitrary keys to values (for example to track requests in the distributed hash
2595table or in file-sharing). As it is commonly used, the DHT is actually
2596sometimes responsible for a large share of GNUnet's overall memory consumption
2597(for some processes, 30% is not uncommon). The following text documents some
2598API quirks (and their implications for applications) that were recently
2599introduced to minimize the footprint of the hash map.
2600
2601
2602@c ***************************************************************************
2603@menu
2604* Analysis::
2605* Solution::
2606* Migration::
2607* Conclusion::
2608* Availability::
2609@end menu
2610
2611@node Analysis
2612@subsubsection Analysis
2613@c %**end of header
2614
2615The main reason for the "excessive" memory consumption by the hash map is that
2616GNUnet uses 512-bit cryptographic hash codes --- and the (multi-)hash map also
2617uses the same 512-bit 'struct GNUNET_HashCode'. As a result, storing just the
2618keys requires 64 bytes of memory for each key. As some applications like to
2619keep a large number of entries in the hash map (after all, that's what maps
2620are good for), 64 bytes per hash is significant: keeping a pointer to the
2621value and having a linked list for collisions consume between 8 and 16 bytes,
2622and 'malloc' may add about the same overhead per allocation, putting us in the
262316 to 32 byte per entry ballpark. Adding a 64-byte key then triples the
2624overall memory requirement for the hash map.
2625
2626To make things "worse", most of the time storing the key in the hash map is
2627not required: it is typically already in memory elsewhere! In most cases, the
2628values stored in the hash map are some application-specific struct that _also_
2629contains the hash. Here is a simplified example:
2630@example
2631struct MyValue @{
2632struct GNUNET_HashCode key; unsigned int my_data; @};
2633
2634// ...
2635val = GNUNET_malloc (sizeof (struct MyValue)); val->key = key; val->my_data =
263642; GNUNET_CONTAINER_multihashmap_put (map, &key, val, ...);
2637@end example
2638
2639
2640This is a common pattern as later the entries might need to be removed, and at
2641that time it is convenient to have the key immediately at hand:
2642@example
2643GNUNET_CONTAINER_multihashmap_remove (map, &val->key, val);
2644@end example
2645
2646
2647Note that here we end up with two times 64 bytes for the key, plus maybe 64
2648bytes total for the rest of the 'struct MyValue' and the map entry in the hash
2649map. The resulting redundant storage of the key increases overall memory
2650consumption per entry from the "optimal" 128 bytes to 192 bytes. This is not
2651just an extreme example: overheads in practice are actually sometimes close to
2652those highlighted in this example. This is especially true for maps with a
2653significant number of entries, as there we tend to really try to keep the
2654entries small.
2655@c ***************************************************************************
2656@node Solution
2657@subsubsection Solution
2658@c %**end of header
2659
2660The solution that has now been implemented is to @strong{optionally} allow the
2661hash map to not make a (deep) copy of the hash but instead have a pointer to
2662the hash/key in the entry. This reduces the memory consumption for the key
2663from 64 bytes to 4 to 8 bytes. However, it can also only work if the key is
2664actually stored in the entry (which is the case most of the time) and if the
2665entry does not modify the key (which in all of the code I'm aware of has been
2666always the case if there key is stored in the entry). Finally, when the client
2667stores an entry in the hash map, it @strong{must} provide a pointer to the key
2668within the entry, not just a pointer to a transient location of the key. If
2669the client code does not meet these requirements, the result is a dangling
2670pointer and undefined behavior of the (multi-)hash map API.
2671@c ***************************************************************************
2672@node Migration
2673@subsubsection Migration
2674@c %**end of header
2675
2676To use the new feature, first check that the values contain the respective key
2677(and never modify it). Then, all calls to
2678@code{GNUNET_CONTAINER_multihashmap_put} on the respective map must be audited
2679and most likely changed to pass a pointer into the value's struct. For the
2680initial example, the new code would look like this:
2681@example
2682struct MyValue @{
2683struct GNUNET_HashCode key; unsigned int my_data; @};
2684
2685// ...
2686val = GNUNET_malloc (sizeof (struct MyValue)); val->key = key; val->my_data =
268742; GNUNET_CONTAINER_multihashmap_put (map, &val->key, val, ...);
2688@end example
2689
2690
2691Note that @code{&val} was changed to @code{&val->key} in the argument to the
2692@code{put} call. This is critical as often @code{key} is on the stack or in
2693some other transient data structure and thus having the hash map keep a pointer
2694to @code{key} would not work. Only the key inside of @code{val} has the same
2695lifetime as the entry in the map (this must of course be checked as well).
2696Naturally, @code{val->key} must be intiialized before the @code{put} call. Once
2697all @code{put} calls have been converted and double-checked, you can change the
2698call to create the hash map from
2699@example
2700map =
2701GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_NO);
2702@end example
2703
2704to
2705
2706@example
2707map = GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_YES);
2708@end example
2709
2710If everything was done correctly, you now use about 60 bytes less memory per
2711entry in @code{map}. However, if now (or in the future) any call to @code{put}
2712does not ensure that the given key is valid until the entry is removed from the
2713map, undefined behavior is likely to be observed.
2714@c ***************************************************************************
2715@node Conclusion
2716@subsubsection Conclusion
2717@c %**end of header
2718
2719The new optimization can is often applicable and can result in a reduction in
2720memory consumption of up to 30% in practice. However, it makes the code less
2721robust as additional invariants are imposed on the multi hash map client. Thus
2722applications should refrain from enabling the new mode unless the resulting
2723performance increase is deemed significant enough. In particular, it should
2724generally not be used in new code (wait at least until benchmarks exist).
2725@c ***************************************************************************
2726@node Availability
2727@subsubsection Availability
2728@c %**end of header
2729
2730The new multi hash map code was committed in SVN 24319 (will be in GNUnet
27310.9.4). Various subsystems (transport, core, dht, file-sharing) were
2732previously audited and modified to take advantage of the new capability. In
2733particular, memory consumption of the file-sharing service is expected to drop
2734by 20-30% due to this change.
2735
2736@c ***************************************************************************
2737@node The CONTAINER_MDLL API
2738@subsection The CONTAINER_MDLL API
2739@c %**end of header
2740
2741This text documents the GNUNET_CONTAINER_MDLL API. The GNUNET_CONTAINER_MDLL
2742API is similar to the GNUNET_CONTAINER_DLL API in that it provides operations
2743for the construction and manipulation of doubly-linked lists. The key
2744difference to the (simpler) DLL-API is that the MDLL-version allows a single
2745element (instance of a "struct") to be in multiple linked lists at the same
2746time.
2747
2748Like the DLL API, the MDLL API stores (most of) the data structures for the
2749doubly-linked list with the respective elements; only the 'head' and 'tail'
2750pointers are stored "elsewhere" --- and the application needs to provide the
2751locations of head and tail to each of the calls in the MDLL API. The key
2752difference for the MDLL API is that the "next" and "previous" pointers in the
2753struct can no longer be simply called "next" and "prev" --- after all, the
2754element may be in multiple doubly-linked lists, so we cannot just have one
2755"next" and one "prev" pointer!
2756
2757The solution is to have multiple fields that must have a name of the format
2758"next_XX" and "prev_XX" where "XX" is the name of one of the doubly-linked
2759lists. Here is a simple example:
2760@example
2761struct MyMultiListElement @{ struct
2762MyMultiListElement *next_ALIST; struct MyMultiListElement *prev_ALIST; struct
2763MyMultiListElement *next_BLIST; struct MyMultiListElement *prev_BLIST; void
2764*data; @};
2765@end example
2766
2767
2768Note that by convention, we use all-uppercase letters for the list names. In
2769addition, the program needs to have a location for the head and tail pointers
2770for both lists, for example:
2771@example
2772static struct MyMultiListElement
2773*head_ALIST; static struct MyMultiListElement *tail_ALIST; static struct
2774MyMultiListElement *head_BLIST; static struct MyMultiListElement *tail_BLIST;
2775@end example
2776
2777
2778Using the MDLL-macros, we can now insert an element into the ALIST:
2779@example
2780GNUNET_CONTAINER_MDLL_insert (ALIST, head_ALIST, tail_ALIST, element);
2781@end example
2782
2783
2784Passing "ALIST" as the first argument to MDLL specifies which of the next/prev
2785fields in the 'struct MyMultiListElement' should be used. The extra "ALIST"
2786argument and the "_ALIST" in the names of the next/prev-members are the only
2787differences between the MDDL and DLL-API. Like the DLL-API, the MDLL-API offers
2788functions for inserting (at head, at tail, after a given element) and removing
2789elements from the list. Iterating over the list should be done by directly
2790accessing the "next_XX" and/or "prev_XX" members.
2791
2792@c ***************************************************************************
2793@node The Automatic Restart Manager (ARM)
2794@section The Automatic Restart Manager (ARM)
2795@c %**end of header
2796
2797GNUnet's Automated Restart Manager (ARM) is the GNUnet service responsible for
2798system initialization and service babysitting. ARM starts and halts services,
2799detects configuration changes and restarts services impacted by the changes as
2800needed. It's also responsible for restarting services in case of crashes and is
2801planned to incorporate automatic debugging for diagnosing service crashes
2802providing developers insights about crash reasons. The purpose of this document
2803is to give GNUnet developer an idea about how ARM works and how to interact
2804with it.
2805
2806@menu
2807* Basic functionality::
2808* Key configuration options::
2809* Availability2::
2810* Reliability::
2811@end menu
2812
2813@c ***************************************************************************
2814@node Basic functionality
2815@subsection Basic functionality
2816@c %**end of header
2817
2818@itemize @bullet
2819@item ARM source code can be found under "src/arm".@ Service processes are
2820managed by the functions in "gnunet-service-arm.c" which is controlled with
2821"gnunet-arm.c" (main function in that file is ARM's entry point).
2822
2823@item The functions responsible for communicating with ARM , starting and
2824stopping services -including ARM service itself- are provided by the ARM API
2825"arm_api.c".@ Function: GNUNET_ARM_connect() returns to the caller an ARM
2826handle after setting it to the caller's context (configuration and scheduler in
2827use). This handle can be used afterwards by the caller to communicate with ARM.
2828Functions GNUNET_ARM_start_service() and GNUNET_ARM_stop_service() are used for
2829starting and stopping services respectively.
2830
2831@item A typical example of using these basic ARM services can be found in file
2832test_arm_api.c. The test case connects to ARM, starts it, then uses it to start
2833a service "resolver", stops the "resolver" then stops "ARM".
2834@end itemize
2835
2836@c ***************************************************************************
2837@node Key configuration options
2838@subsection Key configuration options
2839@c %**end of header
2840
2841Configurations for ARM and services should be available in a .conf file (As an
2842example, see test_arm_api_data.conf). When running ARM, the configuration file
2843to use should be passed to the command:@ @code{@ $ gnunet-arm -s -c
2844configuration_to_use.conf@ }@ If no configuration is passed, the default
2845configuration file will be used (see GNUNET_PREFIX/share/gnunet/defaults.conf
2846which is created from contrib/defaults.conf).@ Each of the services is having a
2847section starting by the service name between square brackets, for example:
2848"[arm]". The following options configure how ARM configures or interacts with
2849the various services:
2850
2851@table @asis
2852
2853@item PORT Port number on which the service is listening for incoming TCP
2854connections. ARM will start the services should it notice a request at this
2855port.
2856
2857@item HOSTNAME Specifies on which host the service is deployed. Note
2858that ARM can only start services that are running on the local system (but will
2859not check that the hostname matches the local machine name). This option is
2860used by the @code{gnunet_client_lib.h} implementation to determine which system
2861to connect to. The default is "localhost".
2862
2863@item BINARY The name of the service binary file.
2864
2865@item OPTIONS To be passed to the service.
2866
2867@item PREFIX A command to pre-pend to the actual command, for example, running
2868a service with "valgrind" or "gdb"
2869
2870@item DEBUG Run in debug mode (much verbosity).
2871
2872@item AUTOSTART ARM will listen to UNIX domain socket and/or TCP port of the
2873service and start the service on-demand.
2874
2875@item FORCESTART ARM will always
2876start this service when the peer is started.
2877
2878@item ACCEPT_FROM IPv4 addresses the service accepts connections from.
2879
2880@item ACCEPT_FROM6 IPv6 addresses the service accepts connections from.
2881
2882@end table
2883
2884
2885Options that impact the operation of ARM overall are in the "[arm]" section.
2886ARM is a normal service and has (except for AUTOSTART) all of the options that
2887other services do. In addition, ARM has the following options:
2888@table @asis
2889
2890@item GLOBAL_PREFIX Command to be pre-pended to all services that are going to
2891run.@
2892
2893@item GLOBAL_POSTFIX Global option that will be supplied to all the services
2894that are going to run.@
2895
2896@end table
2897
2898@c ***************************************************************************
2899@node Availability2
2900@subsection Availability2
2901@c %**end of header
2902
2903As mentioned before, one of the features provided by ARM is starting services
2904on demand. Consider the example of one service "client" that wants to connect
2905to another service a "server". The "client" will ask ARM to run the "server".
2906ARM starts the "server". The "server" starts listening to incoming connections.
2907The "client" will establish a connection with the "server". And then, they will
2908start to communicate together.@ One problem with that scheme is that it's
2909slow!@ The "client" service wants to communicate with the "server" service at
2910once and is not willing wait for it to be started and listening to incoming
2911connections before serving its request.@ One solution for that problem will be
2912that ARM starts all services as default services. That solution will solve the
2913problem, yet, it's not quite practical, for some services that are going to be
2914started can never be used or are going to be used after a relatively long
2915time.@ The approach followed by ARM to solve this problem is as follows:
2916@itemize @bullet
2917
2918
2919@item For each service having a PORT field in the configuration file and that
2920is not one of the default services ( a service that accepts incoming
2921connections from clients), ARM creates listening sockets for all addresses
2922associated with that service.
2923
2924@item The "client" will immediately establish a connection with the "server".
2925
2926@item ARM --- pretending to be the "server" --- will listen on the respective
2927port and notice the incoming connection from the "client" (but not accept it),
2928instead
2929
2930@item Once there is an incoming connection, ARM will start the "server",
2931passing on the listen sockets (now, the service is started and can do its
2932work).
2933
2934@item Other client services now can directly connect directly to the "server".
2935@end itemize
2936
2937@c ***************************************************************************
2938@node Reliability
2939@subsection Reliability
2940
2941One of the features provided by ARM, is the automatic restart of crashed
2942services.@ ARM needs to know which of the running services died. Function
2943"gnunet-service-arm.c/maint_child_death()" is responsible for that. The
2944function is scheduled to run upon receiving a SIGCHLD signal. The function,
2945then, iterates ARM's list of services running and monitors which service has
2946died (crashed). For all crashing services, ARM restarts them.@ Now, considering
2947the case of a service having a serious problem causing it to crash each time
2948it's started by ARM. If ARM keeps blindly restarting such a service, we are
2949going to have the pattern: start-crash-restart-crash-restart-crash and so
2950forth!! Which is of course not practical.@ For that reason, ARM schedules the
2951service to be restarted after waiting for some delay that grows exponentially
2952with each crash/restart of that service.@ To clarify the idea, considering the
2953following example:
2954@itemize @bullet
2955
2956
2957@item Service S crashed.
2958
2959@item ARM receives the SIGCHLD and inspects its list of services to find the
2960dead one(s).
2961
2962@item ARM finds S dead and schedules it for restarting after "backoff" time
2963which is initially set to 1ms. ARM will double the backoff time correspondent
2964to S (now backoff(S) = 2ms)
2965
2966@item Because there is a severe problem with S, it crashed again.
2967
2968@item Again ARM receives the SIGCHLD and detects that it's S again that's
2969crashed. ARM schedules it for restarting but after its new backoff time (which
2970became 2ms), and doubles its backoff time (now backoff(S) = 4).
2971
2972@item and so on, until backoff(S) reaches a certain threshold
2973(EXPONENTIAL_BACKOFF_THRESHOLD is set to half an hour), after reaching it,
2974backoff(S) will remain half an hour, hence ARM won't be busy for a lot of time
2975trying to restart a problematic service.
2976@end itemize
2977
2978@c ***************************************************************************
2979@node GNUnet's TRANSPORT Subsystem
2980@section GNUnet's TRANSPORT Subsystem
2981@c %**end of header
2982
2983This chapter documents how the GNUnet transport subsystem works. The GNUnet
2984transport subsystem consists of three main components: the transport API (the
2985interface used by the rest of the system to access the transport service), the
2986transport service itself (most of the interesting functions, such as choosing
2987transports, happens here) and the transport plugins. A transport plugin is a
2988concrete implementation for how two GNUnet peers communicate; many plugins
2989exist, for example for communication via TCP, UDP, HTTP, HTTPS and others.
2990Finally, the transport subsystem uses supporting code, especially the NAT/UPnP
2991library to help with tasks such as NAT traversal.
2992
2993Key tasks of the transport service include:
2994@itemize @bullet
2995
2996
2997@item Create our HELLO message, notify clients and neighbours if our HELLO
2998changes (using NAT library as necessary)
2999
3000@item Validate HELLOs from other peers (send PING), allow other peers to
3001validate our HELLO's addresses (send PONG)
3002
3003@item Upon request, establish connections to other peers (using address
3004selection from ATS subsystem) and maintain them (again using PINGs and PONGs)
3005as long as desired
3006
3007@item Accept incoming connections, give ATS service the opportunity to switch
3008communication channels
3009
3010@item Notify clients about peers that have connected to us or that have been
3011disconnected from us
3012
3013@item If a (stateful) connection goes down unexpectedly (without explicit
3014DISCONNECT), quickly attempt to recover (without notifying clients) but do
3015notify clients quickly if reconnecting fails
3016
3017@item Send (payload) messages arriving from clients to other peers via
3018transport plugins and receive messages from other peers, forwarding those to
3019clients
3020
3021@item Enforce inbound traffic limits (using flow-control if it is applicable);
3022outbound traffic limits are enforced by CORE, not by us (!)
3023
3024@item Enforce restrictions on P2P connection as specified by the blacklist
3025configuration and blacklisting clients
3026@end itemize
3027
3028
3029Note that the term "clients" in the list above really refers to the GNUnet-CORE
3030service, as CORE is typically the only client of the transport service.
3031
3032@menu
3033* Address validation protocol::
3034@end menu
3035
3036@node Address validation protocol
3037@subsection Address validation protocol
3038@c %**end of header
3039
3040This section documents how the GNUnet transport service validates connections
3041with other peers. It is a high-level description of the protocol necessary to
3042understand the details of the implementation. It should be noted that when we
3043talk about PING and PONG messages in this section, we refer to transport-level
3044PING and PONG messages, which are different from core-level PING and PONG
3045messages (both in implementation and function).
3046
3047The goal of transport-level address validation is to minimize the chances of a
3048successful man-in-the-middle attack against GNUnet peers on the transport
3049level. Such an attack would not allow the adversary to decrypt the P2P
3050transmissions, but a successful attacker could at least measure traffic volumes
3051and latencies (raising the adversaries capablities by those of a global passive
3052adversary in the worst case). The scenarios we are concerned about is an
3053attacker, Mallory, giving a HELLO to Alice that claims to be for Bob, but
3054contains Mallory's IP address instead of Bobs (for some transport). Mallory
3055would then forward the traffic to Bob (by initiating a connection to Bob and
3056claiming to be Alice). As a further complication, the scheme has to work even
3057if say Alice is behind a NAT without traversal support and hence has no address
3058of her own (and thus Alice must always initiate the connection to Bob).
3059
3060An additional constraint is that HELLO messages do not contain a cryptographic
3061signature since other peers must be able to edit (i.e. remove) addresses from
3062the HELLO at any time (this was not true in GNUnet 0.8.x). A basic
3063@strong{assumption} is that each peer knows the set of possible network
3064addresses that it @strong{might} be reachable under (so for example, the
3065external IP address of the NAT plus the LAN address(es) with the respective
3066ports).
3067
3068The solution is the following. If Alice wants to validate that a given address
3069for Bob is valid (i.e. is actually established @strong{directly} with the
3070intended target), it sends a PING message over that connection to Bob. Note
3071that in this case, Alice initiated the connection so only she knows which
3072address was used for sure (Alice maybe behind NAT, so whatever address Bob
3073sees may not be an address Alice knows she has). Bob checks that the address
3074given in the PING is actually one of his addresses (does not belong to
3075Mallory), and if it is, sends back a PONG (with a signature that says that Bob
3076owns/uses the address from the PING). Alice checks the signature and is happy
3077if it is valid and the address in the PONG is the address she used. This is
3078similar to the 0.8.x protocol where the HELLO contained a signature from Bob
3079for each address used by Bob. Here, the purpose code for the signature is
3080@code{GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN}. After this, Alice will
3081remember Bob's address and consider the address valid for a while (12h in the
3082current implementation). Note that after this exchange, Alice only considers
3083Bob's address to be valid, the connection itself is not considered
3084'established'. In particular, Alice may have many addresses for Bob that she
3085considers valid.
3086
3087The PONG message is protected with a nonce/challenge against replay attacks
3088and uses an expiration time for the signature (but those are almost
3089implementation details).
3090
3091@node NAT library
3092@section NAT library
3093@c %**end of header
3094
3095The goal of the GNUnet NAT library is to provide a general-purpose API for NAT
3096traversal @strong{without} third-party support. So protocols that involve
3097contacting a third peer to help establish a connection between two peers are
3098outside of the scope of this API. That does not mean that GNUnet doesn't
3099support involving a third peer (we can do this with the distance-vector
3100transport or using application-level protocols), it just means that the NAT API
3101is not concerned with this possibility. The API is written so that it will work
3102for IPv6-NAT in the future as well as current IPv4-NAT. Furthermore, the NAT
3103API is always used, even for peers that are not behind NAT --- in that case,
3104the mapping provided is simply the identity.
3105
3106NAT traversal is initiated by calling @code{GNUNET_NAT_register}. Given a set
3107of addresses that the peer has locally bound to (TCP or UDP), the NAT library
3108will return (via callback) a (possibly longer) list of addresses the peer
3109@strong{might} be reachable under. Internally, depending on the configuration,
3110the NAT library will try to punch a hole (using UPnP) or just "know" that the
3111NAT was manually punched and generate the respective external IP address (the
3112one that should be globally visible) based on the given information.
3113
3114The NAT library also supports ICMP-based NAT traversal. Here, the other peer
3115can request connection-reversal by this peer (in this special case, the peer is
3116even allowed to configure a port number of zero). If the NAT library detects a
3117connection-reversal request, it returns the respective target address to the
3118client as well. It should be noted that connection-reversal is currently only
3119intended for TCP, so other plugins @strong{must} pass @code{NULL} for the
3120reversal callback. Naturally, the NAT library also supports requesting
3121connection reversal from a remote peer (@code{GNUNET_NAT_run_client}).
3122
3123Once initialized, the NAT handle can be used to test if a given address is
3124possibly a valid address for this peer (@code{GNUNET_NAT_test_address}). This
3125is used for validating our addresses when generating PONGs.
3126
3127Finally, the NAT library contains an API to test if our NAT configuration is
3128correct. Using @code{GNUNET_NAT_test_start} @strong{before} binding to the
3129respective port, the NAT library can be used to test if the configuration
3130works. The test function act as a local client, initialize the NAT traversal
3131and then contact a @code{gnunet-nat-server} (running by default on
3132@code{gnunet.org}) and ask for a connection to be established. This way, it is
3133easy to test if the current NAT configuration is valid.
3134
3135@node Distance-Vector plugin
3136@section Distance-Vector plugin
3137@c %**end of header
3138
3139The Distance Vector (DV) transport is a transport mechanism that allows peers
3140to act as relays for each other, thereby connecting peers that would otherwise
3141be unable to connect. This gives a larger connection set to applications that
3142may work better with more peers to choose from (for example, File Sharing
3143and/or DHT).
3144
3145The Distance Vector transport essentially has two functions. The first is
3146"gossiping" connection information about more distant peers to directly
3147connected peers. The second is taking messages intended for non-directly
3148connected peers and encapsulating them in a DV wrapper that contains the
3149required information for routing the message through forwarding peers. Via
3150gossiping, optimal routes through the known DV neighborhood are discovered and
3151utilized and the message encapsulation provides some benefits in addition to
3152simply getting the message from the correct source to the proper destination.
3153
3154The gossiping function of DV provides an up to date routing table of peers that
3155are available up to some number of hops. We call this a fisheye view of the
3156network (like a fish, nearby objects are known while more distant ones
3157unknown). Gossip messages are sent only to directly connected peers, but they
3158are sent about other knowns peers within the "fisheye distance". Whenever two
3159peers connect, they immediately gossip to each other about their appropriate
3160other neighbors. They also gossip about the newly connected peer to previously
3161connected neighbors. In order to keep the routing tables up to date, disconnect
3162notifications are propogated as gossip as well (because disconnects may not be
3163sent/received, timeouts are also used remove stagnant routing table entries).
3164
3165Routing of messages via DV is straightforward. When the DV transport is
3166notified of a message destined for a non-direct neighbor, the appropriate
3167forwarding peer is selected, and the base message is encapsulated in a DV
3168message which contains information about the initial peer and the intended
3169recipient. At each forwarding hop, the initial peer is validated (the
3170forwarding peer ensures that it has the initial peer in its neighborhood,
3171otherwise the message is dropped). Next the base message is re-encapsulated in
3172a new DV message for the next hop in the forwarding chain (or delivered to the
3173current peer, if it has arrived at the destination).
3174
3175Assume a three peer network with peers Alice, Bob and Carol. Assume that Alice
3176<-> Bob and Bob <-> Carol are direct (e.g. over TCP or UDP transports)
3177connections, but that Alice cannot directly connect to Carol. This may be the
3178case due to NAT or firewall restrictions, or perhaps based on one of the peers
3179respective configurations. If the Distance Vector transport is enabled on all
3180three peers, it will automatically discover (from the gossip protocol) that
3181Alice and Carol can connect via Bob and provide a "virtual" Alice <-> Carol
3182connection. Routing between Alice and Carol happens as follows; Alice creates a
3183message destined for Carol and notifies the DV transport about it. The DV
3184transport at Alice looks up Carol in the routing table and finds that the
3185message must be sent through Bob for Carol. The message is encapsulated setting
3186Alice as the initiator and Carol as the destination and sent to Bob. Bob
3187receives the messages, verifies both Alice and Carol are known to Bob, and
3188re-wraps the message in a new DV message for Carol. The DV transport at Carol
3189receives this message, unwraps the original message, and delivers it to Carol
3190as though it came directly from Alice.
3191
3192@node SMTP plugin
3193@section SMTP plugin
3194@c %**end of header
3195
3196This page describes the new SMTP transport plugin for GNUnet as it exists in
3197the 0.7.x and 0.8.x branch. SMTP support is currently not available in GNUnet
31980.9.x. This page also describes the transport layer abstraction (as it existed
3199in 0.7.x and 0.8.x) in more detail and gives some benchmarking results. The
3200performance results presented are quite old and maybe outdated at this point.
3201@itemize @bullet
3202@item Why use SMTP for a peer-to-peer transport?
3203@item SMTPHow does it work?
3204@item How do I configure my peer?
3205@item How do I test if it works?
3206@item How fast is it?
3207@item Is there any additional documentation?
3208@end itemize
3209
3210
3211@menu
3212* Why use SMTP for a peer-to-peer transport?::
3213* How does it work?::
3214* How do I configure my peer?::
3215* How do I test if it works?::
3216* How fast is it?::
3217@end menu
3218
3219@node Why use SMTP for a peer-to-peer transport?
3220@subsection Why use SMTP for a peer-to-peer transport?
3221@c %**end of header
3222
3223There are many reasons why one would not want to use SMTP:
3224@itemize @bullet
3225@item SMTP is using more bandwidth than TCP, UDP or HTTP
3226@item SMTP has a much higher latency.
3227@item SMTP requires significantly more computation (encoding and decoding time)
3228for the peers.
3229@item SMTP is significantly more complicated to configure.
3230@item SMTP may be abused by tricking GNUnet into sending mail to@
3231non-participating third parties.
3232@end itemize
3233
3234So why would anybody want to use SMTP?
3235@itemize @bullet
3236@item SMTP can be used to contact peers behind NAT boxes (in virtual private
3237networks).
3238@item SMTP can be used to circumvent policies that limit or prohibit
3239peer-to-peer traffic by masking as "legitimate" traffic.
3240@item SMTP uses E-mail addresses which are independent of a specific IP, which
3241can be useful to address peers that use dynamic IP addresses.
3242@item SMTP can be used to initiate a connection (e.g. initial address exchange)
3243and peers can then negotiate the use of a more efficient protocol (e.g. TCP)
3244for the actual communication.
3245@end itemize
3246
3247In summary, SMTP can for example be used to send a message to a peer behind a
3248NAT box that has a dynamic IP to tell the peer to establish a TCP connection
3249to a peer outside of the private network. Even an extraordinary overhead for
3250this first message would be irrelevant in this type of situation.
3251
3252@node How does it work?
3253@subsection How does it work?
3254@c %**end of header
3255
3256When a GNUnet peer needs to send a message to another GNUnet peer that has
3257advertised (only) an SMTP transport address, GNUnet base64-encodes the message
3258and sends it in an E-mail to the advertised address. The advertisement
3259contains a filter which is placed in the E-mail header, such that the
3260receiving host can filter the tagged E-mails and forward it to the GNUnet peer
3261process. The filter can be specified individually by each peer and be changed
3262over time. This makes it impossible to censor GNUnet E-mail messages by
3263searching for a generic filter.
3264
3265@node How do I configure my peer?
3266@subsection How do I configure my peer?
3267@c %**end of header
3268
3269First, you need to configure @code{procmail} to filter your inbound E-mail for
3270GNUnet traffic. The GNUnet messages must be delivered into a pipe, for example
3271@code{/tmp/gnunet.smtp}. You also need to define a filter that is used by
3272procmail to detect GNUnet messages. You are free to choose whichever filter
3273you like, but you should make sure that it does not occur in your other
3274E-mail. In our example, we will use @code{X-mailer: GNUnet}. The
3275@code{~/.procmailrc} configuration file then looks like this:
3276@example
3277:0:
3278* ^X-mailer: GNUnet
3279/tmp/gnunet.smtp
3280# where do you want your other e-mail delivered to (default: /var/spool/mail/)
3281:0: /var/spool/mail/
3282@end example
3283
3284After adding this file, first make sure that your regular E-mail still works
3285(e.g. by sending an E-mail to yourself). Then edit the GNUnet configuration.
3286In the section @code{SMTP} you need to specify your E-mail address under
3287@code{EMAIL}, your mail server (for outgoing mail) under @code{SERVER}, the
3288filter (X-mailer: GNUnet in the example) under @code{FILTER} and the name of
3289the pipe under @code{PIPE}.@ The completed section could then look like this:
3290@example
3291EMAIL = me@@mail.gnu.org MTU = 65000 SERVER = mail.gnu.org:25 FILTER =
3292"X-mailer: GNUnet" PIPE = /tmp/gnunet.smtp
3293@end example
3294
3295Finally, you need to add @code{smtp} to the list of @code{TRANSPORTS} in the
3296@code{GNUNETD} section. GNUnet peers will use the E-mail address that you
3297specified to contact your peer until the advertisement times out. Thus, if you
3298are not sure if everything works properly or if you are not planning to be
3299online for a long time, you may want to configure this timeout to be short,
3300e.g. just one hour. For this, set @code{HELLOEXPIRES} to @code{1} in the
3301@code{GNUNETD} section.
3302
3303This should be it, but you may probably want to test it first.@
3304@node How do I test if it works?
3305@subsection How do I test if it works?
3306@c %**end of header
3307
3308Any transport can be subjected to some rudimentary tests using the
3309@code{gnunet-transport-check} tool. The tool sends a message to the local node
3310via the transport and checks that a valid message is received. While this test
3311does not involve other peers and can not check if firewalls or other network
3312obstacles prohibit proper operation, this is a great testcase for the SMTP
3313transport since it tests pretty much nearly all of the functionality.
3314
3315@code{gnunet-transport-check} should only be used without running
3316@code{gnunetd} at the same time. By default, @code{gnunet-transport-check}
3317tests all transports that are specified in the configuration file. But you can
3318specifically test SMTP by giving the option @code{--transport=smtp}.
3319
3320Note that this test always checks if a transport can receive and send. While
3321you can configure most transports to only receive or only send messages, this
3322test will only work if you have configured the transport to send and receive
3323messages.
3324
3325@node How fast is it?
3326@subsection How fast is it?
3327@c %**end of header
3328
3329We have measured the performance of the UDP, TCP and SMTP transport layer
3330directly and when used from an application using the GNUnet core. Measureing
3331just the transport layer gives the better view of the actual overhead of the
3332protocol, whereas evaluating the transport from the application puts the
3333overhead into perspective from a practical point of view.
3334
3335The loopback measurements of the SMTP transport were performed on three
3336different machines spanning a range of modern SMTP configurations. We used a
3337PIII-800 running RedHat 7.3 with the Purdue Computer Science configuration
3338which includes filters for spam. We also used a Xenon 2 GHZ with a vanilla
3339RedHat 8.0 sendmail configuration. Furthermore, we used qmail on a PIII-1000
3340running Sorcerer GNU Linux (SGL). The numbers for UDP and TCP are provided
3341using the SGL configuration. The qmail benchmark uses qmail's internal
3342filtering whereas the sendmail benchmarks relies on procmail to filter and
3343deliver the mail. We used the transport layer to send a message of b bytes
3344(excluding transport protocol headers) directly to the local machine. This
3345way, network latency and packet loss on the wire have no impact on the
3346timings. n messages were sent sequentially over the transport layer, sending
3347message i+1 after the i-th message was received. All messages were sent over
3348the same connection and the time to establish the connection was not taken
3349into account since this overhead is miniscule in practice --- as long as a
3350connection is used for a significant number of messages.
3351
3352@multitable @columnfractions .20 .15 .15 .15 .15 .15
3353@headitem Transport @tab UDP @tab TCP @tab SMTP (Purdue sendmail) @tab SMTP (RH 8.0) @tab SMTP (SGL qmail)
3354@item 11 bytes @tab 31 ms @tab 55 ms @tab 781 s @tab 77 s @tab 24 s
3355@item 407 bytes @tab 37 ms @tab 62 ms @tab 789 s @tab 78 s @tab 25 s
3356@item 1,221 bytes @tab 46 ms @tab 73 ms @tab 804 s @tab 78 s @tab 25 s
3357@end multitable
3358
3359The benchmarks show that UDP and TCP are, as expected, both significantly
3360faster compared with any of the SMTP services. Among the SMTP implementations,
3361there can be significant differences depending on the SMTP configuration.
3362Filtering with an external tool like procmail that needs to re-parse its
3363configuration for each mail can be very expensive. Applying spam filters can
3364also significantly impact the performance of the underlying SMTP
3365implementation. The microbenchmark shows that SMTP can be a viable solution
3366for initiating peer-to-peer sessions: a couple of seconds to connect to a peer
3367are probably not even going to be noticed by users. The next benchmark
3368measures the possible throughput for a transport. Throughput can be measured
3369by sending multiple messages in parallel and measuring packet loss. Note that
3370not only UDP but also the TCP transport can actually loose messages since the
3371TCP implementation drops messages if the @code{write} to the socket would
3372block. While the SMTP protocol never drops messages itself, it is often so
3373slow that only a fraction of the messages can be sent and received in the
3374given time-bounds. For this benchmark we report the message loss after
3375allowing t time for sending m messages. If messages were not sent (or
3376received) after an overall timeout of t, they were considered lost. The
3377benchmark was performed using two Xeon 2 GHZ machines running RedHat 8.0 with
3378sendmail. The machines were connected with a direct 100 MBit ethernet
3379connection.@ Figures udp1200, tcp1200 and smtp-MTUs show that the throughput
3380for messages of size 1,200 octects is 2,343 kbps, 3,310 kbps and 6 kbps for
3381UDP, TCP and SMTP respectively. The high per-message overhead of SMTP can be
3382improved by increasing the MTU, for example, an MTU of 12,000 octets improves
3383the throughput to 13 kbps as figure smtp-MTUs shows. Our research paper) has
3384some more details on the benchmarking results.
3385
3386@node Bluetooth plugin
3387@section Bluetooth plugin
3388@c %**end of header
3389
3390This page describes the new Bluetooth transport plugin for GNUnet. The plugin
3391is still in the testing stage so don't expect it to work perfectly. If you
3392have any questions or problems just post them here or ask on the IRC channel.
3393@itemize @bullet
3394@item What do I need to use the Bluetooth plugin transport?
3395@item BluetoothHow does it work?
3396@item What possible errors should I be aware of?
3397@item How do I configure my peer?
3398@item How can I test it?
3399@end itemize
3400
3401
3402
3403@menu
3404* What do I need to use the Bluetooth plugin transport?::
3405* How does it work2?::
3406* What possible errors should I be aware of?::
3407* How do I configure my peer2?::
3408* How can I test it?::
3409* The implementation of the Bluetooth transport plugin::
3410@end menu
3411
3412@node What do I need to use the Bluetooth plugin transport?
3413@subsection What do I need to use the Bluetooth plugin transport?
3414@c %**end of header
3415
3416If you are a Linux user and you want to use the Bluetooth transport plugin you
3417should install the BlueZ development libraries (if they aren't already
3418installed). For instructions about how to install the libraries you should
3419check out the BlueZ site (@uref{http://www.bluez.org/, http://www.bluez.org}).
3420If you don't know if you have the necesarry libraries, don't worry, just run
3421the GNUnet configure script and you will be able to see a notification at the
3422end which will warn you if you don't have the necessary libraries.
3423
3424If you are a Windows user you should have installed the
3425@emph{MinGW}/@emph{MSys2} with the latest updates (especially the
3426@emph{ws2bth} header). If this is your first build of GNUnet on Windows you
3427should check out the SBuild repository. It will semi-automatically assembles a
3428@emph{MinGW}/@emph{MSys2} installation with a lot of extra packages which are
3429needed for the GNUnet build. So this will ease your work!@ Finally you just
3430have to be sure that you have the correct drivers for your Bluetooth device
3431installed and that your device is on and in a discoverable mode. The Windows
3432Bluetooth Stack supports only the RFCOMM protocol so we cannot turn on your
3433device programatically!
3434
3435@node How does it work2?
3436@subsection How does it work2?
3437@c %**end of header
3438
3439The Bluetooth transport plugin uses virtually the same code as the WLAN plugin
3440and only the helper binary is different. The helper takes a single argument,
3441which represents the interface name and is specified in the configuration
3442file. Here are the basic steps that are followed by the helper binary used on
3443Linux:
3444
3445@itemize @bullet
3446@item it verifies if the name corresponds to a Bluetooth interface name
3447@item it verifies if the iterface is up (if it is not, it tries to bring it up)
3448@item it tries to enable the page and inquiry scan in order to make the device
3449discoverable and to accept incoming connection requests
3450@emph{The above operations require root access so you should start the
3451transport plugin with root privileges.}
3452@item it finds an available port number and registers a SDP service which will
3453be used to find out on which port number is the server listening on and switch
3454the socket in listening mode
3455@item it sends a HELLO message with its address
3456@item finally it forwards traffic from the reading sockets to the STDOUT and
3457from the STDIN to the writing socket
3458@end itemize
3459
3460Once in a while the device will make an inquiry scan to discover the nearby
3461devices and it will send them randomly HELLO messages for peer discovery.
3462
3463@node What possible errors should I be aware of?
3464@subsection What possible errors should I be aware of?
3465@c %**end of header
3466
3467@emph{This section is dedicated for Linux users}
3468
3469Well there are many ways in which things could go wrong but I will try to
3470present some tools that you could use to debug and some scenarios.
3471@itemize @bullet
3472
3473@item @code{bluetoothd -n -d} : use this command to enable logging in the
3474foreground and to print the logging messages
3475
3476@item @code{hciconfig}: can be used to configure the Bluetooth devices. If you
3477run it without any arguments it will print information about the state of the
3478interfaces. So if you receive an error that the device couldn't be brought up
3479you should try to bring it manually and to see if it works (use @code{hciconfig
3480-a hciX up}). If you can't and the Bluetooth address has the form
348100:00:00:00:00:00 it means that there is something wrong with the D-Bus daemon
3482or with the Bluetooth daemon. Use @code{bluetoothd} tool to see the logs
3483
3484@item @code{sdptool} can be used to control and interogate SDP servers. If you
3485encounter problems regarding the SDP server (like the SDP server is down) you
3486should check out if the D-Bus daemon is running correctly and to see if the
3487Bluetooth daemon started correctly(use @code{bluetoothd} tool). Also, sometimes
3488the SDP service could work but somehow the device couldn't register his
3489service. Use @code{sdptool browse [dev-address]} to see if the service is
3490registered. There should be a service with the name of the interface and GNUnet
3491as provider.
3492
3493@item @code{hcitool} : another useful tool which can be used to configure the
3494device and to send some particular commands to it.
3495
3496@item @code{hcidump} : could be used for low level debugging
3497@end itemize
3498
3499@node How do I configure my peer2?
3500@subsection How do I configure my peer2?
3501@c %**end of header
3502
3503On Linux, you just have to be sure that the interface name corresponds to the
3504one that you want to use. Use the @code{hciconfig} tool to check that. By
3505default it is set to hci0 but you can change it.
3506
3507A basic configuration looks like this:
3508@example
3509[transport-bluetooth]
3510# Name of the interface (typically hciX)
3511INTERFACE = hci0
3512# Real hardware, no testing
3513TESTMODE = 0 TESTING_IGNORE_KEYS = ACCEPT_FROM;
3514@end example
3515
3516
3517In order to use the Bluetooth transport plugin when the transport service is
3518started, you must add the plugin name to the default transport service plugins
3519list. For example:
3520@example
3521[transport] ... PLUGINS = dns bluetooth ...
3522@end example
3523
3524If you want to use only the Bluetooth plugin set @emph{PLUGINS = bluetooth}
3525
3526On Windows, you cannot specify which device to use. The only thing that you
3527should do is to add @emph{bluetooth} on the plugins list of the transport
3528service.
3529
3530@node How can I test it?
3531@subsection How can I test it?
3532@c %**end of header
3533
3534If you have two Bluetooth devices on the same machine which use Linux you
3535must:
3536@itemize @bullet
3537
3538@item create two different file configuration (one which will use the first
3539interface (@emph{hci0}) and the other which will use the second interface
3540(@emph{hci1})). Let's name them @emph{peer1.conf} and @emph{peer2.conf}.
3541
3542@item run @emph{gnunet-peerinfo -c peerX.conf -s} in order to generate the
3543peers private keys. The @strong{X} must be replace with 1 or 2.
3544
3545@item run @emph{gnunet-arm -c peerX.conf -s -i=transport} in order to start the
3546transport service. (Make sure that you have "bluetooth" on the transport
3547plugins list if the Bluetooth transport service doesn't start.)
3548
3549@item run @emph{gnunet-peerinfo -c peer1.conf -s} to get the first peer's ID.
3550If you already know your peer ID (you saved it from the first command), this
3551can be skipped.
3552
3553@item run @emph{gnunet-transport -c peer2.conf -p=PEER1_ID -s} to start sending
3554data for benchmarking to the other peer.
3555@end itemize
3556
3557
3558This scenario will try to connect the second peer to the first one and then
3559start sending data for benchmarking.
3560
3561On Windows you cannot test the plugin functionality using two Bluetooth devices
3562from the same machine because after you install the drivers there will occur
3563some conflicts between the Bluetooth stacks. (At least that is what happend on
3564my machine : I wasn't able to use the Bluesoleil stack and the WINDCOMM one in
3565the same time).
3566
3567If you have two different machines and your configuration files are good you
3568can use the same scenario presented on the begining of this section.
3569
3570Another way to test the plugin functionality is to create your own application
3571which will use the GNUnet framework with the Bluetooth transport service.
3572
3573@node The implementation of the Bluetooth transport plugin
3574@subsection The implementation of the Bluetooth transport plugin
3575@c %**end of header
3576
3577This page describes the implementation of the Bluetooth transport plugin.
3578
3579First I want to remind you that the Bluetooth transport plugin uses virtually
3580the same code as the WLAN plugin and only the helper binary is different. Also
3581the scope of the helper binary from the Bluetooth transport plugin is the same
3582as the one used for the wlan transport plugin: it acceses the interface and
3583then it forwards traffic in both directions between the Bluetooth interface
3584and stdin/stdout of the process involved.
3585
3586The Bluetooth plugin transport could be used both on Linux and Windows
3587platforms.
3588
3589@itemize @bullet
3590@item Linux functionality
3591@item Windows functionality
3592@item Pending Features
3593@end itemize
3594
3595
3596
3597@menu
3598* Linux functionality::
3599* THE INITIALIZATION::
3600* THE LOOP::
3601* Details about the broadcast implementation::
3602* Windows functionality::
3603* Pending features::
3604@end menu
3605
3606@node Linux functionality
3607@subsubsection Linux functionality
3608@c %**end of header
3609
3610In order to implement the plugin functionality on Linux I used the BlueZ
3611stack. For the communication with the other devices I used the RFCOMM
3612protocol. Also I used the HCI protocol to gain some control over the device.
3613The helper binary takes a single argument (the name of the Bluetooth
3614interface) and is separated in two stages:
3615
3616@c %** 'THE INITIALIZATION' should be in bigger letters or stand out, not
3617@c %** starting a new section?
3618@node THE INITIALIZATION
3619@subsubsection THE INITIALIZATION
3620
3621@itemize @bullet
3622@item first, it checks if we have root privilegies (@emph{Remember that we need
3623to have root privilegies in order to be able to bring the interface up if it is
3624down or to change its state.}).
3625
3626@item second, it verifies if the interface with the given name exists.
3627
3628@strong{If the interface with that name exists and it is a Bluetooth
3629interface:}
3630
3631@item it creates a RFCOMM socket which will be used for listening and call the
3632@emph{open_device} method
3633
3634On the @emph{open_device} method:
3635@itemize @bullet
3636@item creates a HCI socket used to send control events to the the device
3637@item searches for the device ID using the interface name
3638@item saves the device MAC address
3639@item checks if the interface is down and tries to bring it UP
3640@item checks if the interface is in discoverable mode and tries to make it
3641discoverable
3642@item closes the HCI socket and binds the RFCOMM one
3643@item switches the RFCOMM socket in listening mode
3644@item registers the SDP service (the service will be used by the other devices
3645to get the port on which this device is listening on)
3646@end itemize
3647
3648@item drops the root privilegies
3649
3650@strong{If the interface is not a Bluetooth interface the helper exits with a
3651suitable error}
3652@end itemize
3653
3654@c %** Same as for @node entry above
3655@node THE LOOP
3656@subsubsection THE LOOP
3657
3658The helper binary uses a list where it saves all the connected neighbour
3659devices (@emph{neighbours.devices}) and two buffers (@emph{write_pout} and
3660@emph{write_std}). The first message which is send is a control message with
3661the device's MAC address in order to announce the peer presence to the
3662neighbours. Here are a short description of what happens in the main loop:
3663
3664@itemize @bullet
3665@item Every time when it receives something from the STDIN it processes the
3666data and saves the message in the first buffer (@emph{write_pout}). When it has
3667something in the buffer, it gets the destination address from the buffer,
3668searches the destination address in the list (if there is no connection with
3669that device, it creates a new one and saves it to the list) and sends the
3670message.
3671@item Every time when it receives something on the listening socket it accepts
3672the connection and saves the socket on a list with the reading sockets.
3673@item Every time when it receives something from a reading socket it parses the
3674message, verifies the CRC and saves it in the @emph{write_std} buffer in order
3675to be sent later to the STDOUT.
3676@end itemize
3677
3678So in the main loop we use the select function to wait until one of the file
3679descriptor saved in one of the two file descriptors sets used is ready to use.
3680The first set (@emph{rfds}) represents the reading set and it could contain the
3681list with the reading sockets, the STDIN file descriptor or the listening
3682socket. The second set (@emph{wfds}) is the writing set and it could contain
3683the sending socket or the STDOUT file descriptor. After the select function
3684returns, we check which file descriptor is ready to use and we do what is
3685supposed to do on that kind of event. @emph{For example:} if it is the
3686listening socket then we accept a new connection and save the socket in the
3687reading list; if it is the STDOUT file descriptor, then we write to STDOUT the
3688message from the @emph{write_std} buffer.
3689
3690To find out on which port a device is listening on we connect to the local SDP
3691server and searche the registered service for that device.
3692
3693@emph{You should be aware of the fact that if the device fails to connect to
3694another one when trying to send a message it will attempt one more time. If it
3695fails again, then it skips the message.}
3696@emph{Also you should know that the
3697transport Bluetooth plugin has support for @strong{broadcast messages}.}
3698
3699@node Details about the broadcast implementation
3700@subsubsection Details about the broadcast implementation
3701@c %**end of header
3702
3703First I want to point out that the broadcast functionality for the CONTROL
3704messages is not implemented in a conventional way. Since the inquiry scan time
3705is too big and it will take some time to send a message to all the
3706discoverable devices I decided to tackle the problem in a different way. Here
3707is how I did it:
3708
3709@itemize @bullet
3710@item If it is the first time when I have to broadcast a message I make an
3711inquiry scan and save all the devices' addresses to a vector.
3712@item After the inquiry scan ends I take the first address from the list and I
3713try to connect to it. If it fails, I try to connect to the next one. If it
3714succeeds, I save the socket to a list and send the message to the device.
3715@item When I have to broadcast another message, first I search on the list for
3716a new device which I'm not connected to. If there is no new device on the list
3717I go to the beginning of the list and send the message to the old devices.
3718After 5 cycles I make a new inquiry scan to check out if there are new
3719discoverable devices and save them to the list. If there are no new
3720discoverable devices I reset the cycling counter and go again through the old
3721list and send messages to the devices saved in it.
3722@end itemize
3723
3724@strong{Therefore}:
3725
3726@itemize @bullet
3727@item every time when I have a broadcast message I look up on the list for a
3728new device and send the message to it
3729@item if I reached the end of the list for 5 times and I'm connected to all the
3730devices from the list I make a new inquiry scan. @emph{The number of the list's
3731cycles after an inquiry scan could be increased by redefining the MAX_LOOPS
3732variable}
3733@item when there are no new devices I send messages to the old ones.
3734@end itemize
3735
3736Doing so, the broadcast control messages will reach the devices but with delay.
3737
3738@emph{NOTICE:} When I have to send a message to a certain device first I check
3739on the broadcast list to see if we are connected to that device. If not we try
3740to connect to it and in case of success we save the address and the socket on
3741the list. If we are already connected to that device we simply use the socket.
3742
3743@node Windows functionality
3744@subsubsection Windows functionality
3745@c %**end of header
3746
3747For Windows I decided to use the Microsoft Bluetooth stack which has the
3748advantage of coming standard from Windows XP SP2. The main disadvantage is
3749that it only supports the RFCOMM protocol so we will not be able to have a low
3750level control over the Bluetooth device. Therefore it is the user
3751responsability to check if the device is up and in the discoverable mode. Also
3752there are no tools which could be used for debugging in order to read the data
3753coming from and going to a Bluetooth device, which obviously hindered my work.
3754Another thing that slowed down the implementation of the plugin (besides that
3755I wasn't too accomodated with the win32 API) was that there were some bugs on
3756MinGW regarding the Bluetooth. Now they are solved but you should keep in mind
3757that you should have the latest updates (especially the @emph{ws2bth} header).
3758
3759Besides the fact that it uses the Windows Sockets, the Windows implemenation
3760follows the same principles as the Linux one:
3761
3762@itemize @bullet
3763@item
3764It has a initalization part where it initializes the Windows Sockets, creates a
3765RFCOMM socket which will be binded and switched to the listening mode and
3766registers a SDP service.
3767In the Microsoft Bluetooth API there are two ways to work with the SDP:
3768@itemize @bullet
3769@item an easy way which works with very simple service records
3770@item a hard way which is useful when you need to update or to delete the
3771record
3772@end itemize
3773@end itemize
3774
3775Since I only needed the SDP service to find out on which port the device is
3776listening on and that did not change, I decided to use the easy way. In order
3777to register the service I used the @emph{WSASetService} function and I
3778generated the @emph{Universally Unique Identifier} with the @emph{guidgen.exe}
3779Windows's tool.
3780
3781In the loop section the only difference from the Linux implementation is that
3782I used the GNUNET_NETWORK library for functions like @emph{accept},
3783@emph{bind}, @emph{connect} or @emph{select}. I decided to use the
3784GNUNET_NETWORK library because I also needed to interact with the STDIN and
3785STDOUT handles and on Windows the select function is only defined for sockets,
3786and it will not work for arbitrary file handles.
3787
3788Another difference between Linux and Windows implementation is that in Linux,
3789the Bluetooth address is represented in 48 bits while in Windows is
3790represented in 64 bits. Therefore I had to do some changes on
3791@emph{plugin_transport_wlan} header.
3792
3793Also, currently on Windows the Bluetooth plugin doesn't have support for
3794broadcast messages. When it receives a broadcast message it will skip it.
3795
3796@node Pending features
3797@subsubsection Pending features
3798@c %**end of header
3799
3800@itemize @bullet
3801@item Implement the broadcast functionality on Windows @emph{(currently working
3802on)}
3803@item Implement a testcase for the helper :@ @emph{@ The testcase consists of a
3804program which emaluates the plugin and uses the helper. It will simulate
3805connections, disconnections and data transfers.@ }
3806@end itemize
3807
3808If you have a new idea about a feature of the plugin or suggestions about how
3809I could improve the implementation you are welcome to comment or to contact
3810me.
3811
3812@node WLAN plugin
3813@section WLAN plugin
3814@c %**end of header
3815
3816This section documents how the wlan transport plugin works. Parts which are not
3817implemented yet or could be better implemented are described at the end.
3818
3819@node The ATS Subsystem
3820@section The ATS Subsystem
3821@c %**end of header
3822
3823ATS stands for "automatic transport selection", and the function of ATS in
3824GNUnet is to decide on which address (and thus transport plugin) should be used
3825for two peers to communicate, and what bandwidth limits should be imposed on
3826such an individual connection. To help ATS make an informed decision,
3827higher-level services inform the ATS service about their requirements and the
3828quality of the service rendered. The ATS service also interacts with the
3829transport service to be appraised of working addresses and to communicate its
3830resource allocation decisions. Finally, the ATS service's operation can be
3831observed using a monitoring API.
3832
3833The main logic of the ATS service only collects the available addresses, their
3834performance characteristics and the applications requirements, but does not
3835make the actual allocation decision. This last critical step is left to an ATS
3836plugin, as we have implemented (currently three) different allocation
3837strategies which differ significantly in their performance and maturity, and it
3838is still unclear if any particular plugin is generally superior.
3839
3840@node GNUnet's CORE Subsystem
3841@section GNUnet's CORE Subsystem
3842@c %**end of header
3843
3844The CORE subsystem in GNUnet is responsible for securing link-layer
3845communications between nodes in the GNUnet overlay network. CORE builds on the
3846TRANSPORT subsystem which provides for the actual, insecure, unreliable
3847link-layer communication (for example, via UDP or WLAN), and then adds
3848fundamental security to the connections:
3849
3850@itemize @bullet
3851@item confidentiality with so-called perfect forward secrecy; we use
3852@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman,
3853ECDHE} powered by @uref{http://cr.yp.to/ecdh.html, Curve25519} for the key
3854exchange and then use symmetric encryption, encrypting with both
3855@uref{http://en.wikipedia.org/wiki/Rijndael, AES-256} and
3856@uref{http://en.wikipedia.org/wiki/Twofish, Twofish}
3857@item @uref{http://en.wikipedia.org/wiki/Authentication, authentication} is
3858achieved by signing the ephemeral keys using @uref{http://ed25519.cr.yp.to/,
3859Ed25519}, a deterministic variant of @uref{http://en.wikipedia.org/wiki/ECDSA,
3860ECDSA}
3861@item integrity protection (using @uref{http://en.wikipedia.org/wiki/SHA-2,
3862SHA-512} to do @uref{http://en.wikipedia.org/wiki/Authenticated_encryption,
3863encrypt-then-MAC)}
3864@item @uref{http://en.wikipedia.org/wiki/Replay_attack, replay} protection
3865(using nonces, timestamps, challenge-response, message counters and ephemeral
3866keys)
3867@item liveness (keep-alive messages, timeout)
3868@end itemize
3869
3870@menu
3871* Limitations::
3872* When is a peer "connected"?::
3873* libgnunetcore::
3874* The CORE Client-Service Protocol::
3875* The CORE Peer-to-Peer Protocol::
3876@end menu
3877
3878@node Limitations
3879@subsection Limitations
3880@c %**end of header
3881
3882CORE does not perform @uref{http://en.wikipedia.org/wiki/Routing, routing};
3883using CORE it is only possible to communicate with peers that happen to
3884already be "directly" connected with each other. CORE also does not have an
3885API to allow applications to establish such "direct" connections --- for this,
3886applications can ask TRANSPORT, but TRANSPORT might not be able to establish a
3887"direct" connection. The TOPOLOGY subsystem is responsible for trying to keep
3888a few "direct" connections open at all times. Applications that need to talk
3889to particular peers should use the CADET subsystem, as it can establish
3890arbitrary "indirect" connections.
3891
3892Because CORE does not perform routing, CORE must only be used directly by
3893applications that either perform their own routing logic (such as anonymous
3894file-sharing) or that do not require routing, for example because they are
3895based on flooding the network. CORE communication is unreliable and delivery
3896is possibly out-of-order. Applications that require reliable communication
3897should use the CADET service. Each application can only queue one message per
3898target peer with the CORE service at any time; messages cannot be larger than
3899approximately 63 kilobytes. If messages are small, CORE may group multiple
3900messages (possibly from different applications) prior to encryption. If
3901permitted by the application (using the @uref{http://baus.net/on-tcp_cork/,
3902cork} option), CORE may delay transmissions to facilitate grouping of multiple
3903small messages. If cork is not enabled, CORE will transmit the message as soon
3904as TRANSPORT allows it (TRANSPORT is responsible for limiting bandwidth and
3905congestion control). CORE does not allow flow control; applications are
3906expected to process messages at line-speed. If flow control is needed,
3907applications should use the CADET service.
3908
3909@node When is a peer "connected"?
3910@subsection When is a peer "connected"?
3911@c %**end of header
3912
3913In addition to the security features mentioned above, CORE also provides one
3914additional key feature to applications using it, and that is a limited form of
3915protocol-compatibility checking. CORE distinguishes between TRANSPORT-level
3916connections (which enable communication with other peers) and
3917application-level connections. Applications using the CORE API will
3918(typically) learn about application-level connections from CORE, and not about
3919TRANSPORT-level connections. When a typical application uses CORE, it will
3920specify a set of message types (from @code{gnunet_protocols.h}) that it
3921understands. CORE will then notify the application about connections it has
3922with other peers if and only if those applications registered an intersecting
3923set of message types with their CORE service. Thus, it is quite possible that
3924CORE only exposes a subset of the established direct connections to a
3925particular application --- and different applications running above CORE might
3926see different sets of connections at the same time.
3927
3928A special case are applications that do not register a handler for any message
3929type. CORE assumes that these applications merely want to monitor connections
3930(or "all" messages via other callbacks) and will notify those applications
3931about all connections. This is used, for example, by the @code{gnunet-core}
3932command-line tool to display the active connections. Note that it is also
3933possible that the TRANSPORT service has more active connections than the CORE
3934service, as the CORE service first has to perform a key exchange with
3935connecting peers before exchanging information about supported message types
3936and notifying applications about the new connection.
3937
3938@node libgnunetcore
3939@subsection libgnunetcore
3940@c %**end of header
3941
3942The CORE API (defined in @code{gnunet_core_service.h}) is the basic messaging
3943API used by P2P applications built using GNUnet. It provides applications the
3944ability to send and receive encrypted messages to the peer's "directly"
3945connected neighbours.
3946
3947As CORE connections are generally "direct" connections,@ applications must not
3948assume that they can connect to arbitrary peers this way, as "direct"
3949connections may not always be possible. Applications using CORE are notified
3950about which peers are connected. Creating new "direct" connections must be
3951done using the TRANSPORT API.
3952
3953The CORE API provides unreliable, out-of-order delivery. While the
3954implementation tries to ensure timely, in-order delivery, both message losses
3955and reordering are not detected and must be tolerated by the application. Most
3956important, the core will NOT perform retransmission if messages could not be
3957delivered.
3958
3959Note that CORE allows applications to queue one message per connected peer.
3960The rate at which each connection operates is influenced by the preferences
3961expressed by local application as well as restrictions imposed by the other
3962peer. Local applications can express their preferences for particular
3963connections using the "performance" API of the ATS service.
3964
3965Applications that require more sophisticated transmission capabilities such as
3966TCP-like behavior, or if you intend to send messages to arbitrary remote
3967peers, should use the CADET API.
3968
3969The typical use of the CORE API is to connect to the CORE service using
3970@code{GNUNET_CORE_connect}, process events from the CORE service (such as
3971peers connecting, peers disconnecting and incoming messages) and send messages
3972to connected peers using @code{GNUNET_CORE_notify_transmit_ready}. Note that
3973applications must cancel pending transmission requests if they receive a
3974disconnect event for a peer that had a transmission pending; furthermore,
3975queueing more than one transmission request per peer per application using the
3976service is not permitted.
3977
3978The CORE API also allows applications to monitor all communications of the
3979peer prior to encryption (for outgoing messages) or after decryption (for
3980incoming messages). This can be useful for debugging, diagnostics or to
3981establish the presence of cover traffic (for anonymity). As monitoring
3982applications are often not interested in the payload, the monitoring callbacks
3983can be configured to only provide the message headers (including the message
3984type and size) instead of copying the full data stream to the monitoring
3985client.
3986
3987The init callback of the @code{GNUNET_CORE_connect} function is called with
3988the hash of the public key of the peer. This public key is used to identify
3989the peer globally in the GNUnet network. Applications are encouraged to check
3990that the provided hash matches the hash that they are using (as theoretically
3991the application may be using a different configuration file with a different
3992private key, which would result in hard to find bugs).
3993
3994As with most service APIs, the CORE API isolates applications from crashes of
3995the CORE service. If the CORE service crashes, the application will see
3996disconnect events for all existing connections. Once the connections are
3997re-established, the applications will be receive matching connect events.
3998
3999@node The CORE Client-Service Protocol
4000@subsection The CORE Client-Service Protocol
4001@c %**end of header
4002
4003This section describes the protocol between an application using the CORE
4004service (the client) and the CORE service process itself.
4005
4006
4007@menu
4008* Setup2::
4009* Notifications::
4010* Sending::
4011@end menu
4012
4013@node Setup2
4014@subsubsection Setup2
4015@c %**end of header
4016
4017When a client connects to the CORE service, it first sends a
4018@code{InitMessage} which specifies options for the connection and a set of
4019message type values which are supported by the application. The options
4020bitmask specifies which events the client would like to be notified about. The
4021options include:
4022
4023@table @asis
4024@item GNUNET_CORE_OPTION_NOTHING No notifications
4025@item GNUNET_CORE_OPTION_STATUS_CHANGE Peers connecting and disconnecting
4026@item GNUNET_CORE_OPTION_FULL_INBOUND All inbound messages (after decryption) with
4027full payload
4028@item GNUNET_CORE_OPTION_HDR_INBOUND Just the @code{MessageHeader}
4029of all inbound messages
4030@item GNUNET_CORE_OPTION_FULL_OUTBOUND All outbound
4031messages (prior to encryption) with full payload
4032@item GNUNET_CORE_OPTION_HDR_OUTBOUND Just the @code{MessageHeader} of all outbound
4033messages
4034@end table
4035
4036Typical applications will only monitor for connection status changes.
4037
4038The CORE service responds to the @code{InitMessage} with an
4039@code{InitReplyMessage} which contains the peer's identity. Afterwards, both
4040CORE and the client can send messages.
4041
4042@node Notifications
4043@subsubsection Notifications
4044@c %**end of header
4045
4046The CORE will send @code{ConnectNotifyMessage}s and
4047@code{DisconnectNotifyMessage}s whenever peers connect or disconnect from the
4048CORE (assuming their type maps overlap with the message types registered by
4049the client). When the CORE receives a message that matches the set of message
4050types specified during the @code{InitMessage} (or if monitoring is enabled in
4051for inbound messages in the options), it sends a @code{NotifyTrafficMessage}
4052with the peer identity of the sender and the decrypted payload. The same
4053message format (except with @code{GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND}
4054for the message type) is used to notify clients monitoring outbound messages;
4055here, the peer identity given is that of the receiver.
4056
4057@node Sending
4058@subsubsection Sending
4059@c %**end of header
4060
4061When a client wants to transmit a message, it first requests a transmission
4062slot by sending a @code{SendMessageRequest} which specifies the priority,
4063deadline and size of the message. Note that these values may be ignored by
4064CORE. When CORE is ready for the message, it answers with a
4065@code{SendMessageReady} response. The client can then transmit the payload
4066with a @code{SendMessage} message. Note that the actual message size in the
4067@code{SendMessage} is allowed to be smaller than the size in the original
4068request. A client may at any time send a fresh @code{SendMessageRequest},
4069which then superceeds the previous @code{SendMessageRequest}, which is then no
4070longer valid. The client can tell which @code{SendMessageRequest} the CORE
4071service's @code{SendMessageReady} message is for as all of these messages
4072contain a "unique" request ID (based on a counter incremented by the client
4073for each request).
4074
4075@node The CORE Peer-to-Peer Protocol
4076@subsection The CORE Peer-to-Peer Protocol
4077@c %**end of header
4078
4079
4080@menu
4081* Creating the EphemeralKeyMessage::
4082* Establishing a connection::
4083* Encryption and Decryption::
4084* Type maps::
4085@end menu
4086
4087@node Creating the EphemeralKeyMessage
4088@subsubsection Creating the EphemeralKeyMessage
4089@c %**end of header
4090
4091When the CORE service starts, each peer creates a fresh ephemeral (ECC)
4092public-private key pair and signs the corresponding @code{EphemeralKeyMessage}
4093with its long-term key (which we usually call the peer's identity; the hash of
4094the public long term key is what results in a @code{struct
4095GNUNET_PeerIdentity} in all GNUnet APIs. The ephemeral key is ONLY used for an
4096@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman,
4097ECDHE} exchange by the CORE service to establish symmetric session keys. A
4098peer will use the same @code{EphemeralKeyMessage} for all peers for
4099@code{REKEY_FREQUENCY}, which is usually 12 hours. After that time, it will
4100create a fresh ephemeral key (forgetting the old one) and broadcast the new
4101@code{EphemeralKeyMessage} to all connected peers, resulting in fresh
4102symmetric session keys. Note that peers independently decide on when to
4103discard ephemeral keys; it is not a protocol violation to discard keys more
4104often. Ephemeral keys are also never stored to disk; restarting a peer will
4105thus always create a fresh ephemeral key. The use of ephemeral keys is what
4106provides @uref{http://en.wikipedia.org/wiki/Forward_secrecy, forward secrecy}.
4107
4108Just before transmission, the @code{EphemeralKeyMessage} is patched to reflect
4109the current sender_status, which specifies the current state of the connection
4110from the point of view of the sender. The possible values are:
4111
4112@table @asis
4113@item KX_STATE_DOWN Initial value, never used on the network
4114@item KX_STATE_KEY_SENT We sent our ephemeral key, do not know the key of the other
4115peer
4116@item KX_STATE_KEY_RECEIVED This peer has received a valid ephemeral key
4117of the other peer, but we are waiting for the other peer to confirm it's
4118authenticity (ability to decode) via challenge-response.
4119@item KX_STATE_UP The
4120connection is fully up from the point of view of the sender (now performing
4121keep-alives)
4122@item KX_STATE_REKEY_SENT The sender has initiated a rekeying
4123operation; the other peer has so far failed to confirm a working connection
4124using the new ephemeral key
4125@end table
4126
4127@node Establishing a connection
4128@subsubsection Establishing a connection
4129@c %**end of header
4130
4131Peers begin their interaction by sending a @code{EphemeralKeyMessage} to the
4132other peer once the TRANSPORT service notifies the CORE service about the
4133connection. A peer receiving an @code{EphemeralKeyMessage} with a status
4134indicating that the sender does not have the receiver's ephemeral key, the
4135receiver's @code{EphemeralKeyMessage} is sent in response.@ Additionally, if
4136the receiver has not yet confirmed the authenticity of the sender, it also
4137sends an (encrypted)@code{PingMessage} with a challenge (and the identity of
4138the target) to the other peer. Peers receiving a @code{PingMessage} respond
4139with an (encrypted) @code{PongMessage} which includes the challenge. Peers
4140receiving a @code{PongMessage} check the challenge, and if it matches set the
4141connection to @code{KX_STATE_UP}.
4142
4143@node Encryption and Decryption
4144@subsubsection Encryption and Decryption
4145@c %**end of header
4146
4147All functions related to the key exchange and encryption/decryption of
4148messages can be found in @code{gnunet-service-core_kx.c} (except for the
4149cryptographic primitives, which are in @code{util/crypto*.c}).@ Given the key
4150material from ECDHE, a
4151@uref{http://en.wikipedia.org/wiki/Key_derivation_function, Key derivation
4152function} is used to derive two pairs of encryption and decryption keys for
4153AES-256 and TwoFish, as well as initialization vectors and authentication keys
4154(for @uref{http://en.wikipedia.org/wiki/HMAC, HMAC}). The HMAC is computed
4155over the encrypted payload. Encrypted messages include an iv_seed and the HMAC
4156in the header.
4157
4158Each encrypted message in the CORE service includes a sequence number and a
4159timestamp in the encrypted payload. The CORE service remembers the largest
4160observed sequence number and a bit-mask which represents which of the previous
416132 sequence numbers were already used. Messages with sequence numbers lower
4162than the largest observed sequence number minus 32 are discarded. Messages
4163with a timestamp that is less than @code{REKEY_TOLERANCE} off (5 minutes) are
4164also discarded. This of course means that system clocks need to be reasonably
4165synchronized for peers to be able to communicate. Additionally, as the
4166ephemeral key changes every 12h, a peer would not even be able to decrypt
4167messages older than 12h.
4168
4169@node Type maps
4170@subsubsection Type maps
4171@c %**end of header
4172
4173Once an encrypted connection has been established, peers begin to exchange
4174type maps. Type maps are used to allow the CORE service to determine which
4175(encrypted) connections should be shown to which applications. A type map is
4176an array of 65536 bits representing the different types of messages understood
4177by applications using the CORE service. Each CORE service maintains this map,
4178simply by setting the respective bit for each message type supported by any of
4179the applications using the CORE service. Note that bits for message types
4180embedded in higher-level protocols (such as MESH) will not be included in
4181these type maps.
4182
4183Typically, the type map of a peer will be sparse. Thus, the CORE service
4184attempts to compress its type map using @code{gzip}-style compression
4185("deflate") prior to transmission. However, if the compression fails to
4186compact the map, the map may also be transmitted without compression
4187(resulting in @code{GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP} or
4188@code{GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP} messages respectively). Upon
4189receiving a type map, the respective CORE service notifies applications about
4190the connection to the other peer if they support any message type indicated in
4191the type map (or no message type at all). If the CORE service experience a
4192connect or disconnect event from an application, it updates its type map
4193(setting or unsetting the respective bits) and notifies its neighbours about
4194the change. The CORE services of the neighbours then in turn generate connect
4195and disconnect events for the peer that sent the type map for their respective
4196applications. As CORE messages may be lost, the CORE service confirms
4197receiving a type map by sending back a
4198@code{GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP}. If such a confirmation (with
4199the correct hash of the type map) is not received, the sender will retransmit
4200the type map (with exponential back-off).
4201
4202@node GNUnet's CADET subsystem
4203@section GNUnet's CADET subsystem
4204
4205The CADET subsystem in GNUnet is responsible for secure end-to-end
4206communications between nodes in the GNUnet overlay network. CADET builds on the
4207CORE subsystem which provides for the link-layer communication and then adds
4208routing, forwarding and additional security to the connections. CADET offers
4209the same cryptographic services as CORE, but on an end-to-end level. This is
4210done so peers retransmitting traffic on behalf of other peers cannot access the
4211payload data.
4212
4213@itemize @bullet
4214@item CADET provides confidentiality with so-called perfect forward secrecy; we
4215use ECDHE powered by Curve25519 for the key exchange and then use symmetric
4216encryption, encrypting with both AES-256 and Twofish
4217@item authentication is achieved by signing the ephemeral keys using Ed25519, a
4218deterministic variant of ECDSA
4219@item integrity protection (using SHA-512 to do encrypt-then-MAC, although only
4220256 bits are sent to reduce overhead)
4221@item replay protection (using nonces, timestamps, challenge-response, message
4222counters and ephemeral keys)
4223@item liveness (keep-alive messages, timeout)
4224@end itemize
4225
4226Additional to the CORE-like security benefits, CADET offers other properties
4227that make it a more universal service than CORE.
4228
4229@itemize @bullet
4230@item CADET can establish channels to arbitrary peers in GNUnet. If a peer is
4231not immediately reachable, CADET will find a path through the network and ask
4232other peers to retransmit the traffic on its behalf.
4233@item CADET offers (optional) reliability mechanisms. In a reliable channel
4234traffic is guaranteed to arrive complete, unchanged and in-order.
4235@item CADET takes care of flow and congestion control mechanisms, not allowing
4236the sender to send more traffic than the receiver or the network are able to
4237process.
4238@end itemize
4239
4240@menu
4241* libgnunetcadet::
4242@end menu
4243
4244@node libgnunetcadet
4245@subsection libgnunetcadet
4246
4247
4248The CADET API (defined in gnunet_cadet_service.h) is the messaging API used by
4249P2P applications built using GNUnet. It provides applications the ability to
4250send and receive encrypted messages to any peer participating in GNUnet. The
4251API is heavily base on the CORE API.
4252
4253CADET delivers messages to other peers in "channels". A channel is a permanent
4254connection defined by a destination peer (identified by its public key) and a
4255port number. Internally, CADET tunnels all channels towards a destiantion peer
4256using one session key and relays the data on multiple "connections",
4257independent from the channels.
4258
4259Each channel has optional paramenters, the most important being the reliability
4260flag. Should a message get lost on TRANSPORT/CORE level, if a channel is
4261created with as reliable, CADET will retransmit the lost message and deliver it
4262in order to the destination application.
4263
4264To communicate with other peers using CADET, it is necessary to first connect
4265to the service using @code{GNUNET_CADET_connect}. This function takes several
4266parameters in form of callbacks, to allow the client to react to various
4267events, like incoming channels or channels that terminate, as well as specify a
4268list of ports the client wishes to listen to (at the moment it is not possible
4269to start listening on further ports once connected, but nothing prevents a
4270client to connect several times to CADET, even do one connection per listening
4271port). The function returns a handle which has to be used for any further
4272interaction with the service.
4273
4274To connect to a remote peer a client has to call the
4275@code{GNUNET_CADET_channel_create} function. The most important parameters
4276given are the remote peer's identity (it public key) and a port, which
4277specifies which application on the remote peer to connect to, similar to
4278TCP/UDP ports. CADET will then find the peer in the GNUnet network and
4279establish the proper low-level connections and do the necessary key exchanges
4280to assure and authenticated, secure and verified communication. Similar to
4281@code{GNUNET_CADET_connect},@code{GNUNET_CADET_create_channel} returns a handle
4282to interact with the created channel.
4283
4284For every message the client wants to send to the remote application,
4285@code{GNUNET_CADET_notify_transmit_ready} must be called, indicating the
4286channel on which the message should be sent and the size of the message (but
4287not the message itself!). Once CADET is ready to send the message, the provided
4288callback will fire, and the message contents are provided to this callback.
4289
4290Please note the CADET does not provide an explicit notification of when a
4291channel is connected. In loosely connected networks, like big wireless mesh
4292networks, this can take several seconds, even minutes in the worst case. To be
4293alerted when a channel is online, a client can call
4294@code{GNUNET_CADET_notify_transmit_ready} immediately after
4295@code{GNUNET_CADET_create_channel}. When the callback is activated, it means
4296that the channel is online. The callback can give 0 bytes to CADET if no
4297message is to be sent, this is ok.
4298
4299If a transmission was requested but before the callback fires it is no longer
4300needed, it can be cancelled with
4301@code{GNUNET_CADET_notify_transmit_ready_cancel}, which uses the handle given
4302back by @code{GNUNET_CADET_notify_transmit_ready}. As in the case of CORE, only
4303one message can be requested at a time: a client must not call
4304@code{GNUNET_CADET_notify_transmit_ready} again until the callback is called or
4305the request is cancelled.
4306
4307When a channel is no longer needed, a client can call
4308@code{GNUNET_CADET_channel_destroy} to get rid of it. Note that CADET will try
4309to transmit all pending traffic before notifying the remote peer of the
4310destruction of the channel, including retransmitting lost messages if the
4311channel was reliable.
4312
4313Incoming channels, channels being closed by the remote peer, and traffic on any
4314incoming or outgoing channels are given to the client when CADET executes the
4315callbacks given to it at the time of @code{GNUNET_CADET_connect}.
4316
4317Finally, when an application no longer wants to use CADET, it should call
4318@code{GNUNET_CADET_disconnect}, but first all channels and pending
4319transmissions must be closed (otherwise CADET will complain).
4320
4321@node GNUnet's NSE subsystem
4322@section GNUnet's NSE subsystem
4323
4324
4325NSE stands for Network Size Estimation. The NSE subsystem provides other
4326subsystems and users with a rough estimate of the number of peers currently
4327participating in the GNUnet overlay. The computed value is not a precise number
4328as producing a precise number in a decentralized, efficient and secure way is
4329impossible. While NSE's estimate is inherently imprecise, NSE also gives the
4330expected range. For a peer that has been running in a stable network for a
4331while, the real network size will typically (99.7% of the time) be in the range
4332of [2/3 estimate, 3/2 estimate]. We will now give an overview of the algorithm
4333used to calcualte the estimate; all of the details can be found in this
4334technical report.
4335
4336@menu
4337* Motivation::
4338* Principle::
4339* libgnunetnse::
4340* The NSE Client-Service Protocol::
4341* The NSE Peer-to-Peer Protocol::
4342@end menu
4343
4344@node Motivation
4345@subsection Motivation
4346
4347
4348Some subsytems, like DHT, need to know the size of the GNUnet network to
4349optimize some parameters of their own protocol. The decentralized nature of
4350GNUnet makes efficient and securely counting the exact number of peers
4351infeasable. Although there are several decentralized algorithms to count the
4352number of peers in a system, so far there is none to do so securely. Other
4353protocols may allow any malicious peer to manipulate the final result or to
4354take advantage of the system to perform DoS (Denial of Service) attacks against
4355the network. GNUnet's NSE protocol avoids these drawbacks.
4356
4357
4358
4359@menu
4360* Security::
4361@end menu
4362
4363@node Security
4364@subsubsection Security
4365
4366
4367The NSE subsystem is designed to be resilient against these attacks. It uses
4368@uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proofs of work} to
4369prevent one peer from impersonating a large number of participants, which would
4370otherwise allow an adversary to artifically inflate the estimate. The DoS
4371protection comes from the time-based nature of the protocol: the estimates are
4372calculated periodically and out-of-time traffic is either ignored or stored for
4373later retransmission by benign peers. In particular, peers cannot trigger
4374global network communication at will.
4375
4376@node Principle
4377@subsection Principle
4378
4379
4380The algorithm calculates the estimate by finding the globally closest peer ID
4381to a random, time-based value.
4382
4383The idea is that the closer the ID is to the random value, the more "densely
4384packed" the ID space is, and therefore, more peers are in the network.
4385
4386
4387
4388@menu
4389* Example::
4390* Algorithm::
4391* Target value::
4392* Timing::
4393* Controlled Flooding::
4394* Calculating the estimate::
4395@end menu
4396
4397@node Example
4398@subsubsection Example
4399
4400
4401Suppose all peers have IDs between 0 and 100 (our ID space), and the random
4402value is 42. If the closest peer has the ID 70 we can imagine that the average
4403"distance" between peers is around 30 and therefore the are around 3 peers in
4404the whole ID space. On the other hand, if the closest peer has the ID 44, we
4405can imagine that the space is rather packed with peers, maybe as much as 50 of
4406them. Naturally, we could have been rather unlucky, and there is only one peer
4407and happens to have the ID 44. Thus, the current estimate is calculated as the
4408average over multiple rounds, and not just a single sample.
4409
4410@node Algorithm
4411@subsubsection Algorithm
4412
4413
4414Given that example, one can imagine that the job of the subsystem is to
4415efficiently communicate the ID of the closest peer to the target value to all
4416the other peers, who will calculate the estimate from it.
4417
4418@node Target value
4419@subsubsection Target value
4420
4421@c %**end of header
4422
4423The target value itself is generated by hashing the current time, rounded down
4424to an agreed value. If the rounding amount is 1h (default) and the time is
442512:34:56, the time to hash would be 12:00:00. The process is repeated each
4426rouning amount (in this example would be every hour). Every repetition is
4427called a round.
4428
4429@node Timing
4430@subsubsection Timing
4431@c %**end of header
4432
4433The NSE subsystem has some timing control to avoid everybody broadcasting its
4434ID all at one. Once each peer has the target random value, it compares its own
4435ID to the target and calculates the hypothetical size of the network if that
4436peer were to be the closest. Then it compares the hypothetical size with the
4437estimate from the previous rounds. For each value there is an assiciated point
4438in the period, let's call it "broadcast time". If its own hypothetical estimate
4439is the same as the previous global estimate, its "broadcast time" will be in
4440the middle of the round. If its bigger it will be earlier and if its smaler
4441(the most likely case) it will be later. This ensures that the peers closests
4442to the target value start broadcasting their ID the first.
4443
4444@node Controlled Flooding
4445@subsubsection Controlled Flooding
4446
4447@c %**end of header
4448
4449When a peer receives a value, first it verifies that it is closer than the
4450closest value it had so far, otherwise it answers the incoming message with a
4451message containing the better value. Then it checks a proof of work that must
4452be included in the incoming message, to ensure that the other peer's ID is not
4453made up (otherwise a malicious peer could claim to have an ID of exactly the
4454target value every round). Once validated, it compares the brodcast time of the
4455received value with the current time and if it's not too early, sends the
4456received value to its neighbors. Otherwise it stores the value until the
4457correct broadcast time comes. This prevents unnecessary traffic of sub-optimal
4458values, since a better value can come before the broadcast time, rendering the
4459previous one obsolete and saving the traffic that would have been used to
4460broadcast it to the neighbors.
4461
4462@node Calculating the estimate
4463@subsubsection Calculating the estimate
4464
4465@c %**end of header
4466
4467Once the closest ID has been spread across the network each peer gets the exact
4468distance betweed this ID and the target value of the round and calculates the
4469estimate with a mathematical formula described in the tech report. The estimate
4470generated with this method for a single round is not very precise. Remember the
4471case of the example, where the only peer is the ID 44 and we happen to generate
4472the target value 42, thinking there are 50 peers in the network. Therefore, the
4473NSE subsystem remembers the last 64 estimates and calculates an average over
4474them, giving a result of which usually has one bit of uncertainty (the real
4475size could be half of the estimate or twice as much). Note that the actual
4476network size is calculated in powers of two of the raw input, thus one bit of
4477uncertainty means a factor of two in the size estimate.
4478
4479@node libgnunetnse
4480@subsection libgnunetnse
4481
4482@c %**end of header
4483
4484The NSE subsystem has the simplest API of all services, with only two calls:
4485@code{GNUNET_NSE_connect} and @code{GNUNET_NSE_disconnect}.
4486
4487The connect call gets a callback function as a parameter and this function is
4488called each time the network agrees on an estimate. This usually is once per
4489round, with some exceptions: if the closest peer has a late local clock and
4490starts spreading his ID after everyone else agreed on a value, the callback
4491might be activated twice in a round, the second value being always bigger than
4492the first. The default round time is set to 1 hour.
4493
4494The disconnect call disconnects from the NSE subsystem and the callback is no
4495longer called with new estimates.
4496
4497
4498
4499@menu
4500* Results::
4501* Examples2::
4502@end menu
4503
4504@node Results
4505@subsubsection Results
4506
4507@c %**end of header
4508
4509The callback provides two values: the average and the
4510@uref{http://en.wikipedia.org/wiki/Standard_deviation, standard deviation} of
4511the last 64 rounds. The values provided by the callback function are
4512logarithmic, this means that the real estimate numbers can be obtained by
4513calculating 2 to the power of the given value (2average). From a statistics
4514point of view this means that:
4515
4516@itemize @bullet
4517@item 68% of the time the real size is included in the interval
4518[(2average-stddev), 2]
4519@item 95% of the time the real size is included in the interval
4520[(2average-2*stddev, 2^average+2*stddev]
4521@item 99.7% of the time the real size is included in the interval
4522[(2average-3*stddev, 2average+3*stddev]
4523@end itemize
4524
4525The expected standard variation for 64 rounds in a network of stable size is
45260.2. Thus, we can say that normally:
4527
4528@itemize @bullet
4529@item 68% of the time the real size is in the range [-13%, +15%]
4530@item 95% of the time the real size is in the range [-24%, +32%]
4531@item 99.7% of the time the real size is in the range [-34%, +52%]
4532@end itemize
4533
4534As said in the introduction, we can be quite sure that usually the real size is
4535between one third and three times the estimate. This can of course vary with
4536network conditions. Thus, applications may want to also consider the provided
4537standard deviation value, not only the average (in particular, if the standard
4538veriation is very high, the average maybe meaningless: the network size is
4539changing rapidly).
4540
4541@node Examples2
4542@subsubsection Examples2
4543
4544@c %**end of header
4545
4546Let's close with a couple examples.
4547
4548@table @asis
4549
4550@item Average: 10, std dev: 1 Here the estimate would be 2^10 = 1024 peers.@
4551The range in which we can be 95% sure is: [2^8, 2^12] = [256, 4096]. We can be
4552very (>99.7%) sure that the network is not a hundred peers and absolutely sure
4553that it is not a million peers, but somewhere around a thousand.
4554
4555@item Average 22, std dev: 0.2 Here the estimate would be 2^22 = 4 Million peers.@
4556The range in which we can be 99.7% sure is: [2^21.4, 2^22.6] = [2.8M, 6.3M].
4557We can be sure that the network size is around four million, with absolutely
4558way of it being 1 million.
4559
4560@end table
4561
4562To put this in perspective, if someone remembers the LHC Higgs boson results,
4563were announced with "5 sigma" and "6 sigma" certainties. In this case a 5 sigma
4564minimum would be 2 million and a 6 sigma minimum, 1.8 million.
4565
4566@node The NSE Client-Service Protocol
4567@subsection The NSE Client-Service Protocol
4568
4569@c %**end of header
4570
4571As with the API, the client-service protocol is very simple, only has 2
4572different messages, defined in @code{src/nse/nse.h}:
4573
4574@itemize @bullet
4575@item @code{GNUNET_MESSAGE_TYPE_NSE_START}@ This message has no parameters and
4576is sent from the client to the service upon connection.
4577@item @code{GNUNET_MESSAGE_TYPE_NSE_ESTIMATE}@ This message is sent from the
4578service to the client for every new estimate and upon connection. Contains a
4579timestamp for the estimate, the average and the standard deviation for the
4580respective round.
4581@end itemize
4582
4583When the @code{GNUNET_NSE_disconnect} API call is executed, the client simply
4584disconnects from the service, with no message involved.
4585
4586@node The NSE Peer-to-Peer Protocol
4587@subsection The NSE Peer-to-Peer Protocol
4588
4589@c %**end of header
4590
4591The NSE subsystem only has one message in the P2P protocol, the
4592@code{GNUNET_MESSAGE_TYPE_NSE_P2P_FLOOD} message.
4593
4594This message key contents are the timestamp to identify the round (differences
4595in system clocks may cause some peers to send messages way too early or way too
4596late, so the timestamp allows other peers to identify such messages easily),
4597the @uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proof of work}
4598used to make it difficult to mount a
4599@uref{http://en.wikipedia.org/wiki/Sybil_attack, Sybil attack}, and the public
4600key, which is used to verify the signature on the message.
4601
4602Every peer stores a message for the previous, current and next round. The
4603messages for the previous and current round are given to peers that connect to
4604us. The message for the next round is simply stored until our system clock
4605advances to the next round. The message for the current round is what we are
4606flooding the network with right now. At the beginning of each round the peer
4607does the following:
4608
4609@itemize @bullet
4610@item calculates his own distance to the target value
4611@item creates, signs and stores the message for the current round (unless it
4612has a better message in the "next round" slot which came early in the previous
4613round)
4614@item calculates, based on the stored round message (own or received) when to
4615stard flooding it to its neighbors
4616@end itemize
4617
4618Upon receiving a message the peer checks the validity of the message (round,
4619proof of work, signature). The next action depends on the contents of the
4620incoming message:
4621
4622@itemize @bullet
4623@item if the message is worse than the current stored message, the peer sends
4624the current message back immediately, to stop the other peer from spreading
4625suboptimal results
4626@item if the message is better than the current stored message, the peer stores
4627the new message and calculates the new target time to start spreading it to its
4628neighbors (excluding the one the message came from)
4629@item if the message is for the previous round, it is compared to the message
4630stored in the "previous round slot", which may then be updated
4631@item if the message is for the next round, it is compared to the message
4632stored in the "next round slot", which again may then be updated
4633@end itemize
4634
4635Finally, when it comes to send the stored message for the current round to the
4636neighbors there is a random delay added for each neighbor, to avoid traffic
4637spikes and minimize cross-messages.
4638
4639@node GNUnet's HOSTLIST subsystem
4640@section GNUnet's HOSTLIST subsystem
4641
4642@c %**end of header
4643
4644Peers in the GNUnet overlay network need address information so that they can
4645connect with other peers. GNUnet uses so called HELLO messages to store and
4646exchange peer addresses. GNUnet provides several methods for peers to obtain
4647this information:
4648
4649@itemize @bullet
4650@item out-of-band exchange of HELLO messages (manually, using for example
4651gnunet-peerinfo)
4652@item HELLO messages shipped with GNUnet (automatic with distribution)
4653@item UDP neighbor discovery in LAN (IPv4 broadcast, IPv6 multicast)
4654@item topology gossiping (learning from other peers we already connected to),
4655and
4656@item the HOSTLIST daemon covered in this section, which is particularly
4657relevant for bootstrapping new peers.
4658@end itemize
4659
4660New peers have no existing connections (and thus cannot learn from gossip among
4661peers), may not have other peers in their LAN and might be started with an
4662outdated set of HELLO messages from the distribution. In this case, getting new
4663peers to connect to the network requires either manual effort or the use of a
4664HOSTLIST to obtain HELLOs.
4665
4666@menu
4667* HELLOs::
4668* Overview for the HOSTLIST subsystem::
4669* Interacting with the HOSTLIST daemon::
4670* Hostlist security address validation::
4671* The HOSTLIST daemon::
4672* The HOSTLIST server::
4673* The HOSTLIST client::
4674* Usage::
4675@end menu
4676
4677@node HELLOs
4678@subsection HELLOs
4679
4680@c %**end of header
4681
4682The basic information peers require to connect to other peers are contained in
4683so called HELLO messages you can think of as a business card. Besides the
4684identity of the peer (based on the cryptographic public key) a HELLO message
4685may contain address information that specifies ways to contact a peer. By
4686obtaining HELLO messages, a peer can learn how to contact other peers.
4687
4688@node Overview for the HOSTLIST subsystem
4689@subsection Overview for the HOSTLIST subsystem
4690
4691@c %**end of header
4692
4693The HOSTLIST subsystem provides a way to distribute and obtain contact
4694information to connect to other peers using a simple HTTP GET request. It's
4695implementation is split in three parts, the main file for the daemon itself
4696(gnunet-daemon-hostlist.c), the HTTP client used to download peer information
4697(hostlist-client.c) and the server component used to provide this information
4698to other peers (hostlist-server.c). The server is basically a small HTTP web
4699server (based on GNU libmicrohttpd) which provides a list of HELLOs known to
4700the local peer for download. The client component is basically a HTTP client
4701(based on libcurl) which can download hostlists from one or more websites. The
4702hostlist format is a binary blob containing a sequence of HELLO messages. Note
4703that any HTTP server can theoretically serve a hostlist, the build-in hostlist
4704server makes it simply convenient to offer this service.
4705
4706
4707@menu
4708* Features::
4709* Limitations2::
4710@end menu
4711
4712@node Features
4713@subsubsection Features
4714
4715@c %**end of header
4716
4717The HOSTLIST daemon can:
4718
4719@itemize @bullet
4720@item provide HELLO messages with validated addresses obtained from PEERINFO to
4721download for other peers
4722@item download HELLO messages and forward these message to the TRANSPORT
4723subsystem for validation
4724@item advertises the URL of this peer's hostlist address to other peers via
4725gossip
4726@item automatically learn about hostlist servers from the gossip of other peers
4727@end itemize
4728
4729@node Limitations2
4730@subsubsection Limitations2
4731
4732@c %**end of header
4733
4734The HOSTLIST daemon does not:
4735
4736@itemize @bullet
4737@item verify the cryptographic information in the HELLO messages
4738@item verify the address information in the HELLO messages
4739@end itemize
4740
4741@node Interacting with the HOSTLIST daemon
4742@subsection Interacting with the HOSTLIST daemon
4743
4744@c %**end of header
4745
4746The HOSTLIST subsystem is currently implemented as a daemon, so there is no
4747need for the user to interact with it and therefore there is no command line
4748tool and no API to communicate with the daemon. In the future, we can envision
4749changing this to allow users to manually trigger the download of a hostlist.
4750
4751Since there is no command line interface to interact with HOSTLIST, the only
4752way to interact with the hostlist is to use STATISTICS to obtain or modify
4753information about the status of HOSTLIST:
4754@example
4755$ gnunet-statistics -s hostlist
4756@end example
4757
4758In particular, HOSTLIST includes a @strong{persistent} value in statistics that
4759specifies when the hostlist server might be queried next. As this value is
4760exponentially increasing during runtime, developers may want to reset or
4761manually adjust it. Note that HOSTLIST (but not STATISTICS) needs to be
4762shutdown if changes to this value are to have any effect on the daemon (as
4763HOSTLIST does not monitor STATISTICS for changes to the download
4764frequency).
4765
4766@node Hostlist security address validation
4767@subsection Hostlist security address validation
4768
4769@c %**end of header
4770
4771Since information obtained from other parties cannot be trusted without
4772validation, we have to distinguish between @emph{validated} and @emph{not
4773validated} addresses. Before using (and so trusting) information from other
4774parties, this information has to be double-checked (validated). Address
4775validation is not done by HOSTLIST but by the TRANSPORT service.
4776
4777The HOSTLIST component is functionally located between the PEERINFO and the
4778TRANSPORT subsystem. When acting as a server, the daemon obtains valid
4779(@emph{validated}) peer information (HELLO messages) from the PEERINFO service
4780and provides it to other peers. When acting as a client, it contacts the
4781HOSTLIST servers specified in the configuration, downloads the (unvalidated)
4782list of HELLO messages and forwards these information to the TRANSPORT server
4783to validate the addresses.
4784
4785@node The HOSTLIST daemon
4786@subsection The HOSTLIST daemon
4787
4788@c %**end of header
4789
4790The hostlist daemon is the main component of the HOSTLIST subsystem. It is
4791started by the ARM service and (if configured) starts the HOSTLIST client and
4792server components.
4793
4794If the daemon provides a hostlist itself it can advertise it's own hostlist to
4795other peers. To do so it sends a GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT
4796message to other peers when they connect to this peer on the CORE level. This
4797hostlist advertisement message contains the URL to access the HOSTLIST HTTP
4798server of the sender. The daemon may also subscribe to this type of message
4799from CORE service, and then forward these kind of message to the HOSTLIST
4800client. The client then uses all available URLs to download peer information
4801when necessary.
4802
4803When starting, the HOSTLIST daemon first connects to the CORE subsystem and if
4804hostlist learning is enabled, registers a CORE handler to receive this kind of
4805messages. Next it starts (if configured) the client and server. It passes
4806pointers to CORE connect and disconnect and receive handlers where the client
4807and server store their functions, so the daemon can notify them about CORE
4808events.
4809
4810To clean up on shutdown, the daemon has a cleaning task, shutting down all
4811subsystems and disconnecting from CORE.
4812
4813@node The HOSTLIST server
4814@subsection The HOSTLIST server
4815
4816@c %**end of header
4817
4818The server provides a way for other peers to obtain HELLOs. Basically it is a
4819small web server other peers can connect to and download a list of HELLOs using
4820standard HTTP; it may also advertise the URL of the hostlist to other peers
4821connecting on CORE level.
4822
4823
4824@menu
4825* The HTTP Server::
4826* Advertising the URL::
4827@end menu
4828
4829@node The HTTP Server
4830@subsubsection The HTTP Server
4831
4832@c %**end of header
4833
4834During startup, the server starts a web server listening on the port specified
4835with the HTTPPORT value (default 8080). In addition it connects to the PEERINFO
4836service to obtain peer information. The HOSTLIST server uses the
4837GNUNET_PEERINFO_iterate function to request HELLO information for all peers and
4838adds their information to a new hostlist if they are suitable (expired
4839addresses and HELLOs without addresses are both not suitable) and the maximum
4840size for a hostlist is not exceeded (MAX_BYTES_PER_HOSTLISTS = 500000). When
4841PEERINFO finishes (with a last NULL callback), the server destroys the previous
4842hostlist response available for download on the web server and replaces it with
4843the updated hostlist. The hostlist format is basically a sequence of HELLO
4844messages (as obtained from PEERINFO) without any special tokenization. Since
4845each HELLO message contains a size field, the response can easily be split into
4846separate HELLO messages by the client.
4847
4848A HOSTLIST client connecting to the HOSTLIST server will receive the hostlist
4849as a HTTP response and the the server will terminate the connection with the
4850result code HTTP 200 OK. The connection will be closed immediately if no
4851hostlist is available.
4852
4853@node Advertising the URL
4854@subsubsection Advertising the URL
4855
4856@c %**end of header
4857
4858The server also advertises the URL to download the hostlist to other peers if
4859hostlist advertisement is enabled. When a new peer connects and has hostlist
4860learning enabled, the server sends a GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT
4861message to this peer using the CORE service.
4862
4863@node The HOSTLIST client
4864@subsection The HOSTLIST client
4865
4866@c %**end of header
4867
4868The client provides the functionality to download the list of HELLOs from a set
4869of URLs. It performs a standard HTTP request to the URLs configured and learned
4870from advertisement messages received from other peers. When a HELLO is
4871downloaded, the HOSTLIST client forwards the HELLO to the TRANSPORT service for
4872validation.
4873
4874The client supports two modes of operation: download of HELLOs (bootstrapping)
4875and learning of URLs.
4876
4877
4878@menu
4879* Bootstrapping::
4880* Learning::
4881@end menu
4882
4883@node Bootstrapping
4884@subsubsection Bootstrapping
4885
4886@c %**end of header
4887
4888For bootstrapping, it schedules a task to download the hostlist from the set of
4889known URLs. The downloads are only performed if the number of current
4890connections is smaller than a minimum number of connections (at the moment 4).
4891The interval between downloads increases exponentially; however, the
4892exponential growth is limited if it becomes longer than an hour. At that point,
4893the frequency growth is capped at (#number of connections * 1h).
4894
4895Once the decision has been taken to download HELLOs, the daemon chooses a
4896random URL from the list of known URLs. URLs can be configured in the
4897configuration or be learned from advertisement messages. The client uses a HTTP
4898client library (libcurl) to initiate the download using the libcurl multi
4899interface. Libcurl passes the data to the callback_download function which
4900stores the data in a buffer if space is available and the maximum size for a
4901hostlist download is not exceeded (MAX_BYTES_PER_HOSTLISTS = 500000). When a
4902full HELLO was downloaded, the HOSTLIST client offers this HELLO message to the
4903TRANSPORT service for validation. When the download is finished or failed,
4904statistical information about the quality of this URL is updated.
4905
4906@node Learning
4907@subsubsection Learning
4908
4909@c %**end of header
4910
4911The client also manages hostlist advertisements from other peers. The HOSTLIST
4912daemon forwards GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT messages to the
4913client subsystem, which extracts the URL from the message. Next, a test of the
4914newly obtained URL is performed by triggering a download from the new URL. If
4915the URL works correctly, it is added to the list of working URLs.
4916
4917The size of the list of URLs is restricted, so if an additional server is added
4918and the list is full, the URL with the worst quality ranking (determined
4919through successful downloads and number of HELLOs e.g.) is discarded. During
4920shutdown the list of URLs is saved to a file for persistance and loaded on
4921startup. URLs from the configuration file are never discarded.
4922
4923@node Usage
4924@subsection Usage
4925
4926@c %**end of header
4927
4928To start HOSTLIST by default, it has to be added to the DEFAULTSERVICES section
4929for the ARM services. This is done in the default configuration.
4930
4931For more information on how to configure the HOSTLIST subsystem see the
4932installation handbook:@ Configuring the hostlist to bootstrap@ Configuring your
4933peer to provide a hostlist
4934
4935@node GNUnet's IDENTITY subsystem
4936@section GNUnet's IDENTITY subsystem
4937
4938@c %**end of header
4939
4940Identities of "users" in GNUnet are called egos. Egos can be used as pseudonyms
4941(fake names) or be tied to an organization (for example, GNU) or even the
4942actual identity of a human. GNUnet users are expected to have many egos. They
4943might have one tied to their real identity, some for organizations they manage,
4944and more for different domains where they want to operate under a pseudonym.
4945
4946The IDENTITY service allows users to manage their egos. The identity service
4947manages the private keys egos of the local user; it does not manage identities
4948of other users (public keys). Public keys for other users need names to become
4949manageable. GNUnet uses the GNU Name System (GNS) to give names to other users
4950and manage their public keys securely. This chapter is about the IDENTITY
4951service, which is about the management of private keys.
4952
4953On the network, an ego corresponds to an ECDSA key (over Curve25519, using RFC
49546979, as required by GNS). Thus, users can perform actions under a particular
4955ego by using (signing with) a particular private key. Other users can then
4956confirm that the action was really performed by that ego by checking the
4957signature against the respective public key.
4958
4959The IDENTITY service allows users to associate a human-readable name with each
4960ego. This way, users can use names that will remind them of the purpose of a
4961particular ego. The IDENTITY service will store the respective private keys and
4962allows applications to access key information by name. Users can change the
4963name that is locally (!) associated with an ego. Egos can also be deleted,
4964which means that the private key will be removed and it thus will not be
4965possible to perform actions with that ego in the future.
4966
4967Additionally, the IDENTITY subsystem can associate service functions with egos.
4968For example, GNS requires the ego that should be used for the shorten zone. GNS
4969will ask IDENTITY for an ego for the "gns-short" service. The IDENTITY service
4970has a mapping of such service strings to the name of the ego that the user
4971wants to use for this service, for example "my-short-zone-ego".
4972
4973Finally, the IDENTITY API provides access to a special ego, the anonymous ego.
4974The anonymous ego is special in that its private key is not really private, but
4975fixed and known to everyone. Thus, anyone can perform actions as anonymous.
4976This can be useful as with this trick, code does not have to contain a special
4977case to distinguish between anonymous and pseudonymous egos.
4978
4979@menu
4980* libgnunetidentity::
4981* The IDENTITY Client-Service Protocol::
4982@end menu
4983
4984@node libgnunetidentity
4985@subsection libgnunetidentity
4986@c %**end of header
4987
4988
4989@menu
4990* Connecting to the service::
4991* Operations on Egos::
4992* The anonymous Ego::
4993* Convenience API to lookup a single ego::
4994* Associating egos with service functions::
4995@end menu
4996
4997@node Connecting to the service
4998@subsubsection Connecting to the service
4999
5000@c %**end of header
5001
5002First, typical clients connect to the identity service using
5003@code{GNUNET_IDENTITY_connect}. This function takes a callback as a parameter.
5004If the given callback parameter is non-null, it will be invoked to notify the
5005application about the current state of the identities in the system.
5006
5007@itemize @bullet
5008@item First, it will be invoked on all known egos at the time of the
5009connection. For each ego, a handle to the ego and the user's name for the ego
5010will be passed to the callback. Furthermore, a @code{void **} context argument
5011will be provided which gives the client the opportunity to associate some state
5012with the ego.
5013@item Second, the callback will be invoked with NULL for the ego, the name and
5014the context. This signals that the (initial) iteration over all egos has
5015completed.
5016@item Then, the callback will be invoked whenever something changes about an
5017ego. If an ego is renamed, the callback is invoked with the ego handle of the
5018ego that was renamed, and the new name. If an ego is deleted, the callback is
5019invoked with the ego handle and a name of NULL. In the deletion case, the
5020application should also release resources stored in the context.
5021@item When the application destroys the connection to the identity service
5022using @code{GNUNET_IDENTITY_disconnect}, the callback is again invoked with the
5023ego and a name of NULL (equivalent to deletion of the egos). This should again
5024be used to clean up the per-ego context.
5025@end itemize
5026
5027The ego handle passed to the callback remains valid until the callback is
5028invoked with a name of NULL, so it is safe to store a reference to the ego's
5029handle.
5030
5031@node Operations on Egos
5032@subsubsection Operations on Egos
5033
5034@c %**end of header
5035
5036Given an ego handle, the main operations are to get its associated private key
5037using @code{GNUNET_IDENTITY_ego_get_private_key} or its associated public key
5038using @code{GNUNET_IDENTITY_ego_get_public_key}.
5039
5040The other operations on egos are pretty straightforward. Using
5041@code{GNUNET_IDENTITY_create}, an application can request the creation of an
5042ego by specifying the desired name. The operation will fail if that name is
5043already in use. Using @code{GNUNET_IDENTITY_rename} the name of an existing ego
5044can be changed. Finally, egos can be deleted using
5045@code{GNUNET_IDENTITY_delete}. All of these operations will trigger updates to
5046the callback given to the @code{GNUNET_IDENTITY_connect} function of all
5047applications that are connected with the identity service at the time.
5048@code{GNUNET_IDENTITY_cancel} can be used to cancel the operations before the
5049respective continuations would be called. It is not guaranteed that the
5050operation will not be completed anyway, only the continuation will no longer be
5051called.
5052
5053@node The anonymous Ego
5054@subsubsection The anonymous Ego
5055
5056@c %**end of header
5057
5058A special way to obtain an ego handle is to call
5059@code{GNUNET_IDENTITY_ego_get_anonymous}, which returns an ego for the
5060"anonymous" user --- anyone knows and can get the private key for this user, so
5061it is suitable for operations that are supposed to be anonymous but require
5062signatures (for example, to avoid a special path in the code). The anonymous
5063ego is always valid and accessing it does not require a connection to the
5064identity service.
5065
5066@node Convenience API to lookup a single ego
5067@subsubsection Convenience API to lookup a single ego
5068
5069
5070As applications commonly simply have to lookup a single ego, there is a
5071convenience API to do just that. Use @code{GNUNET_IDENTITY_ego_lookup} to
5072lookup a single ego by name. Note that this is the user's name for the ego, not
5073the service function. The resulting ego will be returned via a callback and
5074will only be valid during that callback. The operation can be cancelled via
5075@code{GNUNET_IDENTITY_ego_lookup_cancel} (cancellation is only legal before the
5076callback is invoked).
5077
5078@node Associating egos with service functions
5079@subsubsection Associating egos with service functions
5080
5081
5082The @code{GNUNET_IDENTITY_set} function is used to associate a particular ego
5083with a service function. The name used by the service and the ego are given as
5084arguments. Afterwards, the service can use its name to lookup the associated
5085ego using @code{GNUNET_IDENTITY_get}.
5086
5087@node The IDENTITY Client-Service Protocol
5088@subsection The IDENTITY Client-Service Protocol
5089
5090@c %**end of header
5091
5092A client connecting to the identity service first sends a message with type
5093@code{GNUNET_MESSAGE_TYPE_IDENTITY_START} to the service. After that, the
5094client will receive information about changes to the egos by receiving messages
5095of type @code{GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE}. Those messages contain the
5096private key of the ego and the user's name of the ego (or zero bytes for the
5097name to indicate that the ego was deleted). A special bit @code{end_of_list} is
5098used to indicate the end of the initial iteration over the identity service's
5099egos.
5100
5101The client can trigger changes to the egos by sending CREATE, RENAME or DELETE
5102messages. The CREATE message contains the private key and the desired name. The
5103RENAME message contains the old name and the new name. The DELETE message only
5104needs to include the name of the ego to delete. The service responds to each of
5105these messages with a RESULT_CODE message which indicates success or error of
5106the operation, and possibly a human-readable error message.
5107
5108Finally, the client can bind the name of a service function to an ego by
5109sending a SET_DEFAULT message with the name of the service function and the
5110private key of the ego. Such bindings can then be resolved using a GET_DEFAULT
5111message, which includes the name of the service function. The identity service
5112will respond to a GET_DEFAULT request with a SET_DEFAULT message containing the
5113respective information, or with a RESULT_CODE to indicate an error.
5114
5115@node GNUnet's NAMESTORE Subsystem
5116@section GNUnet's NAMESTORE Subsystem
5117
5118@c %**end of header
5119
5120The NAMESTORE subsystem provides persistent storage for local GNS zone
5121information. All local GNS zone information are managed by NAMESTORE. It
5122provides both the functionality to administer local GNS information (e.g.
5123delete and add records) as well as to retrieve GNS information (e.g to list
5124name information in a client). NAMESTORE does only manage the persistent
5125storage of zone information belonging to the user running the service: GNS
5126information from other users obtained from the DHT are stored by the NAMECACHE
5127subsystem.
5128
5129NAMESTORE uses a plugin-based database backend to store GNS information with
5130good performance. Here sqlite, MySQL and PostgreSQL are supported database
5131backends. NAMESTORE clients interact with the IDENTITY subsystem to obtain
5132cryptographic information about zones based on egos as described with the
5133IDENTITY subsystem., but internally NAMESTORE refers to zones using the ECDSA
5134private key. In addition, it collaborates with the NAMECACHE subsystem and
5135stores zone information when local information are modified in the GNS cache to
5136increase look-up performance for local information.
5137
5138NAMESTORE provides functionality to look-up and store records, to iterate over
5139a specific or all zones and to monitor zones for changes. NAMESTORE
5140functionality can be accessed using the NAMESTORE api or the NAMESTORE command
5141line tool.
5142
5143@menu
5144* libgnunetnamestore::
5145@end menu
5146
5147@node libgnunetnamestore
5148@subsection libgnunetnamestore
5149
5150@c %**end of header
5151
5152To interact with NAMESTORE clients first connect to the NAMESTORE service using
5153the @code{GNUNET_NAMESTORE_connect} passing a configuration handle. As a result
5154they obtain a NAMESTORE handle, they can use for operations, or NULL is
5155returned if the connection failed.
5156
5157To disconnect from NAMESTORE, clients use @code{GNUNET_NAMESTORE_disconnect}
5158and specify the handle to disconnect.
5159
5160NAMESTORE internally uses the ECDSA private key to refer to zones. These
5161private keys can be obtained from the IDENTITY subsytem. Here @emph{egos@emph{
5162can be used to refer to zones or the default ego assigned to the GNS subsystem
5163can be used to obtained the master zone's private key.}}
5164
5165
5166@menu
5167* Editing Zone Information::
5168* Iterating Zone Information::
5169* Monitoring Zone Information::
5170@end menu
5171
5172@node Editing Zone Information
5173@subsubsection Editing Zone Information
5174
5175@c %**end of header
5176
5177NAMESTORE provides functions to lookup records stored under a label in a zone
5178and to store records under a label in a zone.
5179
5180To store (and delete) records, the client uses the
5181@code{GNUNET_NAMESTORE_records_store} function and has to provide namestore
5182handle to use, the private key of the zone, the label to store the records
5183under, the records and number of records plus an callback function. After the
5184operation is performed NAMESTORE will call the provided callback function with
5185the result GNUNET_SYSERR on failure (including timeout/queue drop/failure to
5186validate), GNUNET_NO if content was already there or not found GNUNET_YES (or
5187other positive value) on success plus an additional error message.
5188
5189Records are deleted by using the store command with 0 records to store. It is
5190important to note, that records are not merged when records exist with the
5191label. So a client has first to retrieve records, merge with existing records
5192and then store the result.
5193
5194To perform a lookup operation, the client uses the
5195@code{GNUNET_NAMESTORE_records_store} function. Here he has to pass the
5196namestore handle, the private key of the zone and the label. He also has to
5197provide a callback function which will be called with the result of the lookup
5198operation: the zone for the records, the label, and the records including the
5199number of records included.
5200
5201A special operation is used to set the preferred nickname for a zone. This
5202nickname is stored with the zone and is automatically merged with all labels
5203and records stored in a zone. Here the client uses the
5204@code{GNUNET_NAMESTORE_set_nick} function and passes the private key of the
5205zone, the nickname as string plus a the callback with the result of the
5206operation.
5207
5208@node Iterating Zone Information
5209@subsubsection Iterating Zone Information
5210
5211@c %**end of header
5212
5213A client can iterate over all information in a zone or all zones managed by
5214NAMESTORE. Here a client uses the @code{GNUNET_NAMESTORE_zone_iteration_start}
5215function and passes the namestore handle, the zone to iterate over and a
5216callback function to call with the result. If the client wants to iterate over
5217all the, he passes NULL for the zone. A @code{GNUNET_NAMESTORE_ZoneIterator}
5218handle is returned to be used to continue iteration.
5219
5220NAMESTORE calls the callback for every result and expects the client to call@
5221@code{GNUNET_NAMESTORE_zone_iterator_next} to continue to iterate or
5222@code{GNUNET_NAMESTORE_zone_iterator_stop} to interrupt the iteration. When
5223NAMESTORE reached the last item it will call the callback with a NULL value to
5224indicate.
5225
5226@node Monitoring Zone Information
5227@subsubsection Monitoring Zone Information
5228
5229@c %**end of header
5230
5231Clients can also monitor zones to be notified about changes. Here the clients
5232uses the @code{GNUNET_NAMESTORE_zone_monitor_start} function and passes the
5233private key of the zone and and a callback function to call with updates for a
5234zone. The client can specify to obtain zone information first by iterating over
5235the zone and specify a synchronization callback to be called when the client
5236and the namestore are synced.
5237
5238On an update, NAMESTORE will call the callback with the private key of the
5239zone, the label and the records and their number.
5240
5241To stop monitoring, the client call @code{GNUNET_NAMESTORE_zone_monitor_stop}
5242and passes the handle obtained from the function to start the monitoring.
5243
5244@node GNUnet's PEERINFO subsystem
5245@section GNUnet's PEERINFO subsystem
5246
5247@c %**end of header
5248
5249The PEERINFO subsystem is used to store verified (validated) information about
5250known peers in a persistent way. It obtains these addresses for example from
5251TRANSPORT service which is in charge of address validation. Validation means
5252that the information in the HELLO message are checked by connecting to the
5253addresses and performing a cryptographic handshake to authenticate the peer
5254instance stating to be reachable with these addresses. Peerinfo does not
5255validate the HELLO messages itself but only stores them and gives them to
5256interested clients.
5257
5258As future work, we think about moving from storing just HELLO messages to
5259providing a generic persistent per-peer information store. More and more
5260subsystems tend to need to store per-peer information in persistent way. To not
5261duplicate this functionality we plan to provide a PEERSTORE service providing
5262this functionality
5263
5264@menu
5265* Features2::
5266* Limitations3::
5267* DeveloperPeer Information::
5268* Startup::
5269* Managing Information::
5270* Obtaining Information::
5271* The PEERINFO Client-Service Protocol::
5272* libgnunetpeerinfo::
5273@end menu
5274
5275@node Features2
5276@subsection Features2
5277
5278@c %**end of header
5279
5280@itemize @bullet
5281@item Persistent storage
5282@item Client notification mechanism on update
5283@item Periodic clean up for expired information
5284@item Differentiation between public and friend-only HELLO
5285@end itemize
5286
5287@node Limitations3
5288@subsection Limitations3
5289
5290
5291@itemize @bullet
5292@item Does not perform HELLO validation
5293@end itemize
5294
5295@node DeveloperPeer Information
5296@subsection DeveloperPeer Information
5297
5298@c %**end of header
5299
5300The PEERINFO subsystem stores these information in the form of HELLO messages
5301you can think of as business cards. These HELLO messages contain the public key
5302of a peer and the addresses a peer can be reached under. The addresses include
5303an expiration date describing how long they are valid. This information is
5304updated regularly by the TRANSPORT service by revalidating the address. If an
5305address is expired and not renewed, it can be removed from the HELLO message.
5306
5307Some peer do not want to have their HELLO messages distributed to other peers ,
5308especially when GNUnet's friend-to-friend modus is enabled. To prevent this
5309undesired distribution. PEERINFO distinguishes between @emph{public} and
5310@emph{friend-only} HELLO messages. Public HELLO messages can be freely
5311distributed to other (possibly unknown) peers (for example using the hostlist,
5312gossiping, broadcasting), whereas friend-only HELLO messages may not be
5313distributed to other peers. Friend-only HELLO messages have an additional flag
5314@code{friend_only} set internally. For public HELLO message this flag is not
5315set. PEERINFO does and cannot not check if a client is allowed to obtain a
5316specific HELLO type.
5317
5318The HELLO messages can be managed using the GNUnet HELLO library. Other GNUnet
5319systems can obtain these information from PEERINFO and use it for their
5320purposes. Clients are for example the HOSTLIST component providing these
5321information to other peers in form of a hostlist or the TRANSPORT subsystem
5322using these information to maintain connections to other peers.
5323
5324@node Startup
5325@subsection Startup
5326
5327@c %**end of header
5328
5329During startup the PEERINFO services loads persistent HELLOs from disk. First
5330PEERINFO parses the directory configured in the HOSTS value of the
5331@code{PEERINFO} configuration section to store PEERINFO information.@ For all
5332files found in this directory valid HELLO messages are extracted. In addition
5333it loads HELLO messages shipped with the GNUnet distribution. These HELLOs are
5334used to simplify network bootstrapping by providing valid peer information with
5335the distribution. The use of these HELLOs can be prevented by setting the
5336@code{USE_INCLUDED_HELLOS} in the @code{PEERINFO} configuration section to
5337@code{NO}. Files containing invalid information are removed.
5338
5339@node Managing Information
5340@subsection Managing Information
5341
5342@c %**end of header
5343
5344The PEERINFO services stores information about known PEERS and a single HELLO
5345message for every peer. A peer does not need to have a HELLO if no information
5346are available. HELLO information from different sources, for example a HELLO
5347obtained from a remote HOSTLIST and a second HELLO stored on disk, are combined
5348and merged into one single HELLO message per peer which will be given to
5349clients. During this merge process the HELLO is immediately written to disk to
5350ensure persistence.
5351
5352PEERINFO in addition periodically scans the directory where information are
5353stored for empty HELLO messages with expired TRANSPORT addresses.@ This
5354periodic task scans all files in the directory and recreates the HELLO messages
5355it finds. Expired TRANSPORT addresses are removed from the HELLO and if the
5356HELLO does not contain any valid addresses, it is discarded and removed from
5357disk.
5358
5359@node Obtaining Information
5360@subsection Obtaining Information
5361
5362@c %**end of header
5363
5364When a client requests information from PEERINFO, PEERINFO performs a lookup
5365for the respective peer or all peers if desired and transmits this information
5366to the client. The client can specify if friend-only HELLOs have to be included
5367or not and PEERINFO filters the respective HELLO messages before transmitting
5368information.
5369
5370To notify clients about changes to PEERINFO information, PEERINFO maintains a
5371list of clients interested in this notifications. Such a notification occurs if
5372a HELLO for a peer was updated (due to a merge for example) or a new peer was
5373added.
5374
5375@node The PEERINFO Client-Service Protocol
5376@subsection The PEERINFO Client-Service Protocol
5377
5378@c %**end of header
5379
5380To connect and disconnect to and from the PEERINFO Service PEERINFO utilizes
5381the util client/server infrastructure, so no special messages types are used
5382here.
5383
5384To add information for a peer, the plain HELLO message is transmitted to the
5385service without any wrapping. Alle information required are stored within the
5386HELLO message. The PEERINFO service provides a message handler accepting and
5387processing these HELLO messages.
5388
5389When obtaining PEERINFO information using the iterate functionality specific
5390messages are used. To obtain information for all peers, a @code{struct
5391ListAllPeersMessage} with message type
5392@code{GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL} and a flag include_friend_only to
5393indicate if friend-only HELLO messages should be included are transmitted. If
5394information for a specific peer is required a @code{struct ListAllPeersMessage}
5395with @code{GNUNET_MESSAGE_TYPE_PEERINFO_GET} containing the peer identity is
5396used.
5397
5398For both variants the PEERINFO service replies for each HELLO message he wants
5399to transmit with a @code{struct ListAllPeersMessage} with type
5400@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO} containing the plain HELLO. The final
5401message is @code{struct GNUNET_MessageHeader} with type
5402@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO}. If the client receives this message,
5403he can proceed with the next request if any is pending
5404
5405@node libgnunetpeerinfo
5406@subsection libgnunetpeerinfo
5407
5408@c %**end of header
5409
5410The PEERINFO API consists mainly of three different functionalities:
5411maintaining a connection to the service, adding new information and retrieving
5412information form the PEERINFO service.
5413
5414
5415@menu
5416* Connecting to the Service::
5417* Adding Information::
5418* Obtaining Information2::
5419@end menu
5420
5421@node Connecting to the Service
5422@subsubsection Connecting to the Service
5423
5424@c %**end of header
5425
5426To connect to the PEERINFO service the function @code{GNUNET_PEERINFO_connect}
5427is used, taking a configuration handle as an argument, and to disconnect from
5428PEERINFO the function @code{GNUNET_PEERINFO_disconnect}, taking the PEERINFO
5429handle returned from the connect function has to be called.
5430
5431@node Adding Information
5432@subsubsection Adding Information
5433
5434@c %**end of header
5435
5436@code{GNUNET_PEERINFO_add_peer} adds a new peer to the PEERINFO subsystem
5437storage. This function takes the PEERINFO handle as an argument, the HELLO
5438message to store and a continuation with a closure to be called with the result
5439of the operation. The @code{GNUNET_PEERINFO_add_peer} returns a handle to this
5440operation allowing to cancel the operation with the respective cancel function
5441@code{GNUNET_PEERINFO_add_peer_cancel}. To retrieve information from PEERINFO
5442you can iterate over all information stored with PEERINFO or you can tell
5443PEERINFO to notify if new peer information are available.
5444
5445@node Obtaining Information2
5446@subsubsection Obtaining Information2
5447
5448@c %**end of header
5449
5450To iterate over information in PEERINFO you use @code{GNUNET_PEERINFO_iterate}.
5451This function expects the PEERINFO handle, a flag if HELLO messages intended
5452for friend only mode should be included, a timeout how long the operation
5453should take and a callback with a callback closure to be called for the
5454results. If you want to obtain information for a specific peer, you can specify
5455the peer identity, if this identity is NULL, information for all peers are
5456returned. The function returns a handle to allow to cancel the operation using
5457@code{GNUNET_PEERINFO_iterate_cancel}.
5458
5459To get notified when peer information changes, you can use
5460@code{GNUNET_PEERINFO_notify}. This function expects a configuration handle and
5461a flag if friend-only HELLO messages should be included. The PEERINFO service
5462will notify you about every change and the callback function will be called to
5463notify you about changes. The function returns a handle to cancel notifications
5464with @code{GNUNET_PEERINFO_notify_cancel}.
5465
5466
5467@node GNUnet's PEERSTORE subsystem
5468@section GNUnet's PEERSTORE subsystem
5469
5470@c %**end of header
5471
5472GNUnet's PEERSTORE subsystem offers persistent per-peer storage for other
5473GNUnet subsystems. GNUnet subsystems can use PEERSTORE to persistently store
5474and retrieve arbitrary data. Each data record stored with PEERSTORE contains
5475the following fields:
5476
5477@itemize @bullet
5478@item subsystem: Name of the subsystem responsible for the record.
5479@item peerid: Identity of the peer this record is related to.
5480@item key: a key string identifying the record.
5481@item value: binary record value.
5482@item expiry: record expiry date.
5483@end itemize
5484
5485@menu
5486* Functionality::
5487* Architecture::
5488* libgnunetpeerstore::
5489@end menu
5490
5491@node Functionality
5492@subsection Functionality
5493
5494@c %**end of header
5495
5496Subsystems can store any type of value under a (subsystem, peerid, key)
5497combination. A "replace" flag set during store operations forces the PEERSTORE
5498to replace any old values stored under the same (subsystem, peerid, key)
5499combination with the new value. Additionally, an expiry date is set after which
5500the record is *possibly* deleted by PEERSTORE.
5501
5502Subsystems can iterate over all values stored under any of the following
5503combination of fields:
5504
5505@itemize @bullet
5506@item (subsystem)
5507@item (subsystem, peerid)
5508@item (subsystem, key)
5509@item (subsystem, peerid, key)
5510@end itemize
5511
5512Subsystems can also request to be notified about any new values stored under a
5513(subsystem, peerid, key) combination by sending a "watch" request to
5514PEERSTORE.
5515
5516@node Architecture
5517@subsection Architecture
5518
5519@c %**end of header
5520
5521PEERSTORE implements the following components:
5522
5523@itemize @bullet
5524@item PEERSTORE service: Handles store, iterate and watch operations.
5525@item PEERSTORE API: API to be used by other subsystems to communicate and
5526issue commands to the PEERSTORE service.
5527@item PEERSTORE plugins: Handles the persistent storage. At the moment, only an
5528"sqlite" plugin is implemented.
5529@end itemize
5530
5531@node libgnunetpeerstore
5532@subsection libgnunetpeerstore
5533
5534@c %**end of header
5535
5536libgnunetpeerstore is the library containing the PEERSTORE API. Subsystems
5537wishing to communicate with the PEERSTORE service use this API to open a
5538connection to PEERSTORE. This is done by calling
5539@code{GNUNET_PEERSTORE_connect} which returns a handle to the newly created
5540connection. This handle has to be used with any further calls to the API.
5541
5542To store a new record, the function @code{GNUNET_PEERSTORE_store} is to be used
5543which requires the record fields and a continuation function that will be
5544called by the API after the STORE request is sent to the PEERSTORE service.
5545Note that calling the continuation function does not mean that the record is
5546successfully stored, only that the STORE request has been successfully sent to
5547the PEERSTORE service. @code{GNUNET_PEERSTORE_store_cancel} can be called to
5548cancel the STORE request only before the continuation function has been called.
5549
5550To iterate over stored records, the function @code{GNUNET_PEERSTORE_iterate} is
5551to be used. @emph{peerid} and @emph{key} can be set to NULL. An iterator
5552callback function will be called with each matching record found and a NULL
5553record at the end to signal the end of result set.
5554@code{GNUNET_PEERSTORE_iterate_cancel} can be used to cancel the ITERATE
5555request before the iterator callback is called with a NULL record.
5556
5557To be notified with new values stored under a (subsystem, peerid, key)
5558combination, the function @code{GNUNET_PEERSTORE_watch} is to be used. This
5559will register the watcher with the PEERSTORE service, any new records matching
5560the given combination will trigger the callback function passed to
5561@code{GNUNET_PEERSTORE_watch}. This continues until
5562@code{GNUNET_PEERSTORE_watch_cancel} is called or the connection to the service
5563is destroyed.
5564
5565After the connection is no longer needed, the function
5566@code{GNUNET_PEERSTORE_disconnect} can be called to disconnect from the
5567PEERSTORE service. Any pending ITERATE or WATCH requests will be destroyed. If
5568the @code{sync_first} flag is set to @code{GNUNET_YES}, the API will delay the
5569disconnection until all pending STORE requests are sent to the PEERSTORE
5570service, otherwise, the pending STORE requests will be destroyed as well.
5571
5572@node GNUnet's SET Subsystem
5573@section GNUnet's SET Subsystem
5574
5575@c %**end of header
5576
5577The SET service implements efficient set operations between two peers over a
5578mesh tunnel. Currently, set union and set intersection are the only supported
5579operations. Elements of a set consist of an @emph{element type} and arbitrary
5580binary @emph{data}. The size of an element's data is limited to around 62
5581KB.
5582
5583@menu
5584* Local Sets::
5585* Set Modifications::
5586* Set Operations::
5587* Result Elements::
5588* libgnunetset::
5589* The SET Client-Service Protocol::
5590* The SET Intersection Peer-to-Peer Protocol::
5591* The SET Union Peer-to-Peer Protocol::
5592@end menu
5593
5594@node Local Sets
5595@subsection Local Sets
5596
5597@c %**end of header
5598
5599Sets created by a local client can be modified and reused for multiple
5600operations. As each set operation requires potentially expensive special
5601auxilliary data to be computed for each element of a set, a set can only
5602participate in one type of set operation (i.e. union or intersection). The type
5603of a set is determined upon its creation. If a the elements of a set are needed
5604for an operation of a different type, all of the set's element must be copied
5605to a new set of appropriate type.
5606
5607@node Set Modifications
5608@subsection Set Modifications
5609
5610@c %**end of header
5611
5612Even when set operations are active, one can add to and remove elements from a
5613set. However, these changes will only be visible to operations that have been
5614created after the changes have taken place. That is, every set operation only
5615sees a snapshot of the set from the time the operation was started. This
5616mechanism is @emph{not} implemented by copying the whole set, but by attaching
5617@emph{generation information} to each element and operation.
5618
5619@node Set Operations
5620@subsection Set Operations
5621
5622@c %**end of header
5623
5624Set operations can be started in two ways: Either by accepting an operation
5625request from a remote peer, or by requesting a set operation from a remote
5626peer. Set operations are uniquely identified by the involved @emph{peers}, an
5627@emph{application id} and the @emph{operation type}.
5628
5629The client is notified of incoming set operations by @emph{set listeners}. A
5630set listener listens for incoming operations of a specific operation type and
5631application id. Once notified of an incoming set request, the client can
5632accept the set request (providing a local set for the operation) or reject
5633it.
5634
5635@node Result Elements
5636@subsection Result Elements
5637
5638@c %**end of header
5639
5640The SET service has three @emph{result modes} that determine how an operation's
5641result set is delivered to the client:
5642
5643@itemize @bullet
5644@item @strong{Full Result Set.} All elements of set resulting from the set
5645operation are returned to the client.
5646@item @strong{Added Elements.} Only elements that result from the operation and
5647are not already in the local peer's set are returned. Note that for some
5648operations (like set intersection) this result mode will never return any
5649elements. This can be useful if only the remove peer is actually interested in
5650the result of the set operation.
5651@item @strong{Removed Elements.} Only elements that are in the local peer's
5652initial set but not in the operation's result set are returned. Note that for
5653some operations (like set union) this result mode will never return any
5654elements. This can be useful if only the remove peer is actually interested in
5655the result of the set operation.
5656@end itemize
5657
5658@node libgnunetset
5659@subsection libgnunetset
5660
5661@c %**end of header
5662
5663@menu
5664* Sets::
5665* Listeners::
5666* Operations::
5667* Supplying a Set::
5668* The Result Callback::
5669@end menu
5670
5671@node Sets
5672@subsubsection Sets
5673
5674@c %**end of header
5675
5676New sets are created with @code{GNUNET_SET_create}. Both the local peer's
5677configuration (as each set has its own client connection) and the operation
5678type must be specified. The set exists until either the client calls
5679@code{GNUNET_SET_destroy} or the client's connection to the service is
5680disrupted. In the latter case, the client is notified by the return value of
5681functions dealing with sets. This return value must always be checked.
5682
5683Elements are added and removed with @code{GNUNET_SET_add_element} and
5684@code{GNUNET_SET_remove_element}.
5685
5686@node Listeners
5687@subsubsection Listeners
5688
5689@c %**end of header
5690
5691Listeners are created with @code{GNUNET_SET_listen}. Each time time a remote
5692peer suggests a set operation with an application id and operation type
5693matching a listener, the listener's callack is invoked. The client then must
5694synchronously call either @code{GNUNET_SET_accept} or @code{GNUNET_SET_reject}.
5695Note that the operation will not be started until the client calls
5696@code{GNUNET_SET_commit} (see Section "Supplying a Set").
5697
5698@node Operations
5699@subsubsection Operations
5700
5701@c %**end of header
5702
5703Operations to be initiated by the local peer are created with
5704@code{GNUNET_SET_prepare}. Note that the operation will not be started until
5705the client calls @code{GNUNET_SET_commit} (see Section "Supplying a
5706Set").
5707
5708@node Supplying a Set
5709@subsubsection Supplying a Set
5710
5711@c %**end of header
5712
5713To create symmetry between the two ways of starting a set operation (accepting
5714and nitiating it), the operation handles returned by @code{GNUNET_SET_accept}
5715and @code{GNUNET_SET_prepare} do not yet have a set to operate on, thus they
5716can not do any work yet.
5717
5718The client must call @code{GNUNET_SET_commit} to specify a set to use for an
5719operation. @code{GNUNET_SET_commit} may only be called once per set
5720operation.
5721
5722@node The Result Callback
5723@subsubsection The Result Callback
5724
5725@c %**end of header
5726
5727Clients must specify both a result mode and a result callback with
5728@code{GNUNET_SET_accept} and @code{GNUNET_SET_prepare}. The result callback
5729with a status indicating either that an element was received, or the operation
5730failed or succeeded. The interpretation of the received element depends on the
5731result mode. The callback needs to know which result mode it is used in, as the
5732arguments do not indicate if an element is part of the full result set, or if
5733it is in the difference between the original set and the final set.
5734
5735@node The SET Client-Service Protocol
5736@subsection The SET Client-Service Protocol
5737
5738@c %**end of header
5739
5740@menu
5741* Creating Sets::
5742* Listeners2::
5743* Initiating Operations::
5744* Modifying Sets::
5745* Results and Operation Status::
5746* Iterating Sets::
5747@end menu
5748
5749@node Creating Sets
5750@subsubsection Creating Sets
5751
5752@c %**end of header
5753
5754For each set of a client, there exists a client connection to the service. Sets
5755are created by sending the @code{GNUNET_SERVICE_SET_CREATE} message over a new
5756client connection. Multiple operations for one set are multiplexed over one
5757client connection, using a request id supplied by the client.
5758
5759@node Listeners2
5760@subsubsection Listeners2
5761
5762@c %**end of header
5763
5764Each listener also requires a seperate client connection. By sending the
5765@code{GNUNET_SERVICE_SET_LISTEN} message, the client notifies the service of
5766the application id and operation type it is interested in. A client rejects an
5767incoming request by sending @code{GNUNET_SERVICE_SET_REJECT} on the listener's
5768client connection. In contrast, when accepting an incoming request, a a
5769@code{GNUNET_SERVICE_SET_ACCEPT} message must be sent over the@ set that is
5770supplied for the set operation.
5771
5772@node Initiating Operations
5773@subsubsection Initiating Operations
5774
5775@c %**end of header
5776
5777Operations with remote peers are initiated by sending a
5778@code{GNUNET_SERVICE_SET_EVALUATE} message to the service. The@ client
5779connection that this message is sent by determines the set to use.
5780
5781@node Modifying Sets
5782@subsubsection Modifying Sets
5783
5784@c %**end of header
5785
5786Sets are modified with the @code{GNUNET_SERVICE_SET_ADD} and
5787@code{GNUNET_SERVICE_SET_REMOVE} messages.
5788
5789
5790@c %@menu
5791@c %* Results and Operation Status::
5792@c %* Iterating Sets::
5793@c %@end menu
5794
5795@node Results and Operation Status
5796@subsubsection Results and Operation Status
5797@c %**end of header
5798
5799The service notifies the client of result elements and success/failure of a set
5800operation with the @code{GNUNET_SERVICE_SET_RESULT} message.
5801
5802@node Iterating Sets
5803@subsubsection Iterating Sets
5804
5805@c %**end of header
5806
5807All elements of a set can be requested by sending
5808@code{GNUNET_SERVICE_SET_ITER_REQUEST}. The server responds with
5809@code{GNUNET_SERVICE_SET_ITER_ELEMENT} and eventually terminates the iteration
5810with @code{GNUNET_SERVICE_SET_ITER_DONE}. After each received element, the
5811client@ must send @code{GNUNET_SERVICE_SET_ITER_ACK}. Note that only one set
5812iteration may be active for a set at any given time.
5813
5814@node The SET Intersection Peer-to-Peer Protocol
5815@subsection The SET Intersection Peer-to-Peer Protocol
5816
5817@c %**end of header
5818
5819The intersection protocol operates over CADET and starts with a
5820GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer initiating
5821the operation to the peer listening for inbound requests. It includes the
5822number of elements of the initiating peer, which is used to decide which side
5823will send a Bloom filter first.
5824
5825The listening peer checks if the operation type and application identifier are
5826acceptable for its current state. If not, it responds with a
5827GNUNET_MESSAGE_TYPE_SET_RESULT and a status of GNUNET_SET_STATUS_FAILURE (and
5828terminates the CADET channel).
5829
5830If the application accepts the request, the listener sends back a@
5831GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO if it has more elements
5832in the set than the client. Otherwise, it immediately starts with the Bloom
5833filter exchange. If the initiator receives a
5834GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO response, it beings the
5835Bloom filter exchange, unless the set size is indicated to be zero, in which
5836case the intersection is considered finished after just the initial
5837handshake.
5838
5839
5840@menu
5841* The Bloom filter exchange::
5842* Salt::
5843@end menu
5844
5845@node The Bloom filter exchange
5846@subsubsection The Bloom filter exchange
5847
5848@c %**end of header
5849
5850In this phase, each peer transmits a Bloom filter over the remaining keys of
5851the local set to the other peer using a
5852GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF message. This message additionally
5853includes the number of elements left in the sender's set, as well as the XOR
5854over all of the keys in that set.
5855
5856The number of bits 'k' set per element in the Bloom filter is calculated based
5857on the relative size of the two sets. Furthermore, the size of the Bloom filter
5858is calculated based on 'k' and the number of elements in the set to maximize
5859the amount of data filtered per byte transmitted on the wire (while avoiding an
5860excessively high number of iterations).
5861
5862The receiver of the message removes all elements from its local set that do not
5863pass the Bloom filter test. It then checks if the set size of the sender and
5864the XOR over the keys match what is left of his own set. If they do, he sends
5865a@ GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_DONE back to indicate that the
5866latest set is the final result. Otherwise, the receiver starts another Bloom
5867fitler exchange, except this time as the sender.
5868
5869@node Salt
5870@subsubsection Salt
5871
5872@c %**end of header
5873
5874Bloomfilter operations are probablistic: With some non-zero probability the
5875test may incorrectly say an element is in the set, even though it is not.
5876
5877To mitigate this problem, the intersection protocol iterates exchanging Bloom
5878filters using a different random 32-bit salt in each iteration (the salt is
5879also included in the message). With different salts, set operations may fail
5880for different elements. Merging the results from the executions, the
5881probability of failure drops to zero.
5882
5883The iterations terminate once both peers have established that they have sets
5884of the same size, and where the XOR over all keys computes the same 512-bit
5885value (leaving a failure probability of 2-511).
5886
5887@node The SET Union Peer-to-Peer Protocol
5888@subsection The SET Union Peer-to-Peer Protocol
5889
5890@c %**end of header
5891
5892The SET union protocol is based on Eppstein's efficient set reconciliation
5893without prior context. You should read this paper first if you want to
5894understand the protocol.
5895
5896The union protocol operates over CADET and starts with a
5897GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer initiating
5898the operation to the peer listening for inbound requests. It includes the
5899number of elements of the initiating peer, which is currently not used.
5900
5901The listening peer checks if the operation type and application identifier are
5902acceptable for its current state. If not, it responds with a
5903GNUNET_MESSAGE_TYPE_SET_RESULT and a status of GNUNET_SET_STATUS_FAILURE (and
5904terminates the CADET channel).
5905
5906If the application accepts the request, it sends back a strata estimator using
5907a message of type GNUNET_MESSAGE_TYPE_SET_UNION_P2P_SE. The initiator evaluates
5908the strata estimator and initiates the exchange of invertible Bloom filters,
5909sending a GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
5910
5911During the IBF exchange, if the receiver cannot invert the Bloom filter or
5912detects a cycle, it sends a larger IBF in response (up to a defined maximum
5913limit; if that limit is reached, the operation fails). Elements decoded while
5914processing the IBF are transmitted to the other peer using
5915GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS, or requested from the other peer using
5916GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS messages, depending on the sign
5917observed during decoding of the IBF. Peers respond to a
5918GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS message with the respective
5919element in a GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS message. If the IBF fully
5920decodes, the peer responds with a GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE
5921message instead of another GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
5922
5923All Bloom filter operations use a salt to mingle keys before hasing them into
5924buckets, such that future iterations have a fresh chance of succeeding if they
5925failed due to collisions before.
5926
5927@node GNUnet's STATISTICS subsystem
5928@section GNUnet's STATISTICS subsystem
5929
5930@c %**end of header
5931
5932In GNUnet, the STATISTICS subsystem offers a central place for all subsystems
5933to publish unsigned 64-bit integer run-time statistics. Keeping this
5934information centrally means that there is a unified way for the user to obtain
5935data on all subsystems, and individual subsystems do not have to always include
5936a custom data export method for performance metrics and other statistics. For
5937example, the TRANSPORT system uses STATISTICS to update information about the
5938number of directly connected peers and the bandwidth that has been consumed by
5939the various plugins. This information is valuable for diagnosing connectivity
5940and performance issues.
5941
5942Following the GNUnet service architecture, the STATISTICS subsystem is divided
5943into an API which is exposed through the header
5944@strong{gnunet_statistics_service.h} and the STATISTICS service
5945@strong{gnunet-service-statistics}. The @strong{gnunet-statistics} command-line
5946tool can be used to obtain (and change) information about the values stored by
5947the STATISTICS service. The STATISTICS service does not communicate with other
5948peers.
5949
5950Data is stored in the STATISTICS service in the form of tuples
5951@strong{(subsystem, name, value, persistence)}. The subsystem determines to
5952which other GNUnet's subsystem the data belongs. name is the name through which
5953value is associated. It uniquely identifies the record from among other records
5954belonging to the same subsystem. In some parts of the code, the pair
5955@strong{(subsystem, name)} is called a @strong{statistic} as it identifies the
5956values stored in the STATISTCS service.The persistence flag determines if the
5957record has to be preserved across service restarts. A record is said to be
5958persistent if this flag is set for it; if not, the record is treated as a
5959non-persistent record and it is lost after service restart. Persistent records
5960are written to and read from the file @strong{statistics.data} before shutdown
5961and upon startup. The file is located in the HOME directory of the peer.
5962
5963An anomaly of the STATISTICS service is that it does not terminate immediately
5964upon receiving a shutdown signal if it has any clients connected to it. It
5965waits for all the clients that are not monitors to close their connections
5966before terminating itself. This is to prevent the loss of data during peer
5967shutdown --- delaying the STATISTICS service shutdown helps other services to
5968store important data to STATISTICS during shutdown.
5969
5970@menu
5971* libgnunetstatistics::
5972* The STATISTICS Client-Service Protocol::
5973@end menu
5974
5975@node libgnunetstatistics
5976@subsection libgnunetstatistics
5977
5978@c %**end of header
5979
5980@strong{libgnunetstatistics} is the library containing the API for the
5981STATISTICS subsystem. Any process requiring to use STATISTICS should use this
5982API by to open a connection to the STATISTICS service. This is done by calling
5983the function @code{GNUNET_STATISTICS_create()}. This function takes the
5984subsystem's name which is trying to use STATISTICS and a configuration. All
5985values written to STATISTICS with this connection will be placed in the section
5986corresponding to the given subsystem's name. The connection to STATISTICS can
5987be destroyed with the function GNUNET_STATISTICS_destroy(). This function
5988allows for the connection to be destroyed immediately or upon transferring all
5989pending write requests to the service.
5990
5991Note: STATISTICS subsystem can be disabled by setting @code{DISABLE = YES}
5992under the @code{[STATISTICS]} section in the configuration. With such a
5993configuration all calls to @code{GNUNET_STATISTICS_create()} return @code{NULL}
5994as the STATISTICS subsystem is unavailable and no other functions from the API
5995can be used.
5996
5997
5998@menu
5999* Statistics retrieval::
6000* Setting statistics and updating them::
6001* Watches::
6002@end menu
6003
6004@node Statistics retrieval
6005@subsubsection Statistics retrieval
6006
6007@c %**end of header
6008
6009Once a connection to the statistics service is obtained, information about any
6010other system which uses statistics can be retrieved with the function
6011GNUNET_STATISTICS_get(). This function takes the connection handle, the name of
6012the subsystem whose information we are interested in (a @code{NULL} value will
6013retrieve information of all available subsystems using STATISTICS), the name of
6014the statistic we are interested in (a @code{NULL} value will retrieve all
6015available statistics), a continuation callback which is called when all of
6016requested information is retrieved, an iterator callback which is called for
6017each parameter in the retrieved information and a closure for the
6018aforementioned callbacks. The library then invokes the iterator callback for
6019each value matching the request.
6020
6021Call to @code{GNUNET_STATISTICS_get()} is asynchronous and can be canceled with
6022the function @code{GNUNET_STATISTICS_get_cancel()}. This is helpful when
6023retrieving statistics takes too long and especially when we want to shutdown
6024and cleanup everything.
6025
6026@node Setting statistics and updating them
6027@subsubsection Setting statistics and updating them
6028
6029@c %**end of header
6030
6031So far we have seen how to retrieve statistics, here we will learn how we can
6032set statistics and update them so that other subsystems can retrieve them.
6033
6034A new statistic can be set using the function @code{GNUNET_STATISTICS_set()}.
6035This function takes the name of the statistic and its value and a flag to make
6036the statistic persistent. The value of the statistic should be of the type
6037@code{uint64_t}. The function does not take the name of the subsystem; it is
6038determined from the previous @code{GNUNET_STATISTICS_create()} invocation. If
6039the given statistic is already present, its value is overwritten.
6040
6041An existing statistics can be updated, i.e its value can be increased or
6042decreased by an amount with the function @code{GNUNET_STATISTICS_update()}. The
6043parameters to this function are similar to @code{GNUNET_STATISTICS_set()},
6044except that it takes the amount to be changed as a type @code{int64_t} instead
6045of the value.
6046
6047The library will combine multiple set or update operations into one message if
6048the client performs requests at a rate that is faster than the available IPC
6049with the STATISTICS service. Thus, the client does not have to worry about
6050sending requests too quickly.
6051
6052@node Watches
6053@subsubsection Watches
6054
6055@c %**end of header
6056
6057As interesting feature of STATISTICS lies in serving notifications whenever a
6058statistic of our interest is modified. This is achieved by registering a watch
6059through the function @code{GNUNET_STATISTICS_watch()}. The parameters of this
6060function are similar to those of @code{GNUNET_STATISTICS_get()}. Changes to the
6061respective statistic's value will then cause the given iterator callback to be
6062called. Note: A watch can only be registered for a specific statistic. Hence
6063the subsystem name and the parameter name cannot be @code{NULL} in a call to
6064@code{GNUNET_STATISTICS_watch()}.
6065
6066A registered watch will keep notifying any value changes until
6067@code{GNUNET_STATISTICS_watch_cancel()} is called with the same parameters that
6068are used for registering the watch.
6069
6070@node The STATISTICS Client-Service Protocol
6071@subsection The STATISTICS Client-Service Protocol
6072@c %**end of header
6073
6074
6075@menu
6076* Statistics retrieval2::
6077* Setting and updating statistics::
6078* Watching for updates::
6079@end menu
6080
6081@node Statistics retrieval2
6082@subsubsection Statistics retrieval2
6083
6084@c %**end of header
6085
6086To retrieve statistics, the client transmits a message of type
6087@code{GNUNET_MESSAGE_TYPE_STATISTICS_GET} containing the given subsystem name
6088and statistic parameter to the STATISTICS service. The service responds with a
6089message of type @code{GNUNET_MESSAGE_TYPE_STATISTICS_VALUE} for each of the
6090statistics parameters that match the client request for the client. The end of
6091information retrieved is signaled by the service by sending a message of type
6092@code{GNUNET_MESSAGE_TYPE_STATISTICS_END}.
6093
6094@node Setting and updating statistics
6095@subsubsection Setting and updating statistics
6096
6097@c %**end of header
6098
6099The subsystem name, parameter name, its value and the persistence flag are
6100communicated to the service through the message
6101@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}.
6102
6103When the service receives a message of type
6104@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}, it retrieves the subsystem name and
6105checks for a statistic parameter with matching the name given in the message.
6106If a statistic parameter is found, the value is overwritten by the new value
6107from the message; if not found then a new statistic parameter is created with
6108the given name and value.
6109
6110In addition to just setting an absolute value, it is possible to perform a
6111relative update by sending a message of type
6112@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET} with an update flag
6113(@code{GNUNET_STATISTICS_SETFLAG_RELATIVE}) signifying that the value in the
6114message should be treated as an update value.
6115
6116@node Watching for updates
6117@subsubsection Watching for updates
6118
6119@c %**end of header
6120
6121The function registers the watch at the service by sending a message of type
6122@code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH}. The service then sends
6123notifications through messages of type
6124@code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE} whenever the statistic
6125parameter's value is changed.
6126
6127@node GNUnet's Distributed Hash Table (DHT)
6128@section GNUnet's Distributed Hash Table (DHT)
6129
6130@c %**end of header
6131
6132GNUnet includes a generic distributed hash table that can be used by developers
6133building P2P applications in the framework. This section documents high-level
6134features and how developers are expected to use the DHT. We have a research
6135paper detailing how the DHT works. Also, Nate's thesis includes a detailed
6136description and performance analysis (in chapter 6).
6137
6138Key features of GNUnet's DHT include:
6139
6140@itemize @bullet
6141@item stores key-value pairs with values up to (approximately) 63k in size
6142@item works with many underlay network topologies (small-world, random graph),
6143underlay does not need to be a full mesh / clique
6144@item support for extended queries (more than just a simple 'key'), filtering
6145duplicate replies within the network (bloomfilter) and content validation (for
6146details, please read the subsection on the block library)
6147@item can (optionally) return paths taken by the PUT and GET operations to the
6148application
6149@item provides content replication to handle churn
6150@end itemize
6151
6152GNUnet's DHT is randomized and unreliable. Unreliable means that there is no
6153strict guarantee that a value stored in the DHT is always found --- values are
6154only found with high probability. While this is somewhat true in all P2P DHTs,
6155GNUnet developers should be particularly wary of this fact (this will help you
6156write secure, fault-tolerant code). Thus, when writing any application using
6157the DHT, you should always consider the possibility that a value stored in the
6158DHT by you or some other peer might simply not be returned, or returned with a
6159significant delay. Your application logic must be written to tolerate this
6160(naturally, some loss of performance or quality of service is expected in this
6161case).
6162
6163@menu
6164* Block library and plugins::
6165* libgnunetdht::
6166* The DHT Client-Service Protocol::
6167* The DHT Peer-to-Peer Protocol::
6168@end menu
6169
6170@node Block library and plugins
6171@subsection Block library and plugins
6172
6173@c %**end of header
6174
6175@menu
6176* What is a Block?::
6177* The API of libgnunetblock::
6178* Queries::
6179* Sample Code::
6180* Conclusion2::
6181@end menu
6182
6183@node What is a Block?
6184@subsubsection What is a Block?
6185
6186@c %**end of header
6187
6188Blocks are small (< 63k) pieces of data stored under a key (struct
6189GNUNET_HashCode). Blocks have a type (enum GNUNET_BlockType) which defines
6190their data format. Blocks are used in GNUnet as units of static data exchanged
6191between peers and stored (or cached) locally. Uses of blocks include
6192file-sharing (the files are broken up into blocks), the VPN (DNS information is
6193stored in blocks) and the DHT (all information in the DHT and meta-information
6194for the maintenance of the DHT are both stored using blocks). The block
6195subsystem provides a few common functions that must be available for any type
6196of block.
6197
6198@node The API of libgnunetblock
6199@subsubsection The API of libgnunetblock
6200
6201@c %**end of header
6202
6203The block library requires for each (family of) block type(s) a block plugin
6204(implementing gnunet_block_plugin.h) that provides basic functions that are
6205needed by the DHT (and possibly other subsystems) to manage the block. These
6206block plugins are typically implemented within their respective subsystems.@
6207The main block library is then used to locate, load and query the appropriate
6208block plugin. Which plugin is appropriate is determined by the block type
6209(which is just a 32-bit integer). Block plugins contain code that specifies
6210which block types are supported by a given plugin. The block library loads all
6211block plugins that are installed at the local peer and forwards the application
6212request to the respective plugin.
6213
6214The central functions of the block APIs (plugin and main library) are to allow
6215the mapping of blocks to their respective key (if possible) and the ability to
6216check that a block is well-formed and matches a given request (again, if
6217possible). This way, GNUnet can avoid storing invalid blocks, storing blocks
6218under the wrong key and forwarding blocks in response to a query that they do
6219not answer.
6220
6221One key function of block plugins is that it allows GNUnet to detect duplicate
6222replies (via the Bloom filter). All plugins MUST support detecting duplicate
6223replies (by adding the current response to the Bloom filter and rejecting it if
6224it is encountered again). If a plugin fails to do this, responses may loop in
6225the network.
6226
6227@node Queries
6228@subsubsection Queries
6229@c %**end of header
6230
6231The query format for any block in GNUnet consists of four main components.
6232First, the type of the desired block must be specified. Second, the query must
6233contain a hash code. The hash code is used for lookups in hash tables and
6234databases and must not be unique for the block (however, if possible a unique
6235hash should be used as this would be best for performance). Third, an optional
6236Bloom filter can be specified to exclude known results; replies that hash to
6237the bits set in the Bloom filter are considered invalid. False-positives can be
6238eliminated by sending the same query again with a different Bloom filter
6239mutator value, which parameterizes the hash function that is used. Finally, an
6240optional application-specific "eXtended query" (xquery) can be specified to
6241further constrain the results. It is entirely up to the type-specific plugin to
6242determine whether or not a given block matches a query (type, hash, Bloom
6243filter, and xquery). Naturally, not all xquery's are valid and some types of
6244blocks may not support Bloom filters either, so the plugin also needs to check
6245if the query is valid in the first place.
6246
6247Depending on the results from the plugin, the DHT will then discard the
6248(invalid) query, forward the query, discard the (invalid) reply, cache the
6249(valid) reply, and/or forward the (valid and non-duplicate) reply.
6250
6251@node Sample Code
6252@subsubsection Sample Code
6253
6254@c %**end of header
6255
6256The source code in @strong{plugin_block_test.c} is a good starting point for
6257new block plugins --- it does the minimal work by implementing a plugin that
6258performs no validation at all. The respective @strong{Makefile.am} shows how to
6259build and install a block plugin.
6260
6261@node Conclusion2
6262@subsubsection Conclusion2
6263
6264@c %**end of header
6265
6266In conclusion, GNUnet subsystems that want to use the DHT need to define a
6267block format and write a plugin to match queries and replies. For testing, the
6268"GNUNET_BLOCK_TYPE_TEST" block type can be used; it accepts any query as valid
6269and any reply as matching any query. This type is also used for the DHT command
6270line tools. However, it should NOT be used for normal applications due to the
6271lack of error checking that results from this primitive implementation.
6272
6273@node libgnunetdht
6274@subsection libgnunetdht
6275
6276@c %**end of header
6277
6278The DHT API itself is pretty simple and offers the usual GET and PUT functions
6279that work as expected. The specified block type refers to the block library
6280which allows the DHT to run application-specific logic for data stored in the
6281network.
6282
6283
6284@menu
6285* GET::
6286* PUT::
6287* MONITOR::
6288* DHT Routing Options::
6289@end menu
6290
6291@node GET
6292@subsubsection GET
6293
6294@c %**end of header
6295
6296When using GET, the main consideration for developers (other than the block
6297library) should be that after issuing a GET, the DHT will continuously cause
6298(small amounts of) network traffic until the operation is explicitly canceled.
6299So GET does not simply send out a single network request once; instead, the
6300DHT will continue to search for data. This is needed to achieve good success
6301rates and also handles the case where the respective PUT operation happens
6302after the GET operation was started. Developers should not cancel an existing
6303GET operation and then explicitly re-start it to trigger a new round of
6304network requests; this is simply inefficient, especially as the internal
6305automated version can be more efficient, for example by filtering results in
6306the network that have already been returned.
6307
6308If an application that performs a GET request has a set of replies that it
6309already knows and would like to filter, it can call@
6310@code{GNUNET_DHT_get_filter_known_results} with an array of hashes over the
6311respective blocks to tell the DHT that these results are not desired (any
6312more). This way, the DHT will filter the respective blocks using the block
6313library in the network, which may result in a significant reduction in
6314bandwidth consumption.
6315
6316@node PUT
6317@subsubsection PUT
6318
6319@c %**end of header
6320
6321In contrast to GET operations, developers @strong{must} manually re-run PUT
6322operations periodically (if they intend the content to continue to be
6323available). Content stored in the DHT expires or might be lost due to churn.
6324Furthermore, GNUnet's DHT typically requires multiple rounds of PUT operations
6325before a key-value pair is consistently available to all peers (the DHT
6326randomizes paths and thus storage locations, and only after multiple rounds of
6327PUTs there will be a sufficient number of replicas in large DHTs). An explicit
6328PUT operation using the DHT API will only cause network traffic once, so in
6329order to ensure basic availability and resistance to churn (and adversaries),
6330PUTs must be repeated. While the exact frequency depends on the application, a
6331rule of thumb is that there should be at least a dozen PUT operations within
6332the content lifetime. Content in the DHT typically expires after one day, so
6333DHT PUT operations should be repeated at least every 1-2 hours.
6334
6335@node MONITOR
6336@subsubsection MONITOR
6337
6338@c %**end of header
6339
6340The DHT API also allows applications to monitor messages crossing the local
6341DHT service. The types of messages used by the DHT are GET, PUT and RESULT
6342messages. Using the monitoring API, applications can choose to monitor these
6343requests, possibly limiting themselves to requests for a particular block
6344type.
6345
6346The monitoring API is not only usefu only for diagnostics, it can also be used
6347to trigger application operations based on PUT operations. For example, an
6348application may use PUTs to distribute work requests to other peers. The
6349workers would then monitor for PUTs that give them work, instead of looking
6350for work using GET operations. This can be beneficial, especially if the
6351workers have no good way to guess the keys under which work would be stored.
6352Naturally, additional protocols might be needed to ensure that the desired
6353number of workers will process the distributed workload.
6354
6355@node DHT Routing Options
6356@subsubsection DHT Routing Options
6357
6358@c %**end of header
6359
6360There are two important options for GET and PUT requests:
6361
6362@table @asis
6363@item GNUNET_DHT_RO_DEMULITPLEX_EVERYWHERE This option means that all peers
6364should process the request, even if their peer ID is not closest to the key.
6365For a PUT request, this means that all peers that a request traverses may make
6366a copy of the data. Similarly for a GET request, all peers will check their
6367local database for a result. Setting this option can thus significantly improve
6368caching and reduce bandwidth consumption --- at the expense of a larger DHT
6369database. If in doubt, we recommend that this option should be used.
6370@item GNUNET_DHT_RO_RECORD_ROUTE This option instructs the DHT to record the path
6371that a GET or a PUT request is taking through the overlay network. The
6372resulting paths are then returned to the application with the respective
6373result. This allows the receiver of a result to construct a path to the
6374originator of the data, which might then be used for routing. Naturally,
6375setting this option requires additional bandwidth and disk space, so
6376applications should only set this if the paths are needed by the application
6377logic.
6378@item GNUNET_DHT_RO_FIND_PEER This option is an internal option used by
6379the DHT's peer discovery mechanism and should not be used by applications.
6380@item GNUNET_DHT_RO_BART This option is currently not implemented. It may in
6381the future offer performance improvements for clique topologies.
6382@end table
6383
6384@node The DHT Client-Service Protocol
6385@subsection The DHT Client-Service Protocol
6386
6387@c %**end of header
6388
6389@menu
6390* PUTting data into the DHT::
6391* GETting data from the DHT::
6392* Monitoring the DHT::
6393@end menu
6394
6395@node PUTting data into the DHT
6396@subsubsection PUTting data into the DHT
6397
6398@c %**end of header
6399
6400To store (PUT) data into the DHT, the client sends a@ @code{struct
6401GNUNET_DHT_ClientPutMessage} to the service. This message specifies the block
6402type, routing options, the desired replication level, the expiration time, key,
6403value and a 64-bit unique ID for the operation. The service responds with a@
6404@code{struct GNUNET_DHT_ClientPutConfirmationMessage} with the same 64-bit
6405unique ID. Note that the service sends the confirmation as soon as it has
6406locally processed the PUT request. The PUT may still be propagating through the
6407network at this time.
6408
6409In the future, we may want to change this to provide (limited) feedback to the
6410client, for example if we detect that the PUT operation had no effect because
6411the same key-value pair was already stored in the DHT. However, changing this
6412would also require additional state and messages in the P2P
6413interaction.
6414
6415@node GETting data from the DHT
6416@subsubsection GETting data from the DHT
6417
6418@c %**end of header
6419
6420To retrieve (GET) data from the DHT, the client sends a@ @code{struct
6421GNUNET_DHT_ClientGetMessage} to the service. The message specifies routing
6422options, a replication level (for replicating the GET, not the content), the
6423desired block type, the key, the (optional) extended query and unique 64-bit
6424request ID.
6425
6426Additionally, the client may send any number of@ @code{struct
6427GNUNET_DHT_ClientGetResultSeenMessage}s to notify the service about results
6428that the client is already aware of. These messages consist of the key, the
6429unique 64-bit ID of the request, and an arbitrary number of hash codes over the
6430blocks that the client is already aware of. As messages are restricted to 64k,
6431a client that already knows more than about a thousand blocks may need to send
6432several of these messages. Naturally, the client should transmit these messages
6433as quickly as possible after the original GET request such that the DHT can
6434filter those results in the network early on. Naturally, as these messages are
6435send after the original request, it is conceivalbe that the DHT service may
6436return blocks that match those already known to the client anyway.
6437
6438In response to a GET request, the service will send @code{struct
6439GNUNET_DHT_ClientResultMessage}s to the client. These messages contain the
6440block type, expiration, key, unique ID of the request and of course the value
6441(a block). Depending on the options set for the respective operations, the
6442replies may also contain the path the GET and/or the PUT took through the
6443network.
6444
6445A client can stop receiving replies either by disconnecting or by sending a
6446@code{struct GNUNET_DHT_ClientGetStopMessage} which must contain the key and
6447the 64-bit unique ID of the original request. Using an explicit "stop" message
6448is more common as this allows a client to run many concurrent GET operations
6449over the same connection with the DHT service --- and to stop them
6450individually.
6451
6452@node Monitoring the DHT
6453@subsubsection Monitoring the DHT
6454
6455@c %**end of header
6456
6457To begin monitoring, the client sends a @code{struct
6458GNUNET_DHT_MonitorStartStop} message to the DHT service. In this message, flags
6459can be set to enable (or disable) monitoring of GET, PUT and RESULT messages
6460that pass through a peer. The message can also restrict monitoring to a
6461particular block type or a particular key. Once monitoring is enabled, the DHT
6462service will notify the client about any matching event using @code{struct
6463GNUNET_DHT_MonitorGetMessage}s for GET events, @code{struct
6464GNUNET_DHT_MonitorPutMessage} for PUT events and@ @code{struct
6465GNUNET_DHT_MonitorGetRespMessage} for RESULTs. Each of these messages contains
6466all of the information about the event.
6467
6468@node The DHT Peer-to-Peer Protocol
6469@subsection The DHT Peer-to-Peer Protocol
6470@c %**end of header
6471
6472
6473@menu
6474* Routing GETs or PUTs::
6475* PUTting data into the DHT2::
6476* GETting data from the DHT2::
6477@end menu
6478
6479@node Routing GETs or PUTs
6480@subsubsection Routing GETs or PUTs
6481
6482@c %**end of header
6483
6484When routing GETs or PUTs, the DHT service selects a suitable subset of
6485neighbours for forwarding. The exact number of neighbours can be zero or more
6486and depends on the hop counter of the query (initially zero) in relation to the
6487(log of) the network size estimate, the desired replication level and the
6488peer's connectivity. Depending on the hop counter and our network size
6489estimate, the selection of the peers maybe randomized or by proximity to the
6490key. Furthermore, requests include a set of peers that a request has already
6491traversed; those peers are also excluded from the selection.
6492
6493@node PUTting data into the DHT2
6494@subsubsection PUTting data into the DHT2
6495
6496@c %**end of header
6497
6498To PUT data into the DHT, the service sends a @code{struct PeerPutMessage} of
6499type @code{GNUNET_MESSAGE_TYPE_DHT_P2P_PUT} to the respective neighbour. In
6500addition to the usual information about the content (type, routing options,
6501desired replication level for the content, expiration time, key and value), the
6502message contains a fixed-size Bloom filter with information about which peers
6503(may) have already seen this request. This Bloom filter is used to ensure that
6504DHT messages never loop back to a peer that has already processed the request.
6505Additionally, the message includes the current hop counter and, depending on
6506the routing options, the message may include the full path that the message has
6507taken so far. The Bloom filter should already contain the identity of the
6508previous hop; however, the path should not include the identity of the previous
6509hop and the receiver should append the identity of the sender to the path, not
6510its own identity (this is done to reduce bandwidth).
6511
6512@node GETting data from the DHT2
6513@subsubsection GETting data from the DHT2
6514
6515@c %**end of header
6516
6517A peer can search the DHT by sending @code{struct PeerGetMessage}s of type
6518@code{GNUNET_MESSAGE_TYPE_DHT_P2P_GET} to other peers. In addition to the usual
6519information about the request (type, routing options, desired replication level
6520for the request, the key and the extended query), a GET request also again
6521contains a hop counter, a Bloom filter over the peers that have processed the
6522request already and depending on the routing options the full path traversed by
6523the GET. Finally, a GET request includes a variable-size second Bloom filter
6524and a so-called Bloom filter mutator value which together indicate which
6525replies the sender has already seen. During the lookup, each block that matches
6526they block type, key and extended query is additionally subjected to a test
6527against this Bloom filter. The block plugin is expected to take the hash of the
6528block and combine it with the mutator value and check if the result is not yet
6529in the Bloom filter. The originator of the query will from time to time modify
6530the mutator to (eventually) allow false-positives filtered by the Bloom filter
6531to be returned.
6532
6533Peers that receive a GET request perform a local lookup (depending on their
6534proximity to the key and the query options) and forward the request to other
6535peers. They then remember the request (including the Bloom filter for blocking
6536duplicate results) and when they obtain a matching, non-filtered response a
6537@code{struct PeerResultMessage} of type@
6538@code{GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT} is forwarded to the previous hop.
6539Whenver a result is forwarded, the block plugin is used to update the Bloom
6540filter accordingly, to ensure that the same result is never forwarded more than
6541once. The DHT service may also cache forwarded results locally if the
6542"CACHE_RESULTS" option is set to "YES" in the configuration.
6543
6544@node The GNU Name System (GNS)
6545@section The GNU Name System (GNS)
6546
6547@c %**end of header
6548
6549The GNU Name System (GNS) is a decentralized database that enables users to
6550securely resolve names to values. Names can be used to identify other users
6551(for example, in social networking), or network services (for example, VPN
6552services running at a peer in GNUnet, or purely IP-based services on the
6553Internet). Users interact with GNS by typing in a hostname that ends in ".gnu"
6554or ".zkey".
6555
6556Videos giving an overview of most of the GNS and the motivations behind it is
6557available here and here. The remainder of this chapter targets developers that
6558are familiar with high level concepts of GNS as presented in these talks.
6559
6560GNS-aware applications should use the GNS resolver to obtain the respective
6561records that are stored under that name in GNS. Each record consists of a type,
6562value, expiration time and flags.
6563
6564The type specifies the format of the value. Types below 65536 correspond to DNS
6565record types, larger values are used for GNS-specific records. Applications can
6566define new GNS record types by reserving a number and implementing a plugin
6567(which mostly needs to convert the binary value representation to a
6568human-readable text format and vice-versa). The expiration time specifies how
6569long the record is to be valid. The GNS API ensures that applications are only
6570given non-expired values. The flags are typically irrelevant for applications,
6571as GNS uses them internally to control visibility and validity of records.
6572
6573Records are stored along with a signature. The signature is generated using the
6574private key of the authoritative zone. This allows any GNS resolver to verify
6575the correctness of a name-value mapping.
6576
6577Internally, GNS uses the NAMECACHE to cache information obtained from other
6578users, the NAMESTORE to store information specific to the local users, and the
6579DHT to exchange data between users. A plugin API is used to enable applications
6580to define new GNS record types.
6581
6582@menu
6583* libgnunetgns::
6584* libgnunetgnsrecord::
6585* GNS plugins::
6586* The GNS Client-Service Protocol::
6587* Hijacking the DNS-Traffic using gnunet-service-dns::
6588* Serving DNS lookups via GNS on W32::
6589@end menu
6590
6591@node libgnunetgns
6592@subsection libgnunetgns
6593
6594@c %**end of header
6595
6596The GNS API itself is extremely simple. Clients first connec to the GNS service
6597using @code{GNUNET_GNS_connect}. They can then perform lookups using
6598@code{GNUNET_GNS_lookup} or cancel pending lookups using
6599@code{GNUNET_GNS_lookup_cancel}. Once finished, clients disconnect using
6600@code{GNUNET_GNS_disconnect}.
6601
6602
6603@menu
6604* Looking up records::
6605* Accessing the records::
6606* Creating records::
6607* Future work::
6608@end menu
6609
6610@node Looking up records
6611@subsubsection Looking up records
6612
6613@c %**end of header
6614
6615@code{GNUNET_GNS_lookup} takes a number of arguments:
6616
6617@table @asis
6618@item handle This is simply the GNS connection handle from
6619@code{GNUNET_GNS_connect}.
6620@item name The client needs to specify the name to
6621be resolved. This can be any valid DNS or GNS hostname.
6622@item zone The client
6623needs to specify the public key of the GNS zone against which the resolution
6624should be done (the ".gnu" zone). Note that a key must be provided, even if the
6625name ends in ".zkey". This should typically be the public key of the
6626master-zone of the user.
6627@item type This is the desired GNS or DNS record type
6628to look for. While all records for the given name will be returned, this can be
6629important if the client wants to resolve record types that themselves delegate
6630resolution, such as CNAME, PKEY or GNS2DNS. Resolving a record of any of these
6631types will only work if the respective record type is specified in the request,
6632as the GNS resolver will otherwise follow the delegation and return the records
6633from the respective destination, instead of the delegating record.
6634@item only_cached This argument should typically be set to @code{GNUNET_NO}. Setting
6635it to @code{GNUNET_YES} disables resolution via the overlay network.
6636@item shorten_zone_key If GNS encounters new names during resolution, their
6637respective zones can automatically be learned and added to the "shorten zone".
6638If this is desired, clients must pass the private key of the shorten zone. If
6639NULL is passed, shortening is disabled.
6640@item proc This argument identifies
6641the function to call with the result. It is given proc_cls, the number of
6642records found (possilby zero) and the array of the records as arguments. proc
6643will only be called once. After proc,> has been called, the lookup must no
6644longer be cancelled.
6645@item proc_cls The closure for proc.
6646@end table
6647
6648@node Accessing the records
6649@subsubsection Accessing the records
6650
6651@c %**end of header
6652
6653The @code{libgnunetgnsrecord} library provides an API to manipulate the GNS
6654record array that is given to proc. In particular, it offers functions such as
6655converting record values to human-readable strings (and back). However, most
6656@code{libgnunetgnsrecord} functions are not interesting to GNS client
6657applications.
6658
6659For DNS records, the @code{libgnunetdnsparser} library provides functions for
6660parsing (and serializing) common types of DNS records.
6661
6662@node Creating records
6663@subsubsection Creating records
6664
6665@c %**end of header
6666
6667Creating GNS records is typically done by building the respective record
6668information (possibly with the help of @code{libgnunetgnsrecord} and
6669@code{libgnunetdnsparser}) and then using the @code{libgnunetnamestore} to
6670publish the information. The GNS API is not involved in this
6671operation.
6672
6673@node Future work
6674@subsubsection Future work
6675
6676@c %**end of header
6677
6678In the future, we want to expand @code{libgnunetgns} to allow applications to
6679observe shortening operations performed during GNS resolution, for example so
6680that users can receive visual feedback when this happens.
6681
6682@node libgnunetgnsrecord
6683@subsection libgnunetgnsrecord
6684
6685@c %**end of header
6686
6687The @code{libgnunetgnsrecord} library is used to manipulate GNS records (in
6688plaintext or in their encrypted format). Applications mostly interact with
6689@code{libgnunetgnsrecord} by using the functions to convert GNS record values
6690to strings or vice-versa, or to lookup a GNS record type number by name (or
6691vice-versa). The library also provides various other functions that are mostly
6692used internally within GNS, such as converting keys to names, checking for
6693expiration, encrypting GNS records to GNS blocks, verifying GNS block
6694signatures and decrypting GNS records from GNS blocks.
6695
6696We will now discuss the four commonly used functions of the API.@
6697@code{libgnunetgnsrecord} does not perform these operations itself, but instead
6698uses plugins to perform the operation. GNUnet includes plugins to support
6699common DNS record types as well as standard GNS record types.
6700
6701
6702@menu
6703* Value handling::
6704* Type handling::
6705@end menu
6706
6707@node Value handling
6708@subsubsection Value handling
6709
6710@c %**end of header
6711
6712@code{GNUNET_GNSRECORD_value_to_string} can be used to convert the (binary)
6713representation of a GNS record value to a human readable, 0-terminated UTF-8
6714string. NULL is returned if the specified record type is not supported by any
6715available plugin.
6716
6717@code{GNUNET_GNSRECORD_string_to_value} can be used to try to convert a human
6718readable string to the respective (binary) representation of a GNS record
6719value.
6720
6721@node Type handling
6722@subsubsection Type handling
6723
6724@c %**end of header
6725
6726@code{GNUNET_GNSRECORD_typename_to_number} can be used to obtain the numeric
6727value associated with a given typename. For example, given the typename "A"
6728(for DNS A reocrds), the function will return the number 1. A list of common
6729DNS record types is
6730@uref{http://en.wikipedia.org/wiki/List_of_DNS_record_types, here. Note that
6731not all DNS record types are supported by GNUnet GNSRECORD plugins at this
6732time.}
6733
6734@code{GNUNET_GNSRECORD_number_to_typename} can be used to obtain the typename
6735associated with a given numeric value. For example, given the type number 1,
6736the function will return the typename "A".
6737
6738@node GNS plugins
6739@subsection GNS plugins
6740
6741@c %**end of header
6742
6743Adding a new GNS record type typically involves writing (or extending) a
6744GNSRECORD plugin. The plugin needs to implement the
6745@code{gnunet_gnsrecord_plugin.h} API which provides basic functions that are
6746needed by GNSRECORD to convert typenames and values of the respective record
6747type to strings (and back). These gnsrecord plugins are typically implemented
6748within their respective subsystems. Examples for such plugins can be found in
6749the GNSRECORD, GNS and CONVERSATION subsystems.
6750
6751The @code{libgnunetgnsrecord} library is then used to locate, load and query
6752the appropriate gnsrecord plugin. Which plugin is appropriate is determined by
6753the record type (which is just a 32-bit integer). The @code{libgnunetgnsrecord}
6754library loads all block plugins that are installed at the local peer and
6755forwards the application request to the plugins. If the record type is not
6756supported by the plugin, it should simply return an error code.
6757
6758The central functions of the block APIs (plugin and main library) are the same
6759four functions for converting between values and strings, and typenames and
6760numbers documented in the previous subsection.
6761
6762@node The GNS Client-Service Protocol
6763@subsection The GNS Client-Service Protocol
6764
6765@c %**end of header
6766
6767The GNS client-service protocol consists of two simple messages, the
6768@code{LOOKUP} message and the @code{LOOKUP_RESULT}. Each @code{LOOKUP} message
6769contains a unique 32-bit identifier, which will be included in the
6770corresponding response. Thus, clients can send many lookup requests in parallel
6771and receive responses out-of-order. A @code{LOOKUP} request also includes the
6772public key of the GNS zone, the desired record type and fields specifying
6773whether shortening is enabled or networking is disabled. Finally, the
6774@code{LOOKUP} message includes the name to be resolved.
6775
6776The response includes the number of records and the records themselves in the
6777format created by @code{GNUNET_GNSRECORD_records_serialize}. They can thus be
6778deserialized using @code{GNUNET_GNSRECORD_records_deserialize}.
6779
6780@node Hijacking the DNS-Traffic using gnunet-service-dns
6781@subsection Hijacking the DNS-Traffic using gnunet-service-dns
6782
6783@c %**end of header
6784
6785This section documents how the gnunet-service-dns (and the gnunet-helper-dns)
6786intercepts DNS queries from the local system.@ This is merely one method for
6787how we can obtain GNS queries. It is also possible to change @code{resolv.conf}
6788to point to a machine running @code{gnunet-dns2gns} or to modify libc's name
6789system switch (NSS) configuration to include a GNS resolution plugin. The
6790method described in this chaper is more of a last-ditch catch-all approach.
6791
6792@code{gnunet-service-dns} enables intercepting DNS traffic using policy based
6793routing. We MARK every outgoing DNS-packet if it was not sent by our
6794application. Using a second routing table in the Linux kernel these marked
6795packets are then routed through our virtual network interface and can thus be
6796captured unchanged.
6797
6798Our application then reads the query and decides how to handle it: A query to
6799an address ending in ".gnu" or ".zkey" is hijacked by @code{gnunet-service-gns}
6800and resolved internally using GNS. In the future, a reverse query for an
6801address of the configured virtual network could be answered with records kept
6802about previous forward queries. Queries that are not hijacked by some
6803application using the DNS service will be sent to the original recipient. The
6804answer to the query will always be sent back through the virtual interface with
6805the original nameserver as source address.
6806
6807
6808@menu
6809* Network Setup Details::
6810@end menu
6811
6812@node Network Setup Details
6813@subsubsection Network Setup Details
6814
6815@c %**end of header
6816
6817The DNS interceptor adds the following rules to the Linux kernel:
6818@example
6819iptables -t mangle -I OUTPUT 1 -p udp --sport $LOCALPORT --dport 53 -j
6820ACCEPT iptables -t mangle -I OUTPUT 2 -p udp --dport 53 -j MARK --set-mark 3 ip
6821rule add fwmark 3 table2 ip route add default via $VIRTUALDNS table2
6822@end example
6823
6824Line 1 makes sure that all packets coming from a port our application opened
6825beforehand (@code{$LOCALPORT}) will be routed normally. Line 2 marks every
6826other packet to a DNS-Server with mark 3 (chosen arbitrarily). The third line
6827adds a routing policy based on this mark 3 via the routing table.
6828
6829@node Serving DNS lookups via GNS on W32
6830@subsection Serving DNS lookups via GNS on W32
6831
6832@c %**end of header
6833
6834This section documents how the libw32nsp (and gnunet-gns-helper-service-w32) do
6835DNS resolutions of DNS queries on the local system. This only applies to GNUnet
6836running on W32.
6837
6838W32 has a concept of "Namespaces" and "Namespace providers". These are used to
6839present various name systems to applications in a generic way. Namespaces
6840include DNS, mDNS, NLA and others. For each namespace any number of providers
6841could be registered, and they are queried in an order of priority (which is
6842adjustable).
6843
6844Applications can resolve names by using WSALookupService*() family of
6845functions.
6846
6847However, these are WSA-only facilities. Common BSD socket functions for
6848namespace resolutions are gethostbyname and getaddrinfo (among others). These
6849functions are implemented internally (by default - by mswsock, which also
6850implements the default DNS provider) as wrappers around WSALookupService*()
6851functions (see "Sample Code for a Service Provider" on MSDN).
6852
6853On W32 GNUnet builds a libw32nsp - a namespace provider, which can then be
6854installed into the system by using w32nsp-install (and uninstalled by
6855w32nsp-uninstall), as described in "Installation Handbook".
6856
6857libw32nsp is very simple and has almost no dependencies. As a response to
6858NSPLookupServiceBegin(), it only checks that the provider GUID passed to it by
6859the caller matches GNUnet DNS Provider GUID, checks that name being resolved
6860ends in ".gnu" or ".zkey", then connects to gnunet-gns-helper-service-w32 at
6861127.0.0.1:5353 (hardcoded) and sends the name resolution request there,
6862returning the connected socket to the caller.
6863
6864When the caller invokes NSPLookupServiceNext(), libw32nsp reads a completely
6865formed reply from that socket, unmarshalls it, then gives it back to the
6866caller.
6867
6868At the moment gnunet-gns-helper-service-w32 is implemented to ever give only
6869one reply, and subsequent calls to NSPLookupServiceNext() will fail with
6870WSA_NODATA (first call to NSPLookupServiceNext() might also fail if GNS failed
6871to find the name, or there was an error connecting to it).
6872
6873gnunet-gns-helper-service-w32 does most of the processing:
6874
6875@itemize @bullet
6876@item Maintains a connection to GNS.
6877@item Reads GNS config and loads appropriate keys.
6878@item Checks service GUID and decides on the type of record to look up,
6879refusing to make a lookup outright when unsupported service GUID is passed.
6880@item Launches the lookup
6881@end itemize
6882
6883When lookup result arrives, gnunet-gns-helper-service-w32 forms a complete
6884reply (including filling a WSAQUERYSETW structure and, possibly, a binary blob
6885with a hostent structure for gethostbyname() client), marshalls it, and sends
6886it back to libw32nsp. If no records were found, it sends an empty header.
6887
6888This works for most normal applications that use gethostbyname() or
6889getaddrinfo() to resolve names, but fails to do anything with applications that
6890use alternative means of resolving names (such as sending queries to a DNS
6891server directly by themselves). This includes some of well known utilities,
6892like "ping" and "nslookup".
6893
6894@node The GNS Namecache
6895@section The GNS Namecache
6896
6897@c %**end of header
6898
6899The NAMECACHE subsystem is responsible for caching (encrypted) resolution
6900results of the GNU Name System (GNS). GNS makes zone information available to
6901other users via the DHT. However, as accessing the DHT for every lookup is
6902expensive (and as the DHT's local cache is lost whenever the peer is
6903restarted), GNS uses the NAMECACHE as a more persistent cache for DHT lookups.
6904Thus, instead of always looking up every name in the DHT, GNS first checks if
6905the result is already available locally in the NAMECACHE. Only if there is no
6906result in the NAMECACHE, GNS queries the DHT. The NAMECACHE stores data in the
6907same (encrypted) format as the DHT. It thus makes no sense to iterate over all
6908items in the NAMECACHE --- the NAMECACHE does not have a way to provide the
6909keys required to decrypt the entries.
6910
6911Blocks in the NAMECACHE share the same expiration mechanism as blocks in the
6912DHT --- the block expires wheneever any of the records in the (encrypted) block
6913expires. The expiration time of the block is the only information stored in
6914plaintext. The NAMECACHE service internally performs all of the required work
6915to expire blocks, clients do not have to worry about this. Also, given that
6916NAMECACHE stores only GNS blocks that local users requested, there is no
6917configuration option to limit the size of the NAMECACHE. It is assumed to be
6918always small enough (a few MB) to fit on the drive.
6919
6920The NAMECACHE supports the use of different database backends via a plugin API.
6921
6922@menu
6923* libgnunetnamecache::
6924* The NAMECACHE Client-Service Protocol::
6925* The NAMECACHE Plugin API::
6926@end menu
6927
6928@node libgnunetnamecache
6929@subsection libgnunetnamecache
6930
6931@c %**end of header
6932
6933The NAMECACHE API consists of five simple functions. First, there is
6934@code{GNUNET_NAMECACHE_connect} to connect to the NAMECACHE service. This
6935returns the handle required for all other operations on the NAMECACHE. Using
6936@code{GNUNET_NAMECACHE_block_cache} clients can insert a block into the cache.
6937@code{GNUNET_NAMECACHE_lookup_block} can be used to lookup blocks that were
6938stored in the NAMECACHE. Both operations can be cancelled using
6939@code{GNUNET_NAMECACHE_cancel}. Note that cancelling a
6940@code{GNUNET_NAMECACHE_block_cache} operation can result in the block being
6941stored in the NAMECACHE --- or not. Cancellation primarily ensures that the
6942continuation function with the result of the operation will no longer be
6943invoked. Finally, @code{GNUNET_NAMECACHE_disconnect} closes the connection to
6944the NAMECACHE.
6945
6946The maximum size of a block that can be stored in the NAMECACHE is
6947@code{GNUNET_NAMECACHE_MAX_VALUE_SIZE}, which is defined to be 63 kB.
6948
6949@node The NAMECACHE Client-Service Protocol
6950@subsection The NAMECACHE Client-Service Protocol
6951
6952@c %**end of header
6953
6954All messages in the NAMECACHE IPC protocol start with the @code{struct
6955GNUNET_NAMECACHE_Header} which adds a request ID (32-bit integer) to the
6956standard message header. The request ID is used to match requests with the
6957respective responses from the NAMECACHE, as they are allowed to happen
6958out-of-order.
6959
6960
6961@menu
6962* Lookup::
6963* Store::
6964@end menu
6965
6966@node Lookup
6967@subsubsection Lookup
6968
6969@c %**end of header
6970
6971The @code{struct LookupBlockMessage} is used to lookup a block stored in the
6972cache. It contains the query hash. The NAMECACHE always responds with a
6973@code{struct LookupBlockResponseMessage}. If the NAMECACHE has no response, it
6974sets the expiration time in the response to zero. Otherwise, the response is
6975expected to contain the expiration time, the ECDSA signature, the derived key
6976and the (variable-size) encrypted data of the block.
6977
6978@node Store
6979@subsubsection Store
6980
6981@c %**end of header
6982
6983The @code{struct BlockCacheMessage} is used to cache a block in the NAMECACHE.
6984It has the same structure as the @code{struct LookupBlockResponseMessage}. The
6985service responds with a @code{struct BlockCacheResponseMessage} which contains
6986the result of the operation (success or failure). In the future, we might want
6987to make it possible to provide an error message as well.
6988
6989@node The NAMECACHE Plugin API
6990@subsection The NAMECACHE Plugin API
6991@c %**end of header
6992
6993The NAMECACHE plugin API consists of two functions, @code{cache_block} to store
6994a block in the database, and @code{lookup_block} to lookup a block in the
6995database.
6996
6997
6998@menu
6999* Lookup2::
7000* Store2::
7001@end menu
7002
7003@node Lookup2
7004@subsubsection Lookup2
7005
7006@c %**end of header
7007
7008The @code{lookup_block} function is expected to return at most one block to the
7009iterator, and return @code{GNUNET_NO} if there were no non-expired results. If
7010there are multiple non-expired results in the cache, the lookup is supposed to
7011return the result with the largest expiration time.
7012
7013@node Store2
7014@subsubsection Store2
7015
7016@c %**end of header
7017
7018The @code{cache_block} function is expected to try to store the block in the
7019database, and return @code{GNUNET_SYSERR} if this was not possible for any
7020reason. Furthermore, @code{cache_block} is expected to implicitly perform cache
7021maintenance and purge blocks from the cache that have expired. Note that
7022@code{cache_block} might encounter the case where the database already has
7023another block stored under the same key. In this case, the plugin must ensure
7024that the block with the larger expiration time is preserved. Obviously, this
7025can done either by simply adding new blocks and selecting for the most recent
7026expiration time during lookup, or by checking which block is more recent during
7027the store operation.
7028
7029@node The REVOCATION Subsystem
7030@section The REVOCATION Subsystem
7031@c %**end of header
7032
7033The REVOCATION subsystem is responsible for key revocation of Egos. If a user
7034learns that his private key has been compromised or has lost it, he can use the
7035REVOCATION system to inform all of the other users that this private key is no
7036longer valid. The subsystem thus includes ways to query for the validity of
7037keys and to propagate revocation messages.
7038
7039@menu
7040* Dissemination::
7041* Revocation Message Design Requirements::
7042* libgnunetrevocation::
7043* The REVOCATION Client-Service Protocol::
7044* The REVOCATION Peer-to-Peer Protocol::
7045@end menu
7046
7047@node Dissemination
7048@subsection Dissemination
7049
7050@c %**end of header
7051
7052When a revocation is performed, the revocation is first of all disseminated by
7053flooding the overlay network. The goal is to reach every peer, so that when a
7054peer needs to check if a key has been revoked, this will be purely a local
7055operation where the peer looks at his local revocation list. Flooding the
7056network is also the most robust form of key revocation --- an adversary would
7057have to control a separator of the overlay graph to restrict the propagation of
7058the revocation message. Flooding is also very easy to implement --- peers that
7059receive a revocation message for a key that they have never seen before simply
7060pass the message to all of their neighbours.
7061
7062Flooding can only distribute the revocation message to peers that are online.
7063In order to notify peers that join the network later, the revocation service
7064performs efficient set reconciliation over the sets of known revocation
7065messages whenever two peers (that both support REVOCATION dissemination)
7066connect. The SET service is used to perform this operation
7067efficiently.
7068
7069@node Revocation Message Design Requirements
7070@subsection Revocation Message Design Requirements
7071
7072@c %**end of header
7073
7074However, flooding is also quite costly, creating O(|E|) messages on a network
7075with |E| edges. Thus, revocation messages are required to contain a
7076proof-of-work, the result of an expensive computation (which, however, is cheap
7077to verify). Only peers that have expended the CPU time necessary to provide
7078this proof will be able to flood the network with the revocation message. This
7079ensures that an attacker cannot simply flood the network with millions of
7080revocation messages. The proof-of-work required by GNUnet is set to take days
7081on a typical PC to compute; if the ability to quickly revoke a key is needed,
7082users have the option to pre-compute revocation messages to store off-line and
7083use instantly after their key has expired.
7084
7085Revocation messages must also be signed by the private key that is being
7086revoked. Thus, they can only be created while the private key is in the
7087possession of the respective user. This is another reason to create a
7088revocation message ahead of time and store it in a secure location.
7089
7090@node libgnunetrevocation
7091@subsection libgnunetrevocation
7092
7093@c %**end of header
7094
7095The REVOCATION API consists of two parts, to query and to issue
7096revocations.
7097
7098
7099@menu
7100* Querying for revoked keys::
7101* Preparing revocations::
7102* Issuing revocations::
7103@end menu
7104
7105@node Querying for revoked keys
7106@subsubsection Querying for revoked keys
7107
7108@c %**end of header
7109
7110@code{GNUNET_REVOCATION_query} is used to check if a given ECDSA public key has
7111been revoked. The given callback will be invoked with the result of the check.
7112The query can be cancelled using @code{GNUNET_REVOCATION_query_cancel} on the
7113return value.
7114
7115@node Preparing revocations
7116@subsubsection Preparing revocations
7117
7118@c %**end of header
7119
7120It is often desirable to create a revocation record ahead-of-time and store it
7121in an off-line location to be used later in an emergency. This is particularly
7122true for GNUnet revocations, where performing the revocation operation itself
7123is computationally expensive and thus is likely to take some time. Thus, if
7124users want the ability to perform revocations quickly in an emergency, they
7125must pre-compute the revocation message. The revocation API enables this with
7126two functions that are used to compute the revocation message, but not trigger
7127the actual revocation operation.
7128
7129@code{GNUNET_REVOCATION_check_pow} should be used to calculate the
7130proof-of-work required in the revocation message. This function takes the
7131public key, the required number of bits for the proof of work (which in GNUnet
7132is a network-wide constant) and finally a proof-of-work number as arguments.
7133The function then checks if the given proof-of-work number is a valid proof of
7134work for the given public key. Clients preparing a revocation are expected to
7135call this function repeatedly (typically with a monotonically increasing
7136sequence of numbers of the proof-of-work number) until a given number satisfies
7137the check. That number should then be saved for later use in the revocation
7138operation.
7139
7140@code{GNUNET_REVOCATION_sign_revocation} is used to generate the signature that
7141is required in a revocation message. It takes the private key that (possibly in
7142the future) is to be revoked and returns the signature. The signature can again
7143be saved to disk for later use, which will then allow performing a revocation
7144even without access to the private key.
7145
7146@node Issuing revocations
7147@subsubsection Issuing revocations
7148
7149
7150Given a ECDSA public key, the signature from @code{GNUNET_REVOCATION_sign} and
7151the proof-of-work, @code{GNUNET_REVOCATION_revoke} can be used to perform the
7152actual revocation. The given callback is called upon completion of the
7153operation. @code{GNUNET_REVOCATION_revoke_cancel} can be used to stop the
7154library from calling the continuation; however, in that case it is undefined
7155whether or not the revocation operation will be executed.
7156
7157@node The REVOCATION Client-Service Protocol
7158@subsection The REVOCATION Client-Service Protocol
7159
7160
7161The REVOCATION protocol consists of four simple messages.
7162
7163A @code{QueryMessage} containing a public ECDSA key is used to check if a
7164particular key has been revoked. The service responds with a
7165@code{QueryResponseMessage} which simply contains a bit that says if the given
7166public key is still valid, or if it has been revoked.
7167
7168The second possible interaction is for a client to revoke a key by passing a
7169@code{RevokeMessage} to the service. The @code{RevokeMessage} contains the
7170ECDSA public key to be revoked, a signature by the corresponding private key
7171and the proof-of-work, The service responds with a
7172@code{RevocationResponseMessage} which can be used to indicate that the
7173@code{RevokeMessage} was invalid (i.e. proof of work incorrect), or otherwise
7174indicates that the revocation has been processed successfully.
7175
7176@node The REVOCATION Peer-to-Peer Protocol
7177@subsection The REVOCATION Peer-to-Peer Protocol
7178
7179@c %**end of header
7180
7181Revocation uses two disjoint ways to spread revocation information among peers.
7182First of all, P2P gossip exchanged via CORE-level neighbours is used to quickly
7183spread revocations to all connected peers. Second, whenever two peers (that
7184both support revocations) connect, the SET service is used to compute the union
7185of the respective revocation sets.
7186
7187In both cases, the exchanged messages are @code{RevokeMessage}s which contain
7188the public key that is being revoked, a matching ECDSA signature, and a
7189proof-of-work. Whenever a peer learns about a new revocation this way, it first
7190validates the signature and the proof-of-work, then stores it to disk
7191(typically to a file $GNUNET_DATA_HOME/revocation.dat) and finally spreads the
7192information to all directly connected neighbours.
7193
7194For computing the union using the SET service, the peer with the smaller hashed
7195peer identity will connect (as a "client" in the two-party set protocol) to the
7196other peer after one second (to reduce traffic spikes on connect) and initiate
7197the computation of the set union. All revocation services use a common hash to
7198identify the SET operation over revocation sets.
7199
7200The current implementation accepts revocation set union operations from all
7201peers at any time; however, well-behaved peers should only initiate this
7202operation once after establishing a connection to a peer with a larger hashed
7203peer identity.
7204
7205@node GNUnet's File-sharing (FS) Subsystem
7206@section GNUnet's File-sharing (FS) Subsystem
7207
7208@c %**end of header
7209
7210This chapter describes the details of how the file-sharing service works. As
7211with all services, it is split into an API (libgnunetfs), the service process
7212(gnunet-service-fs) and user interface(s). The file-sharing service uses the
7213datastore service to store blocks and the DHT (and indirectly datacache) for
7214lookups for non-anonymous file-sharing.@ Furthermore, the file-sharing service
7215uses the block library (and the block fs plugin) for validation of DHT
7216operations.
7217
7218In contrast to many other services, libgnunetfs is rather complex since the
7219client library includes a large number of high-level abstractions; this is
7220necessary since the Fs service itself largely only operates on the block level.
7221The FS library is responsible for providing a file-based abstraction to
7222applications, including directories, meta data, keyword search, verification,
7223and so on.
7224
7225The method used by GNUnet to break large files into blocks and to use keyword
7226search is called the "Encoding for Censorship Resistant Sharing" (ECRS). ECRS
7227is largely implemented in the fs library; block validation is also reflected in
7228the block FS plugin and the FS service. ECRS on-demand encoding is implemented
7229in the FS service.
7230
7231NOTE: The documentation in this chapter is quite incomplete.
7232
7233@menu
7234* Encoding for Censorship-Resistant Sharing (ECRS)::
7235* File-sharing persistence directory structure::
7236@end menu
7237
7238@node Encoding for Censorship-Resistant Sharing (ECRS)
7239@subsection Encoding for Censorship-Resistant Sharing (ECRS)
7240
7241@c %**end of header
7242
7243When GNUnet shares files, it uses a content encoding that is called ECRS, the
7244Encoding for Censorship-Resistant Sharing. Most of ECRS is described in the
7245(so far unpublished) research paper attached to this page. ECRS obsoletes the
7246previous ESED and ESED II encodings which were used in GNUnet before version
72470.7.0.@ @ The rest of this page assumes that the reader is familiar with the
7248attached paper. What follows is a description of some minor extensions that
7249GNUnet makes over what is described in the paper. The reason why these
7250extensions are not in the paper is that we felt that they were obvious or
7251trivial extensions to the original scheme and thus did not warrant space in
7252the research report.
7253
7254
7255@menu
7256* Namespace Advertisements::
7257* KSBlocks::
7258@end menu
7259
7260@node Namespace Advertisements
7261@subsubsection Namespace Advertisements
7262
7263@c %**end of header
7264@c %**FIXME: all zeroses -> ?
7265
7266An @code{SBlock} with identifier all zeros is a signed
7267advertisement for a namespace. This special @code{SBlock} contains metadata
7268describing the content of the namespace. Instead of the name of the identifier
7269for a potential update, it contains the identifier for the root of the
7270namespace. The URI should always be empty. The @code{SBlock} is signed with
7271the content provder's RSA private key (just like any other SBlock). Peers
7272can search for @code{SBlock}s in order to find out more about a namespace.
7273
7274@node KSBlocks
7275@subsubsection KSBlocks
7276
7277@c %**end of header
7278
7279GNUnet implements @code{KSBlocks} which are @code{KBlocks} that, instead of
7280encrypting a CHK and metadata, encrypt an @code{SBlock} instead. In other
7281words, @code{KSBlocks} enable GNUnet to find @code{SBlocks} using the global
7282keyword search. Usually the encrypted @code{SBlock} is a namespace
7283advertisement. The rationale behind @code{KSBlock}s and @code{SBlock}s is to
7284enable peers to discover namespaces via keyword searches, and, to associate
7285useful information with namespaces. When GNUnet finds @code{KSBlocks} during a
7286normal keyword search, it adds the information to an internal list of
7287discovered namespaces. Users looking for interesting namespaces can then
7288inspect this list, reducing the need for out-of-band discovery of namespaces.
7289Naturally, namespaces (or more specifically, namespace advertisements) can
7290also be referenced from directories, but @code{KSBlock}s should make it easier
7291to advertise namespaces for the owner of the pseudonym since they eliminate
7292the need to first create a directory.
7293
7294Collections are also advertised using @code{KSBlock}s.
7295
7296@table @asis
7297@item Attachment Size
7298@item ecrs.pdf 270.68 KB
7299@item https://gnunet.org/sites/default/files/ecrs.pdf
7300@end table
7301
7302@node File-sharing persistence directory structure
7303@subsection File-sharing persistence directory structure
7304
7305@c %**end of header
7306
7307This section documents how the file-sharing library implements persistence of
7308file-sharing operations and specifically the resulting directory structure.
7309This code is only active if the @code{GNUNET_FS_FLAGS_PERSISTENCE} flag was set
7310when calling @code{GNUNET_FS_start}. In this case, the file-sharing library
7311will try hard to ensure that all major operations (searching, downloading,
7312publishing, unindexing) are persistent, that is, can live longer than the
7313process itself. More specifically, an operation is supposed to live until it is
7314explicitly stopped.
7315
7316If @code{GNUNET_FS_stop} is called before an operation has been stopped, a
7317@code{SUSPEND} event is generated and then when the process calls
7318@code{GNUNET_FS_start} next time, a @code{RESUME} event is generated.
7319Additionally, even if an application crashes (segfault, SIGKILL, system crash)
7320and hence @code{GNUNET_FS_stop} is never called and no @code{SUSPEND} events
7321are generated, operations are still resumed (with @code{RESUME} events). This
7322is implemented by constantly writing the current state of the file-sharing
7323operations to disk. Specifically, the current state is always written to disk
7324whenever anything significant changes (the exception are block-wise progress in
7325publishing and unindexing, since those operations would be slowed down
7326significantly and can be resumed cheaply even without detailed accounting).
7327Note that@ if the process crashes (or is killed) during a serialization
7328operation, FS does not guarantee that this specific operation is recoverable
7329(no strict transactional semantics, again for performance reasons). However,
7330all other unrelated operations should resume nicely.
7331
7332Since we need to serialize the state continuously and want to recover as much
7333as possible even after crashing during a serialization operation, we do not use
7334one large file for serialization. Instead, several directories are used for the
7335various operations. When @code{GNUNET_FS_start} executes, the master
7336directories are scanned for files describing operations to resume. Sometimes,
7337these operations can refer to related operations in child directories which may
7338also be resumed at this point. Note that corrupted files are cleaned up
7339automatically. However, dangling files in child directories (those that are not
7340referenced by files from the master directories) are not automatically removed.
7341
7342Persistence data is kept in a directory that begins with the "STATE_DIR" prefix
7343from the configuration file (by default, "$SERVICEHOME/persistence/") followed
7344by the name of the client as given to @code{GNUNET_FS_start} (for example,
7345"gnunet-gtk") followed by the actual name of the master or child directory.
7346
7347The names for the master directories follow the names of the operations:
7348
7349@itemize @bullet
7350@item "search"
7351@item "download"
7352@item "publish"
7353@item "unindex"
7354@end itemize
7355
7356Each of the master directories contains names (chosen at random) for each
7357active top-level (master) operation. Note that a download that is associated
7358with a search result is not a top-level operation.
7359
7360In contrast to the master directories, the child directories are only consulted
7361when another operation refers to them. For each search, a subdirectory (named
7362after the master search synchronization file) contains the search results.
7363Search results can have an associated download, which is then stored in the
7364general "download-child" directory. Downloads can be recursive, in which case
7365children are stored in subdirectories mirroring the structure of the recursive
7366download (either starting in the master "download" directory or in the
7367"download-child" directory depending on how the download was initiated). For
7368publishing operations, the "publish-file" directory contains information about
7369the individual files and directories that are part of the publication. However,
7370this directory structure is flat and does not mirror the structure of the
7371publishing operation. Note that unindex operations cannot have associated child
7372operations.
7373
7374@node GNUnet's REGEX Subsystem
7375@section GNUnet's REGEX Subsystem
7376
7377@c %**end of header
7378
7379Using the REGEX subsystem, you can discover peers that offer a particular
7380service using regular expressions. The peers that offer a service specify it
7381using a regular expressions. Peers that want to patronize a service search
7382using a string. The REGEX subsystem will then use the DHT to return a set of
7383matching offerers to the patrons.
7384
7385For the technical details, we have "Max's defense talk and Max's Master's
7386thesis. An additional publication is under preparation and available to team
7387members (in Git).
7388
7389@menu
7390* How to run the regex profiler::
7391@end menu
7392
7393@node How to run the regex profiler
7394@subsection How to run the regex profiler
7395
7396@c %**end of header
7397
7398The gnunet-regex-profiler can be used to profile the usage of mesh/regex for a
7399given set of regular expressions and strings. Mesh/regex allows you to announce
7400your peer ID under a certain regex and search for peers matching a particular
7401regex using a string. See https://gnunet.org/szengel2012ms for a full
7402introduction.
7403
7404First of all, the regex profiler uses GNUnet testbed, thus all the implications
7405for testbed also apply to the regex profiler (for example you need
7406password-less ssh login to the machines listed in your hosts file).
7407
7408@strong{Configuration}
7409
7410Moreover, an appropriate configuration file is needed. Generally you can refer
7411to SVN HEAD: contrib/regex_profiler_infiniband.conf for an example
7412configuration. In the following paragraph the important details are
7413highlighted.
7414
7415Announcing of the regular expressions is done by the
7416gnunet-daemon-regexprofiler, therefore you have to make sure it is started, by
7417adding it to the AUTOSTART set of ARM:@
7418@code{
7419[regexprofiler]@
7420AUTOSTART = YES@
7421}
7422
7423Furthermore you have to specify the location of the binary:
7424@example
7425[regexprofiler]
7426# Location of the gnunet-daemon-regexprofiler binary.
7427BINARY = /home/szengel/gnunet/src/mesh/.libs/gnunet-daemon-regexprofiler
7428# Regex prefix that will be applied to all regular expressions and
7429# search string.
7430REGEX_PREFIX = "GNVPN-0001-PAD"
7431@end example
7432
7433When running the profiler with a large scale deployment, you probably want to
7434reduce the workload of each peer. Use the following options to do this.@
7435@example
7436[dht]@
7437# Force network size estimation@
7438FORCE_NSE = 1
7439
7440[dhtcache]
7441DATABASE = heap@
7442# Disable RC-file for Bloom filter? (for benchmarking with limited IO
7443# availability)@
7444DISABLE_BF_RC = YES@
7445# Disable Bloom filter entirely@
7446DISABLE_BF = YES
7447
7448[nse]@
7449# Minimize proof-of-work CPU consumption by NSE@
7450WORKBITS = 1
7451@end example
7452
7453
7454@strong{Options}
7455
7456To finally run the profiler some options and the input data need to be
7457specified on the command line.
7458@code{@ gnunet-regex-profiler -c config-file -d
7459log-file -n num-links -p@ path-compression-length -s search-delay -t
7460matching-timeout -a num-search-strings hosts-file policy-dir
7461search-strings-file@ }
7462
7463@code{config-file} the configuration file created earlier.@ @code{log-file}
7464file where to write statistics output.@ @code{num-links} number of random links
7465between started peers.@ @code{path-compression-length} maximum path compression
7466length in the DFA.@ @code{search-delay} time to wait between peers finished
7467linking and@ starting to match strings.@ @code{matching-timeout} timeout after
7468witch to cancel the searching.@ @code{num-search-strings} number of strings in
7469the search-strings-file.
7470
7471The @code{hosts-file} should contain a list of hosts for the testbed, one per
7472line in the following format. @code{user@@host_ip:port}.
7473
7474The @code{policy-dir} is a folder containing text files containing one or more
7475regular expressions. A peer is started for each file in that folder and the
7476regular expressions in the corresponding file are announced by this peer.
7477
7478The @code{search-strings-file} is a text file containing search strings, one in
7479each line.
7480
7481You can create regular expressions and search strings for every AS in the@
7482Internet using the attached scripts. You need one of the
7483@uref{http://data.caida.org/datasets/routing/routeviews-prefix2as/, CAIDA
7484routeviews prefix2as} data files for this. Run @code{create_regex.py <filename>
7485<output path>} to create the regular expressions and @code{create_strings.py
7486<input path> <outfile>} to create a search strings file from the previously
7487created regular expressions.
diff --git a/doc/chapters/installation.texi b/doc/chapters/installation.texi
deleted file mode 100644
index 14c10d2b0..000000000
--- a/doc/chapters/installation.texi
+++ /dev/null
@@ -1,3625 +0,0 @@
1@node GNUnet Installation Handbook
2@chapter GNUnet Installation Handbook
3
4This handbook describes how to install (build setup, compilation) and setup
5(configuration, start) GNUnet 0.10.x. After following these instructions you
6should be able to install and then start user-interfaces to interact with the
7network.
8
9This manual is far from complete, and we welcome informed contributions, be it
10in the form of new chapters or insightful comments.
11
12
13
14@menu
15* Dependencies::
16* Pre-installation notes::
17* Generic installation instructions::
18* Build instructions for Ubuntu 12.04 using Git::
19* Build Instructions for Microsoft Windows Platforms::
20* Build instructions for Debian 7.5::
21* Installing GNUnet from Git on Ubuntu 14.4::
22* Build instructions for Debian 8::
23* Outdated build instructions for previous revisions::
24* Portable GNUnet::
25* The graphical configuration interface::
26* How to start and stop a GNUnet peer::
27@end menu
28
29@node Dependencies
30@section Dependencies
31@c %**end of header
32
33This document lists the various known dependencies for GNUnet 0.10.x.
34Suggestions for missing dependencies or wrong version numbers are welcome.
35
36
37
38@menu
39* External dependencies::
40* Fixing libgnurl build issues::
41* Internal dependencies::
42@end menu
43
44@node External dependencies
45@subsection External dependencies
46@c %**end of header
47
48These packages must be installed before a typical GNUnet installation
49can be performed:
50
51@table @asis
52@item GNU libmicrohttpd 0.9.30 or higher
53@item GNU libextractor 1.0 or higher
54@item GNU libtool 2.2 or higher
55@item GNU libunistring 0.9.1.1 or higher
56@item GNU libidn 1.0.0 or higher
57@item @uref{https://gnupg.org/software/libgcrypt/index.html, GNU libgcrypt}
58@uref{https://gnupg.org/ftp/gcrypt/libgcrypt/, 1.6.0} or higher
59@item @uref{https://gnutls.org/, GnuTLS}
60@uref{https://www.gnupg.org/ftp/gcrypt/gnutls/v3.2/, 3.2.7} or higher,
61compile with libunbound for DANE support; GnuTLS also requires GNU
62nettle 2.7 (update: GnuTLS 3.2.7 appears NOT to work against GNU nettle
63> 2.7, due to some API updatings done by nettle. Thus it should be compiled
64against nettle 2.7 and, in case you get some error on the reference to
65`rpl_strerror' being undefined, follow the instructions on@
66@uref{http://lists.gnupg.org/pipermail/gnutls-devel/2013-November/006588.html, this}
67post (and the link inside it)).
68@item @uref{https://gnunet.org/gnurl, gnURL} libgnurl 7.34.0 or higher,
69must be compiled after @code{GnuTLS}
70@item libglpk 4.45 or higher
71@item @uref{http://www.openssl.org/, OpenSSL} (binary) 1.0 or higher
72@item TeX Live 2012 or higher, optional (for gnunet-bcd)
73@item libpulse 2.0 or higher, optional (for gnunet-conversation)
74@item libopus 1.0.1 or higher, optional (for gnunet-conversation)
75@item libogg 1.3.0 or higher, optional (for gnunet-conversation)
76@item certool (binary)
77optional for convenient installation of the GNS proxy
78(available as part of Debian's libnss3-tools)
79@item python-zbar 0.10 or higher, optional (for gnunet-qr)
80@item libsqlite 3.8.0 or higher (note that the code will compile and often work with lower
81version numbers, but you may get subtle bugs with respect to quota management
82in certain rare cases); alternatively, MySQL or Postgres can also be installed,
83but those databases will require more complex configurations (not recommended
84for first-time users)
85@item zlib any version we tested worked
86@item Gtk+ 3.0 or higher, optional (for gnunet-gtk)
87@item libgladeui must match Gtk+ version, optional (for gnunet-gtk)
88@item libqrencode 3.0 or higher, optional (for gnunet-namestore-gtk)
89@end table
90
91
92@node Fixing libgnurl build issues
93@subsection Fixing libgnurl build issues
94
95If you have to compile libgnurl from source since the version included in your
96distribution is to old you perhaps get an error message while running the
97@file{configure} script:
98
99@code{@
100 $ configure@
101 ...@
102 checking for 64-bit curl_off_t data type... unknown@
103 checking for 32-bit curl_off_t data type... unknown@
104 checking for 16-bit curl_off_t data type... unknown@
105 configure: error: cannot find data type for curl_off_t.@
106}
107
108Solution:
109
110Before running the configure script, set:
111
112@code{CFLAGS="-I. -I$BUILD_ROOT/include" }
113
114
115
116@node Internal dependencies
117@subsection Internal dependencies
118
119This section tries to give an overview of what processes a typical GNUnet peer
120running a particular application would consist of. All of the processes listed
121here should be automatically started by @code{gnunet-arm -s}. The list is given
122as a rough first guide to users for failure diagnostics. Ideally, end-users
123should never have to worry about these internal dependencies.
124
125In terms of internal dependencies, a minimum file-sharing system consists of
126the following GNUnet processes (in order of dependency):
127
128@itemize @bullet
129@item gnunet-service-arm
130@item gnunet-service-resolver (required by all)
131@item gnunet-service-statistics (required by all)
132@item gnunet-service-peerinfo
133@item gnunet-service-transport (requires peerinfo)
134@item gnunet-service-core (requires transport)
135@item gnunet-daemon-hostlist (requires core)
136@item gnunet-daemon-topology (requires hostlist, peerinfo)
137@item gnunet-service-datastore
138@item gnunet-service-dht (requires core)
139@item gnunet-service-identity
140@item gnunet-service-fs (requires identity, mesh, dht, datastore, core)
141@end itemize
142
143
144A minimum VPN system consists of the following GNUnet processes (in order of
145dependency):
146
147@itemize @bullet
148@item gnunet-service-arm
149@item gnunet-service-resolver (required by all)
150@item gnunet-service-statistics (required by all)
151@item gnunet-service-peerinfo
152@item gnunet-service-transport (requires peerinfo)
153@item gnunet-service-core (requires transport)
154@item gnunet-daemon-hostlist (requires core)
155@item gnunet-service-dht (requires core)
156@item gnunet-service-mesh (requires dht, core)
157@item gnunet-service-dns (requires dht)
158@item gnunet-service-regex (requires dht)
159@item gnunet-service-vpn (requires regex, dns, mesh, dht)
160@end itemize
161
162
163A minimum GNS system consists of the following GNUnet processes (in order of
164dependency):
165@itemize @bullet
166@item gnunet-service-arm
167@item gnunet-service-resolver (required by all)
168@item gnunet-service-statistics (required by all)
169@item gnunet-service-peerinfo
170@item gnunet-service-transport (requires peerinfo)
171@item gnunet-service-core (requires transport)
172@item gnunet-daemon-hostlist (requires core)
173@item gnunet-service-dht (requires core)
174@item gnunet-service-mesh (requires dht, core)
175@item gnunet-service-dns (requires dht)
176@item gnunet-service-regex (requires dht)
177@item gnunet-service-vpn (requires regex, dns, mesh, dht)
178@item gnunet-service-identity
179@item gnunet-service-namestore (requires identity)
180@item gnunet-service-gns (requires vpn, dns, dht, namestore, identity)
181@end itemize
182
183@node Pre-installation notes
184@section Pre-installation notes
185
186Please note that in the code instructions for the installation,
187@emph{#} indicates commands run as privileged root user and
188@emph{$} shows commands run as unprivileged ("normal") system user.
189
190
191@node Generic installation instructions
192@section Generic installation instructions
193
194First, in addition to the GNUnet sources you must download the latest version
195of various dependencies. Most distributions do not include sufficiently recent
196versions of these dependencies. Thus, a typically installation on a "modern"
197GNU/Linux distribution requires you to install the following
198dependencies (ideally in this order):
199
200@itemize @bullet
201@item libgpgerror and libgcrypt
202@item libnettle and libunbound (possibly from distribution), GnuTLS
203@item libgnurl (read the README)
204@item GNU libmicrohttpd
205@item GNU libextractor (make sure to first install the various mandatory and optional
206dependencies including development headers from your distribution)
207@end itemize
208
209Other dependencies that you should strongly consider to install is a
210database (MySQL, sqlite or Postgres). The following instructions will assume
211that you installed at least sqlite. For most distributions you should be able
212to find pre-build packages for the database. Again, make sure to install the
213client libraries and the respective development headers (if they are
214packaged separately) as well.
215
216You can find specific, detailed instructions for installing of the dependencies
217(and possibly the rest of the GNUnet installation) in the platform-specific
218descriptions, which are linked from the bottom of this page. Please consult
219them now. If your distribution is not listed, please study the instructions for
220Debian stable carefully as you try to install the dependencies for your own
221distribution. Contributing additional instructions for further platforms is
222always appreciated.
223
224Before proceeding further, please double-check the dependency list. Note that
225in addition to satisfying the dependencies, you might have to make sure that
226development headers for the various libraries are also installed. There maybe
227files for other distributions, or you might be able to find equivalent packages
228for your distribution.
229
230While it is possible to build and install GNUnet without having root access,
231we will assume that you have full control over your system in these
232instructions. First, you should create a system user @emph{gnunet} and an additional
233group @emph{gnunetdns}. On Debian and Ubuntu GNU/Linux, type:@
234@code{@
235 # adduser --system --home /var/lib/gnunet --group --disabled-password gnunet@
236 # addgroup --system gnunetdns@
237}@
238 On other Unixes, this should have the same effect:@
239@code{@
240 # useradd --system --groups gnunet --home-dir /var/lib/gnunet@
241 # addgroup --system gnunetdns@
242}@
243 Now compile and install GNUnet using:@
244@code{@
245 $ tar xvf gnunet-0.10.?.tar.gz@
246 $ cd gnunet-0.10.?@
247 $ ./configure --with-sudo=sudo --with-nssdir=/lib@
248 $ make@
249 $ sudo make install@
250}@
251
252If you want to be able to enable DEBUG-level log messages, add
253@code{--enable-logging=verbose} to the end of the @code{./configure} command.
254DEBUG-level log messages are in English-only and should only be useful for
255developers (or for filing really detailed bug reports).
256
257Finally, you probably want to compile @code{gnunet-gtk}, which includes gnunet-setup
258(graphical tool for configuration) and @code{gnunet-fs-gtk} (graphical tool for
259file-sharing):@
260
261@code{@
262 $ tar xvf gnunet-gtk-0.10.?.tar.gz@
263 $ cd gnunet-gtk-0.10.?@
264 $ ./configure --with-gnunet=/usr/local/@
265 $ make@
266 $ sudo make install@
267 $ cd ..@
268 $ sudo ldconfig # just to be safe@
269}@
270 Next, edit the file @file{/etc/gnunet.conf} to contain the following:@
271@code{@
272 [arm]@
273 SYSTEM_ONLY = YES@
274 USER_ONLY = NO@
275}@
276You may need to update your ld.so cache to include files installed in
277@file{/usr/local/lib}:@
278
279@code{@
280 # ldconfig@
281}@
282
283Then, switch from user root to user gnunet to start the peer:@
284
285@code{@
286 # su -s /bin/sh - gnunet@
287 $ gnunet-arm -c /etc/gnunet.conf -s@
288}@
289
290You may also want to add the last line in the gnunet users @file{crontab}
291prefixed with @code{@@reboot} so that it is executed whenever the system is
292booted:@
293
294@code{@
295 @@reboot /usr/local/bin/gnunet-arm -c /etc/gnunet.conf -s@
296}@
297
298This will only start the system-wide GNUnet services. Type exit to get back
299your root shell. Now, you need to configure the per-user part. For each
300$USER on the system, run:@
301
302@code{@
303 # adduser $USER gnunet@
304}@
305
306to allow them to access the system-wide GNUnet services. Then, each user should
307create a configuration file @file{~/.config/gnunet.conf} with the lines:@
308
309@code{@
310 [arm]@
311 SYSTEM_ONLY = NO@
312 USER_ONLY = YES@
313 DEFAULTSERVICES = gns@
314}@
315
316and start the per-user services using@
317
318@code{@
319 $ gnunet-arm -c ~/.config/gnunet.conf -s@
320}@
321
322Again, adding a @code{crontab} entry to autostart the peer is advised:@
323@code{@
324@@reboot /usr/local/bin/gnunet-arm -c $HOME/.config/gnunet.conf -s@
325}@
326
327Note that some GNUnet services (such as SOCKS5 proxies) may need a system-wide
328TCP port for each user. For those services, systems with more than one user may
329require each user to specify a different port number in their personal
330configuration file.
331
332Finally, the user should perform the basic initial setup for the GNU Name
333System. This is done by running two commands:@
334
335@example
336$ gnunet-gns-import.sh@
337$ gnunet-gns-proxy-setup-ca@
338@end example
339
340The first generates the default zones, wheras the second setups the GNS
341Certificate Authority with the user's browser. Now, to actiave GNS in the
342normal DNS resolution process, you need to edit your @file{/etc/nsswitch.conf}
343where you should find a line like this:
344@example
345hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
346@end example
347
348
349The exact details may differ a bit, which is fine. Add the text
350@emph{"gns [NOTFOUND=return]"} after @emph{"files"}:
351@example
352hosts: files gns [NOTFOUND=return] mdns4_minimal [NOTFOUND=return] dns mdns4
353@end example
354
355
356You might want to make sure that @file{/lib/libnss_gns.so.2} exists on your
357system, it should have been created during the installation.
358
359
360
361@node Build instructions for Ubuntu 12.04 using Git
362@section Build instructions for Ubuntu 12.04 using Git
363
364
365@menu
366* Install the required build tools::
367* Install libgcrypt 1.6 and libgpg-error::
368* Install gnutls with DANE support::
369* Install libgnurl::
370* Install libmicrohttpd from Git::
371* Install libextractor from Git::
372* Install GNUnet dependencies::
373* Build GNUnet::
374* Install the GNUnet-gtk user interface from Git::
375@end menu
376
377@node Install the required build tools
378@subsection Install the required build tools
379
380First, make sure Git is installed on your system:@
381
382$ sudo apt-get install git@
383
384Install the essential buildtools:@
385
386$ sudo apt-get install automake autopoint autoconf libtool
387
388@node Install libgcrypt 1.6 and libgpg-error
389@subsection Install libgcrypt 1.6 and libgpg-error
390
391$ wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.12.tar.bz2@
392$ tar xf libgpg-error-1.12.tar.bz2@
393$ cd libgpg-error-1.12@
394$ ./configure@
395$ sudo make install@
396$ cd ..@
397
398@node Install gnutls with DANE support
399@subsection Install gnutls with DANE support
400
401@example
402$ wget http://www.lysator.liu.se/~nisse/archive/nettle-2.7.1.tar.gz@
403$ tar xf nettle-2.7.1.tar.gz@
404$ cd nettle-2.7.1@
405$ ./configure@
406$ sudo make install@
407$ cd ..
408@end example
409
410@example
411$ wget https://www.nlnetlabs.nl/downloads/ldns/ldns-1.6.16.tar.gz@
412$ tar xf ldns-1.6.16.tar.gz@
413$ cd ldns-1.6.16@
414$ ./configure@
415$ sudo make install@
416$ cd ..
417@end example
418
419@example
420$ wget https://unbound.net/downloads/unbound-1.4.21.tar.gz@
421$ tar xf unbound-1.4.21.tar.gz@
422$ cd unbound-1.4.21@
423$ ./configure@
424$ sudo make install@
425$ cd ..
426@end example
427
428@example
429$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.17.tar.xz@
430$ tar xf gnutls-3.1.17.tar.xz@
431$ cd gnutls-3.1.17@
432$ ./configure@
433$ sudo make install@
434$ cd ..
435@end example
436
437@example
438$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.0.tar.bz2@
439$ tar xf libgcrypt-1.6.0.tar.bz2@
440$ cd libgcrypt-1.6.0@
441$ ./configure@
442$ sudo make install@
443$ cd ..@
444@end example
445
446@node Install libgnurl
447@subsection Install libgnurl
448
449@example
450$ wget https://gnunet.org/sites/default/files/gnurl-7.34.0.tar.bz2@
451$ tar xf gnurl-7.34.0.tar.bz2@
452$ cd gnurl-7.34.0@
453$ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
454 --without-libmetalink --without-winidn --without-librtmp \
455 --without-nghttp2 --without-nss --without-cyassl \
456 --without-polarssl --without-ssl --without-winssl \
457 --without-darwinssl --disable-sspi --disable-ntlm-wb \
458 --disable-ldap --disable-rtsp --disable-dict --disable-telnet \
459 --disable-tftp --disable-pop3 --disable-imap --disable-smtp \
460 --disable-gopher --disable-file --disable-ftp@
461$ sudo make install@
462$ cd ..@
463@end example
464
465@node Install libmicrohttpd from Git
466@subsection Install libmicrohttpd from Git
467
468@example
469$ git clone https://gnunet.org/git/libmicrohttpd@
470$ cd libmicrohttpd/@
471$ ./bootstrap@
472$ ./configure@
473$ sudo make install@
474$ cd ..@
475@end example
476
477@node Install libextractor from Git
478@subsection Install libextractor from Git
479
480Install libextractor dependencies:@
481
482@example
483$ sudo apt-get install zlib1g-dev libgsf-1-dev libmpeg2-4-dev libpoppler-dev \
484 libvorbis-dev libexiv2-dev libjpeg-dev libtiff-dev libgif-dev libvorbis-dev \
485 libflac-dev libsmf-dev g++@
486@end example
487
488Build libextractor:@
489
490@example
491$ git clone https://gnunet.org/git/libextractor@
492$ cd libextractor@
493$ ./bootstrap@
494$ ./configure@
495$ sudo make install@
496$ cd ..@
497@end example
498
499@node Install GNUnet dependencies
500@subsection Install GNUnet dependencies
501
502@example
503$ sudo apt-get install libidn11-dev libunistring-dev libglpk-dev \
504 libpulse-dev libbluetooth-dev libsqlite-dev@
505@end example
506
507Install libopus@
508
509@example
510$ wget http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz@
511$ tar xf opus-1.1.tar.gz@
512$ cd opus-1.1/@
513$ ./configure@
514$ sudo make install@
515@end example
516
517Choose one or more database backends@
518
519@itemize @bullet
520
521@item
522SQLite3 @code{$ sudo apt-get install libsqlite3-dev}
523
524@item
525MySQL @code{$ sudo apt-get install libmysqlclient-dev}
526
527@item
528PostgreSQL @code{$ sudo apt-get install libpq-dev postgresql}
529
530@end itemize
531
532
533
534@node Build GNUnet
535@subsection Build GNUnet
536
537
538
539@menu
540* Configuring the installation path::
541* Configuring the system::
542* Installing components requiring sudo permission::
543* Build::
544@end menu
545
546@node Configuring the installation path
547@subsubsection Configuring the installation path
548
549You can specify the location of the GNUnet installation by setting the prefix
550when calling the configure script:@code{ --prefix=DIRECTORY}
551
552@code{@
553 $ export PATH=$PATH:DIRECTORY/bin@
554}
555
556@node Configuring the system
557@subsubsection Configuring the system
558
559Please make sure NOW that you have created a user and group 'gnunet'@
560and additionally a group 'gnunetdns':@
561@code{@
562 $ sudo addgroup gnunet@
563 $ sudo addgroup gnunetdns@
564 $ sudo adduser gnunet@
565}
566
567Each GNUnet user should be added to the 'gnunet' group (may@
568require fresh login to come into effect):
569@code{@
570 $ sudo useradd -G gnunet@
571}
572
573@node Installing components requiring sudo permission
574@subsubsection Installing components requiring sudo permission
575
576Some components, like the nss plugin required for GNS, may require root
577permissions. To allow these few components to be installed use:@
578@code{@
579 $ ./configure --with-sudo}
580
581@node Build
582@subsubsection Build
583
584
585@code{@
586 $ git clone https://gnunet.org/git/gnunet/@
587 $ cd gnunet/@
588 $ ./bootstrap@
589}
590Use the required configure call including the optional installation prefix
591PREFIX or the sudo permissions@
592@code{$ ./configure [ --with-sudo | --with-prefix=PREFIX ]}@
593@code{$ make; sudo make install}
594
595After installing it, you need to create an empty configuration file:@
596@code{mkdir ~/.gnunet; touch ~/.gnunet/gnunet.conf}
597
598And finally you can start GNUnet with@
599@code{$ gnunet-arm -s}
600
601@node Install the GNUnet-gtk user interface from Git
602@subsection Install the GNUnet-gtk user interface from Git
603
604
605Install depencies:@
606@code{$ sudo apt-get install libgtk-3-dev libunique-3.0-dev libgladeui-dev libqrencode-dev}
607
608To build GNUnet (with an optional prefix)and execute:@
609@code{@
610 $ git clone https://gnunet.org/git/gnunet-gtk/@
611 $ cd gnunet-gtk/@
612 $ ./bootstrap@
613 $ ./configure [--prefix=PREFIX] --with-gnunet=DIRECTORY@
614 $ make; sudo make install@
615}
616
617@node Build Instructions for Microsoft Windows Platforms
618@section Build Instructions for Microsoft Windows Platforms
619
620
621
622@menu
623* Introduction to building on MS Windows::
624* Requirements::
625* Dependencies & Initial Setup::
626* GNUnet Installation::
627* Adjusting Windows for running and testing GNUnet::
628* Building the GNUnet Installer::
629* Using GNUnet with Netbeans on Windows::
630@end menu
631
632@node Introduction to building on MS Windows
633@subsection Introduction to building on MS Windows
634
635
636This document is a guide to building GNUnet and its dependencies on Windows
637platforms. GNUnet development is mostly done under Linux and especially SVN
638checkouts may not build out of the box. We regret any inconvenience, and if you
639have problems, please report them.
640
641@node Requirements
642@subsection Requirements
643
644The Howto is based upon a @strong{Windows Server 2008 32bit@strong{
645Installation, @strong{sbuild} and thus a @uref{http://www.mingw.org/wiki/MSYS,
646MSYS+MinGW} (W32-GCC-Compiler-Suite + Unix-like Userland) installation. sbuild
647is a convenient set of scripts which creates a working msys/mingw installation
648and installs most dependencies required for GNUnet. }}
649
650As of the point of the creation of this Howto, GNUnet @strong{requires} a
651Windows @strong{Server} 2003 or newer for full feature support. Windows Vista
652and later will also work, but
653@strong{non-server version can not run a VPN-Exit-Node} as the NAT features
654have been removed as of Windows Vista.
655
656@node Dependencies & Initial Setup
657@subsection Dependencies & Initial Setup
658
659
660@itemize @bullet
661
662@item
663Install a fresh version of @strong{Python 2.x}, even if you are using a x64-OS,
664install a 32-bit version for use with sbuild. Python 3.0 currently is
665incompatible.
666
667@item
668Install your favorite @uref{http://code.google.com/p/tortoisegit/, GIT} &
669@uref{http://tortoisesvn.net/, SVN}-clients.
670
671@item
672You will also need some archive-manager like @uref{http://www.7-zip.org/, 7zip}.
673
674@item
675Pull a copy of sbuild to a directory of your choice, which will be used in the
676remainder of this guide. For now, we will use @file{c:\gnunet\sbuild\}
677
678@item
679in @file{sbuild\src\mingw\mingw32-buildall.sh}, comment out the packages
680@strong{gnunet-svn} and @strong{gnunet-gtk-svn}, as we don't want sbuild to
681compile/install those for us.
682
683@item
684Follow LRN's sbuild installation instructions.-
685@end itemize
686
687Please note that sbuild may (or will most likely) fail during installation,
688thus you really HAVE to @strong{check the logfiles} created during the
689installation process. Certain packages may fail to build initially due to
690missing dependencies, thus you may have to
691@strong{substitute those with binary-versions initially}. Later on once
692dependencies are satisfied you can re-build the newer package versions.
693
694@strong{It is normal that you may have to repeat this step multiple times and
695there is no uniform way to fix all compile-time issues, as the build-process
696of many of the dependencies installed are rather unstable on win32 and certain
697releases may not even compile at all.}
698
699Most dependencies for GNUnet have been set up by sbuild, thus we now should add
700the @file{bin/} directories in your new msys and mingw installations to PATH.
701You will want to create a backup of your finished msys-environment by now.
702
703@node GNUnet Installation
704@subsection GNUnet Installation
705
706First, we need to launch our msys-shell, you can do this via
707
708@file{C:\gnunet\sbuild\msys\msys.bat}
709
710You might wish to take a look at this file and adjust some login-parameters to
711your msys environment.
712
713Also, sbuild added two pointpoints to your msys-environment, though those
714might remain invisible:
715
716@itemize @bullet
717
718@item
719/mingw, which will mount your mingw-directory from sbuild/mingw and the other one is
720
721@item
722/src which contains all the installation sources sbuild just compiled.
723@end itemize
724
725Check out the current gnunet-sources (svn-head) from the gnunet-repository,
726we will do this in your home directory:
727
728@code{svn checkout https://gnunet.org/svn/gnunet/ ~/gnunet}
729
730Now, we will first need to bootstrap the checked out installation and then
731configure it accordingly.
732
733@example
734cd ~/gnunet@
735./bootstrap@
736STRIP=true CPPFLAGS="-DUSE_IPV6=1 -DW32_VEH" CFLAGS="$CFLAGS -g -O2" ./configure --prefix=/ --docdir=/share/doc/gnunet --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --with-libcurl=/mingw --with-extractor=/mingw --with-sqlite=/mingw --with-microhttpd=/mingw --with-plibc=/mingw --enable-benchmarks --enable-expensivetests --enable-experimental --with-qrencode=/mingw --enable-silent-rules --enable-experimental 2>&1 | tee -a ./configure.log
737@end example
738
739The parameters above will configure for a reasonable gnunet installation to the
740your msys-root directory. Depending on which features your would like to build
741or you may need to specify additional dependencies. Sbuild installed most libs
742into the /mingw subdirectory, so remember to prefix library locations with
743this path.
744
745Like on a unixoid system, you might want to use your home directory as prefix
746for your own gnunet installation for development, without tainting the
747buildenvironment. Just change the "prefix" parameter to point towards
748~/ in this case.
749
750Now it's time to compile gnunet as usual. Though this will take some time, so
751you may fetch yourself a coffee or some Mate now...
752
753@example
754make@
755make install
756@end example
757
758@node Adjusting Windows for running and testing GNUnet
759@subsection Adjusting Windows for running and testing GNUnet
760
761Assuming the build succeeded and you
762@strong{added the bin directory of your gnunet to PATH}, you can now use your
763gnunet-installation as usual. Remember that UAC or the windows firewall may
764popup initially, blocking further execution of gnunet until you acknowledge
765them (duh!).
766
767You will also have to take the usual steps to get p2p software running properly
768(port forwarding, ...), and gnunet will require administrative permissions as
769it may even install a device-driver (in case you are using gnunet-vpn and/or
770gnunet-exit).
771
772@node Building the GNUnet Installer
773@subsection Building the GNUnet Installer
774
775The GNUnet installer is made with @uref{http://nsis.sourceforge.net/, NSIS}@
776The installer script is located in @file{contrib\win} in the GNUnet source tree.
777
778@node Using GNUnet with Netbeans on Windows
779@subsection Using GNUnet with Netbeans on Windows
780
781TODO
782
783@node Build instructions for Debian 7.5
784@section Build instructions for Debian 7.5
785
786
787These are the installation instructions for Debian 7.5. They were tested using
788a minimal, fresh Debian 7.5 AMD64 installation without non-free software
789(no contrib or non-free). By "minimal", we mean that during installation, we
790did not select any desktop environment, servers or system utilities during the
791"tasksel" step. Note that the packages and the dependencies that we will
792install during this chapter take about 1.5 GB of disk space. Combined with
793GNUnet and space for objects during compilation, you should not even attempt
794this unless you have about 2.5 GB free after the minimal Debian installation.
795Using these instructions to build a VM image is likely to require a minimum of
7964-5 GB for the VM (as you will likely also want a desktop manager).
797
798GNUnet's security model assumes that your @file{/home} directory is encrypted.
799Thus, if possible, you should encrypt your home partition
800(or per-user home directory).
801
802Naturally, the exact details of the starting state for your installation
803should not matter much. For example, if you selected any of those installation
804groups you might simply already have some of the necessary packages installed.
805We did this for testing, as this way we are less likely to forget to mention a
806required package. Note that we will not install a desktop environment, but of
807course you will need to install one to use GNUnet's graphical user interfaces.
808Thus, it is suggested that you simply install the desktop environment of your
809choice before beginning with the instructions.
810
811
812
813@menu
814* Update::
815* Stable? Hah!::
816* Update again::
817* Installing packages::
818* Installing dependencies from source::
819* Installing GNUnet from source::
820* But wait there is more!::
821@end menu
822
823@node Update
824@subsection Update
825
826After any installation, you should begin by running
827
828@example
829# apt-get update@
830# apt-get upgrade@
831@end example
832
833to ensure that all of your packages are up-to-date. Note that the "#" is used
834to indicate that you need to type in this command as "root"
835(or prefix with "sudo"), whereas "$" is used to indicate typing in a command
836as a normal user.
837
838@node Stable? Hah!
839@subsection Stable? Hah!
840
841Yes, we said we start with a Debian 7.5 "stable" system. However, to reduce the
842amount of compilation by hand, we will begin by allowing the installation of
843packages from the testing and unstable distributions as well. We will stick to
844"stable" packages where possible, but some packages will be taken from the
845other distributions. Start by modifying @file{/etc/apt/sources.list} to contain
846the following (possibly adjusted to point to your mirror of choice):
847@example
848# These were there before:
849deb http://ftp.de.debian.org/debian/ wheezy main
850deb-src http://ftp.de.debian.org/debian/ wheezy main
851deb http://security.debian.org/ wheezy/updates main
852deb-src http://security.debian.org/ wheezy/updates main
853deb http://ftp.de.debian.org/debian/ wheezy-updates main
854deb-src http://ftp.de.debian.org/debian/ wheezy-updates main
855
856# Add these lines (feel free to adjust the mirror):
857deb http://ftp.de.debian.org/debian/ testing main
858deb http://ftp.de.debian.org/debian/ unstable main
859@end example
860
861The next step is to create/edit your @file{/etc/apt/preferences} file to look
862like this:
863
864@example
865Package: *
866Pin: release a=stable,n=wheezy
867Pin-Priority: 700
868
869Package: *
870Pin: release o=Debian,a=testing
871Pin-Priority: 650
872
873Package: *
874Pin: release o=Debian,a=unstable
875Pin-Priority: 600
876@end example
877
878You can read more about Apt Preferences here and here. Note that other pinnings
879are likely to also work for GNUnet, the key thing is that you need some
880packages from unstable (as shown below). However, as unstable is unlikely to
881be comprehensive (missing packages) or might be problematic (crashing packages),
882you probably want others from stable and/or testing.
883
884@node Update again
885@subsection Update again
886
887Now, run again@
888
889@example
890# apt-get update@
891# apt-get upgrade@
892@end example
893
894to ensure that all your new distribution indices are downloaded, and that your
895pinning is correct: the upgrade step should cause no changes at all.
896
897@node Installing packages
898@subsection Installing packages
899
900We begin by installing a few Debian packages from stable:@
901
902@example
903# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
904 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev \
905 texlive libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev \
906 libbz2-dev libexiv2-dev libflac-dev libgif-dev libglib2.0-dev \
907 libgtk-3-dev libmagic-dev libjpeg8-dev libmpeg2-4-dev libmp4v2-dev \
908 librpm-dev libsmf-dev libtidy-dev libtiff5-dev libvorbis-dev \
909 libogg-dev zlib1g-dev g++ gettext libgsf-1-dev libunbound-dev \
910 libqrencode-dev libgladeui-dev nasm texlive-latex-extra \
911 libunique-3.0-dev gawk miniupnpc libfuse-dev libbluetooth-dev
912@end example
913
914After that, we install a few more packages from unstable:@
915
916@example
917# apt-get install -t unstable nettle-dev libgstreamer1.0-dev \
918 gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
919 libgstreamer-plugins-base1.0-dev
920@end example
921
922@node Installing dependencies from source
923@subsection Installing dependencies from source
924
925Next, we need to install a few dependencies from source. You might want to do
926this as a "normal" user and only run the @code{make install} steps as root
927(hence the @code{sudo} in the commands below). Also, you do this from any
928directory. We begin by downloading all dependencies, then extracting the
929sources, and finally compiling and installing the libraries:@
930
931@example
932 $ wget https://libav.org/releases/libav-9.10.tar.xz@
933 $ wget http://ftp.gnu.org/gnu/libextractor/libextractor-1.3.tar.gz@
934 $ wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.12.tar.bz2@
935 $ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.0.tar.bz2@
936 $ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.7.tar.xz@
937 $ wget http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.33.tar.gz@
938 $ wget https://gnunet.org/sites/default/files/gnurl-7.34.0.tar.bz2@
939 $ tar xvf libextractor-1.3.tar.gz@
940 $ tar xvf libgpg-error-1.12.tar.bz2@
941 $ tar xvf libgcrypt-1.6.0.tar.bz2@
942 $ tar xvf gnutls-3.2.7.tar.xz@
943 $ tar xvf libmicrohttpd-0.9.33.tar.gz@
944 $ tar xvf gnurl-7.34.0.tar.bz2@
945 $ cd libav-0.9 ; ./configure --enable-shared; make; sudo make install ; cd ..@
946 $ cd libextractor-1.3 ; ./configure; make ; sudo make install; cd ..@
947 $ cd libgpg-error-1.12; ./configure ; make ; sudo make install ; cd ..@
948 $ cd libgcrypt-1.6.0; ./configure --with-gpg-error-prefix=/usr/local; make ; sudo make install ; cd ..@
949 $ cd gnutls-3.2.7 ; ./configure ; make ; sudo make install ; cd ..@
950 $ cd libmicrohttpd-0.9.33; ./configure ; make ; sudo make install ; cd ..@
951 $ cd gnurl-7.34.0@
952 $ ./configure --enable-ipv6 --with-gnutls=/usr/local --without-libssh2 \
953 --without-libmetalink --without-winidn --without-librtmp --without-nghttp2 \
954 --without-nss --without-cyassl --without-polarssl --without-ssl \
955 --without-winssl --without-darwinssl --disable-sspi --disable-ntlm-wb \
956 --disable-ldap --disable-rtsp --disable-dict --disable-telnet --disable-tftp \
957 --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-file \
958 --disable-ftp@
959 $ make ; sudo make install; cd ..@
960@end example
961
962@node Installing GNUnet from source
963@subsection Installing GNUnet from source
964
965
966For this, simply follow the generic installation instructions from
967here.
968
969@node But wait there is more!
970@subsection But wait there is more!
971
972So far, we installed all of the packages and dependencies required to ensure
973that all of GNUnet would be built. However, while for example the plugins to
974interact with the MySQL or Postgres databases have been created, we did not
975actually install or configure those databases. Thus, you will need to install
976and configure those databases or stick with the default Sqlite database.
977Sqlite is usually fine for most applications, but MySQL can offer better
978performance and Postgres better resillience.
979
980
981@node Installing GNUnet from Git on Ubuntu 14.4
982@section Installing GNUnet from Git on Ubuntu 14.4
983
984@strong{Install the required build tools:}
985@code{@
986 $ sudo apt-get install git automake autopoint autoconf@
987}
988
989@strong{Install the required dependencies}
990@example
991$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
992 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
993 libmicrohttpd-dev libgnutls28-dev
994@end example
995
996@strong{Choose one or more database backends}@
997 SQLite3@
998@code{@
999 $ sudo apt-get install libsqlite3-dev@
1000}@
1001 MySQL@
1002@code{@
1003 $ sudo apt-get install libmysqlclient-dev@
1004}@
1005 PostgreSQL@
1006@code{@
1007 $ sudo apt-get install libpq-dev postgresql@
1008}
1009
1010@strong{Install the optional dependencies for gnunet-conversation:}@
1011@code{@
1012 $ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev@
1013}
1014
1015@strong{Install the libgrypt 1.6.1:}@
1016 For Ubuntu 14.04:@
1017@code{$ sudo apt-get install libgcrypt20-dev}@
1018 For Ubuntu older 14.04:@
1019@code{$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2@
1020 $ tar xf libgcrypt-1.6.1.tar.bz2@
1021 $ cd libgcrypt-1.6.1@
1022 $ ./configure@
1023 $ sudo make install@
1024 $ cd ..}@
1025@strong{Install libgnurl}@
1026@example
1027 $ wget https://gnunet.org/sites/default/files/gnurl-7.35.0.tar.bz2@
1028 $ tar xf gnurl-7.35.0.tar.bz2@
1029 $ cd gnurl-7.35.0@
1030 $ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
1031 --without-libmetalink --without-winidn --without-librtmp --without-nghttp2 \
1032 --without-nss --without-cyassl --without-polarssl --without-ssl \
1033 --without-winssl --without-darwinssl --disable-sspi --disable-ntlm-wb \
1034 --disable-ldap --disable-rtsp --disable-dict --disable-telnet --disable-tftp \
1035 --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-file \
1036 --disable-ftp
1037 $ sudo make install@
1038 $ cd ..@
1039@end example
1040
1041@strong{Install GNUnet}@
1042@code{@
1043 $ git clone https://gnunet.org/git/gnunet/@
1044 $ cd gnunet/@
1045 $ ./bootstrap@
1046}
1047
1048If you want to:
1049@itemize @bullet
1050
1051
1052@item
1053Install to a different directory:@
1054 --prefix=PREFIX
1055
1056@item
1057Have sudo permission, but do not want to compile as root:@
1058 --with-sudo
1059
1060@item
1061Want debug message enabled:@
1062 -- enable-logging=verbose
1063@end itemize
1064
1065
1066@code{@
1067 $ ./configure [ --with-sudo | --prefix=PREFIX | --- enable-logging=verbose]@
1068 $ make; sudo make install@
1069}
1070
1071After installing it, you need to create an empty configuration file:@
1072@code{touch ~/.config/gnunet.conf}
1073
1074And finally you can start GNUnet with@
1075@code{$ gnunet-arm -s}
1076
1077@node Build instructions for Debian 8
1078@section Build instructions for Debian 8
1079
1080These are the installation instructions for Debian 8. They were tested using a
1081fresh Debian 8 AMD64 installation without non-free software (no contrib or
1082non-free). During installation, I only selected "lxde" for the desktop
1083environment. Note that the packages and the dependencies that we will install
1084during this chapter take about 1.5 GB of disk space. Combined with GNUnet and
1085space for objects during compilation, you should not even attempt this unless
1086you have about 2.5 GB free after the Debian installation. Using these
1087instructions to build a VM image is likely to require a minimum of 4-5 GB for
1088the VM (as you will likely also want a desktop manager).
1089
1090GNUnet's security model assumes that your @code{/home} directory is encrypted.
1091Thus, if possible, you should encrypt your entire disk, or at least just your
1092home partition (or per-user home directory).
1093
1094Naturally, the exact details of the starting state for your installation should
1095not matter much. For example, if you selected any of those installation groups
1096you might simply already have some of the necessary packages installed. Thus,
1097it is suggested that you simply install the desktop environment of your choice
1098before beginning with the instructions.
1099
1100
1101@menu
1102* Update Debian::
1103* Installing Debian Packages::
1104* Installing Dependencies from Source2::
1105* Installing GNUnet from Source2::
1106* But wait (again) there is more!::
1107@end menu
1108
1109@node Update Debian
1110@subsection Update Debian
1111
1112After any installation, you should begin by running@
1113@code{@
1114 # apt-get update@
1115 # apt-get upgrade@
1116}@
1117to ensure that all of your packages are up-to-date. Note that the "#" is used
1118to indicate that you need to type in this command as "root" (or prefix with
1119"sudo"), whereas "$" is used to indicate typing in a command as a normal
1120user.
1121
1122@node Installing Debian Packages
1123@subsection Installing Debian Packages
1124
1125We begin by installing a few Debian packages from stable:@
1126@example
1127 # apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
1128 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev texlive \
1129 libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev libbz2-dev \
1130 libflac-dev libgif-dev libglib2.0-dev libgtk-3-dev libmpeg2-4-dev \
1131 libtidy-dev libvorbis-dev libogg-dev zlib1g-dev g++ gettext libgsf-1-dev \
1132 libunbound-dev libqrencode-dev libgladeui-dev nasm texlive-latex-extra \
1133 libunique-3.0-dev gawk miniupnpc libfuse-dev libbluetooth-dev \
1134 gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
1135 libgstreamer-plugins-base1.0-dev nettle-dev libextractor-dev libgcrypt20-dev \
1136 libmicrohttpd-dev
1137@end example
1138
1139@node Installing Dependencies from Source2
1140@subsection Installing Dependencies from Source2
1141
1142Yes, we said we start with a Debian 8 "stable" system, but because Debian
1143linked GnuTLS without support for DANE, we need to compile a few things, in
1144addition to GNUnet, still by hand. Yes, you can run GNUnet using the respective
1145Debian packages, but then you will not get DANE support.
1146
1147Next, we need to install a few dependencies from source. You might want to do
1148this as a "normal" user and only run the @code{make install} steps as root
1149(hence the @code{sudo} in the commands below). Also, you do this from any
1150directory. We begin by downloading all dependencies, then extracting the
1151sources, and finally compiling and installing the libraries:@
1152
1153@code{@
1154 $ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.12.tar.xz@
1155 $ wget https://gnunet.org/sites/default/files/gnurl-7.40.0.tar.bz2@
1156 $ tar xvf gnutls-3.3.12.tar.xz@
1157 $ tar xvf gnurl-7.40.0.tar.bz2@
1158 $ cd gnutls-3.3.12 ; ./configure ; make ; sudo make install ; cd ..@
1159 $ cd gnurl-7.40.0@
1160 $ ./configure --enable-ipv6 --with-gnutls=/usr/local --without-libssh2 \
1161 --without-libmetalink --without-winidn --without-librtmp --without-nghttp2 \
1162 --without-nss --without-cyassl --without-polarssl --without-ssl \
1163 --without-winssl --without-darwinssl --disable-sspi --disable-ntlm-wb \
1164 --disable-ldap --disable-rtsp --disable-dict --disable-telnet --disable-tftp \
1165 --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-file \
1166 --disable-ftp --disable-smb
1167 $ make ; sudo make install; cd ..@
1168}
1169
1170@node Installing GNUnet from Source2
1171@subsection Installing GNUnet from Source2
1172
1173For this, simply follow the generic installation instructions from@
1174here.
1175
1176@node But wait (again) there is more!
1177@subsection But wait (again) there is more!
1178
1179So far, we installed all of the packages and dependencies required to ensure
1180that all of GNUnet would be built. However, while for example the plugins to
1181interact with the MySQL or Postgres databases have been created, we did not
1182actually install or configure those databases. Thus, you will need to install
1183and configure those databases or stick with the default Sqlite database. Sqlite
1184is usually fine for most applications, but MySQL can offer better performance
1185and Postgres better resillience.
1186
1187@node Outdated build instructions for previous revisions
1188@section Outdated build instructions for previous revisions
1189
1190This chapter contains a collection of outdated, older installation guides. They
1191are mostly intended to serve as a starting point for writing up-to-date
1192instructions and should not be expected to work for GNUnet 0.10.x.
1193A set of older installation instructions can also be found in the
1194@file{doc/outdated-and-old-installation-instructions.txt} in the source
1195of GNUnet. This file covers old instructions which no longer receive
1196security updates or any kind of support.
1197
1198
1199@menu
1200* Installing GNUnet 0.10.1 on Ubuntu 14.04::
1201* Building GLPK for MinGW::
1202* GUI build instructions for Ubuntu 12.04 using Subversion::
1203* Installation with gnunet-update::
1204* Instructions for Microsoft Windows Platforms (Old)::
1205@end menu
1206
1207
1208@node Installing GNUnet 0.10.1 on Ubuntu 14.04
1209@subsection Installing GNUnet 0.10.1 on Ubuntu 14.04
1210
1211Install the required dependencies@
1212
1213@example
1214$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
1215 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
1216 libmicrohttpd-dev libgnutls28-dev
1217@end example
1218
1219Choose one or more database backends@
1220SQLite3@
1221@code{@
1222 $ sudo apt-get install libsqlite3-dev@
1223}@
1224MySQL@
1225@code{@
1226 $ sudo apt-get install libmysqlclient-dev@
1227}@
1228PostgreSQL@
1229@code{@
1230 $ sudo apt-get install libpq-dev postgresql@
1231}
1232
1233Install the optional dependencies for gnunet-conversation:@
1234@code{@
1235 $ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev@
1236}
1237
1238Install the libgrypt 1.6:@
1239For Ubuntu 14.04:@
1240@code{$ sudo apt-get install libgcrypt20-dev}@
1241For Ubuntu older 14.04:@
1242@code{$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2@
1243 $ tar xf libgcrypt-1.6.1.tar.bz2@
1244 $ cd libgcrypt-1.6.1@
1245 $ ./configure@
1246 $ sudo make install@
1247 $ cd ..}
1248
1249Install libgnurl@
1250@example
1251 $ wget https://gnunet.org/sites/default/files/gnurl-7.35.0.tar.bz2@
1252 $ tar xf gnurl-7.35.0.tar.bz2@
1253 $ cd gnurl-7.35.0@
1254 $ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
1255 --without-libmetalink --without-winidn --without-librtmp --without-nghttp2 \
1256 --without-nss --without-cyassl --without-polarssl --without-ssl \
1257 --without-winssl --without-darwinssl --disable-sspi --disable-ntlm-wb \
1258 --disable-ldap --disable-rtsp --disable-dict --disable-telnet --disable-tftp \
1259 --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-file \
1260 --disable-ftp@
1261 $ sudo make install@
1262 $ cd ..@
1263@end example
1264
1265Install GNUnet@
1266@code{@
1267 $ wget http://ftpmirror.gnu.org/gnunet/gnunet-0.10.1.tar.gz@
1268 $ tar xf gnunet-0.10.1.tar.gz@
1269 $ cd gnunet-0.10.1@
1270}
1271
1272If you want to:
1273@itemize @bullet
1274
1275@item
1276Install to a different directory:@
1277 --prefix=PREFIX
1278
1279@item
1280Have sudo permission, but do not want to compile as root:@
1281 --with-sudo
1282
1283@item
1284Want debug message enabled:@
1285 -- enable-logging=verbose
1286@end itemize
1287
1288@code{@
1289 $ ./configure [ --with-sudo | --prefix=PREFIX | --enable-logging=verbose]@
1290 $ make; sudo make install@
1291}
1292
1293After installing it, you need to create an empty configuration file:@
1294@code{touch ~/.config/gnunet.conf}
1295
1296And finally you can start GNUnet with@
1297@code{$ gnunet-arm -s}
1298
1299@node Building GLPK for MinGW
1300@subsection Building GLPK for MinGW
1301
1302GNUnet now requires the GNU Linear Programming Kit (GLPK). Since there's is no
1303package you can install with @code{mingw-get} you have to compile it from
1304source:
1305
1306@itemize @bullet
1307
1308@item
1309Download the latest version from http://ftp.gnu.org/gnu/glpk/
1310
1311@item
1312Unzip it using your favourite unzipper@
1313In the MSYS shell:
1314
1315@item
1316change to the respective directory
1317
1318@item
1319@code{./configure '--build=i686-pc-mingw32'}
1320
1321@item
1322run @code{make install check }
1323
1324MinGW does not automatically detect the correct buildtype so you have to
1325specify it manually
1326@end itemize
1327
1328
1329@node GUI build instructions for Ubuntu 12.04 using Subversion
1330@subsection GUI build instructions for Ubuntu 12.04 using Subversion
1331
1332After installing GNUnet you can continue installing the GNUnet GUI tools:
1333
1334First, install the required dependencies:
1335
1336@code{@
1337 $ sudo apt-get install libgladeui-dev libqrencode-dev@
1338}
1339
1340Please ensure that the GNUnet shared libraries can be found by the linker. If
1341you installed GNUnet libraries in a non standard path (say
1342GNUNET_PREFIX=/usr/local/lib/), you can
1343@itemize @bullet
1344
1345
1346@item
1347set the environmental variable permanently to@
1348@code{LD_LIBRARY_PATH=$GNUNET_PREFIX}
1349
1350@item
1351or add @code{$GNUNET_PREFIX} to @code{/etc/ld.so.conf}
1352@end itemize
1353
1354
1355Now you can checkout and compile the GNUnet GUI tools@
1356@code{@
1357 $ svn co https://gnunet.org/svn/gnunet-gtk@
1358 $ cd gnunet-gtk@
1359 $ ./bootstrap@
1360 $ ./configure --prefix=$GNUNET_PREFIX/.. --with-gnunet=$GNUNET_PREFIX/..@
1361 $ make install@
1362}
1363
1364@node Installation with gnunet-update
1365@subsection Installation with gnunet-update
1366
1367gnunet-update project is an effort to introduce updates to GNUnet
1368installations. An interesting to-be-implemented-feature of gnunet-update is
1369that these updates are propagated through GNUnet's peer-to-peer network. More
1370information about gnunet-update can be found at
1371https://gnunet.org/svn/gnunet-update/README.
1372
1373While the project is still under development, we have implemented the following
1374features which we believe may be helpful for users and we would like them to be
1375tested:
1376
1377@itemize @bullet
1378
1379@item
1380Packaging GNUnet installation along with its run-time dependencies into update
1381packages
1382
1383@item
1384Installing update packages into compatible hosts
1385
1386@item
1387Updating an existing installation (which had been installed by gnunet-update)
1388to a newer one
1389@end itemize
1390
1391The above said features of gnunet-update are currently available for testing on
1392GNU/Linux systems.
1393
1394The following is a guide to help you get started with gnunet-update. It shows
1395you how to install the testing binary packages of GNUnet 0.9.1 we have at
1396https://gnunet.org/install/
1397
1398gnunet-update needs the following:
1399
1400@itemize @bullet
1401@item
1402python ( 2.6 or above)
1403
1404@item
1405gnupg
1406
1407@item
1408python-gpgme
1409@end itemize
1410
1411
1412Checkout gnunet-update:@
1413@code{@
1414 $ svn checkout -r24905 https://gnunet.org/svn/gnunet-update@
1415}
1416
1417For security reasons, all packages released for gnunet-update from us are
1418signed with the key at https://gnunet.org/install/key.txt You would need to
1419import this key into your gpg key ring. gnunet-update uses this key to verify
1420the integrity of the packages it installs@
1421@code{@
1422 $ gpg --recv-keys 7C613D78@
1423}
1424
1425Download the packages relevant to your architecture (currently I have access to
1426GNU/Linux machines on x86_64 and i686, so only two for now, hopefully more
1427later) from https://gnunet.org/install/.
1428
1429To install the downloaded package into the directory /foo:
1430
1431@code{@
1432 gnunet-update/bin/gnunet-update install downloaded/package /foo@
1433}
1434
1435The installer reports the directories into which shared libraries and
1436dependencies have been installed. You may need to add the reported shared
1437library installation paths to LD_LIBRARY_PATH before you start running any
1438installed binaries.
1439
1440Please report bugs at https://gnunet.org/bugs/ under the project
1441'gnunet-update'.
1442
1443@node Instructions for Microsoft Windows Platforms (Old)
1444@subsection Instructions for Microsoft Windows Platforms (Old)
1445
1446This document is a DEPRECATED installation guide for gnunet on windows. It will
1447not work for recent gnunet versions, but maybe it will be of some use if
1448problems arise.
1449
1450 The Windows build uses a UNIX emulator for Windows,
1451 @uref{http://www.mingw.org/, MinGW}, to build the executable modules. These
1452 modules run natively on Windows and do not require additional emulation
1453 software besides the usual dependencies.
1454
1455 GNUnet development is mostly done under Linux and especially SVN checkouts may
1456 not build out of the box. We regret any inconvenience, and if you have
1457 problems, please report them.
1458
1459
1460
1461@menu
1462* Hardware and OS requirements::
1463* Software installation::
1464* Building libextractor and GNUnet::
1465* Installer::
1466* Source::
1467@end menu
1468
1469@node Hardware and OS requirements
1470@subsubsection Hardware and OS requirements
1471
1472@itemize @bullet
1473
1474@item
1475Pentium II or equivalent processor, 350 MHz or better
1476
1477@item
1478128 MB RAM
1479
1480@item
1481600 MB free disk space
1482
1483@item
1484Windows 2000 or Windows XP are recommended
1485@end itemize
1486
1487@node Software installation
1488@subsubsection Software installation
1489
1490@itemize @bullet
1491
1492@item
1493@strong{Compression software}@
1494@
1495 The software packages GNUnet depends on are usually compressed using UNIX
1496 tools like tar, gzip and bzip2.@ If you do not already have an utility that is
1497 able to extract such archives, get @uref{http://www.7-zip.org/, 7-Zip}.
1498
1499@item
1500@strong{UNIX environment}@
1501@
1502The MinGW project provides the compiler toolchain that is used to build
1503GNUnet.@ Get the following packages from
1504@uref{http://sourceforge.net/projects/mingw/files/, the MinGW project}:
1505@itemize @bullet
1506
1507
1508@item
1509GCC core
1510
1511@item
1512GCC g++
1513
1514@item
1515MSYS
1516
1517@item
1518MSYS Developer Tool Kit (msysDTK)
1519
1520@item
1521MSYS Developer Tool Kit - msys-autoconf (bin)
1522
1523@item
1524MSYS Developer Tool Kit - msys-automake (bin)
1525
1526@item
1527MinGW Runtime
1528
1529@item
1530MinGW Utilities
1531
1532@item
1533Windows API
1534
1535@item
1536Binutils
1537
1538@item
1539make
1540
1541@item
1542pdcurses
1543
1544@item
1545GDB (snapshot)
1546@end itemize
1547
1548@itemize @bullet
1549
1550
1551@item
1552Install MSYS (to c:\mingw, for example.)@
1553Do @strong{not} use spaces in the pathname (c:\program files\mingw).
1554
1555@item
1556Install MinGW runtime, utilities and GCC to a subdirectory (to c:\mingw\mingw,
1557for example)
1558
1559@item
1560Install the Development Kit to the MSYS directory (c:\mingw)
1561
1562@item
1563Create a batch file bash.bat in your MSYS directory with the files:@
1564
1565@example
1566bin\sh.exe --login
1567@end example
1568
1569
1570This batch file opens a shell which is used to invoke the build processes..@
1571MinGW's standard shell (msys.bat) is not suitable because it opens a separate
1572console window@ On Vista, bash.bat needs to be run as administrator.
1573
1574@item
1575Start bash.sh and rename (c:\mingw\mingw\)lib\libstdc++.la to avoid problems:@
1576
1577@example
1578mv /usr/mingw/lib/libstdc++.la /usr/mingw/lib/libstdc++.la.broken
1579@end example
1580
1581
1582@item
1583Unpack the Windows API to the MinGW directory (c:\mingw\mingw\) and remove the
1584declaration of DATADIR from (c:\mingw\mingw\)include\objidl.h (lines 55-58)
1585
1586@item
1587Unpack autoconf, automake to the MSYS directory (c:\mingw)
1588
1589@item
1590Install all other packages to the MinGW directory (c:\mingw\mingw\)
1591@end itemize
1592
1593
1594@item
1595@strong{GNU Libtool}@
1596@
1597GNU Libtool is required to use shared libraries.@
1598@
1599Get the prebuilt package from here and unpack it to the MinGW directory
1600(c:\mingw)
1601
1602@item
1603@strong{Pthreads}@
1604@
1605GNUnet uses the portable POSIX thread library for multi-threading..@
1606
1607@itemize @bullet
1608
1609
1610@item
1611Save @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/libpthreadGC2.a, libpthreadGC2.a} (x86) or @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/libpthreadGC2.a, libpthreadGC2.a} (x64) as libpthread.a into the lib directory (c:\mingw\mingw\lib\libpthread.a)
1612
1613@item
1614Save @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/pthreadGC2.dll, pthreadGC2.dll} (x86) or @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/pthreadGC2.dll, libpthreadGC2.a} (x64) into the MinGW bin directory (c:\mingw\mingw\bin)
1615
1616@item
1617Download all header files from @uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/, include/} to the include directory (c:\mingw\mingw\include)
1618@end itemize
1619
1620
1621@item
1622@strong{GNU MP@
1623}@
1624@
1625GNUnet uses the GNU Multiple Precision library for special cryptographic operations.@
1626@
1627Get the GMP binary package from the @uref{http://sourceforge.net/projects/mingwrep/, MinGW repository} and unpack it to the MinGW directory (c:\mingw\mingw)
1628
1629@item
1630@strong{GNU Gettext}@
1631@
1632 GNU gettext is used to provide national language support.@
1633@
1634 Get the prebuilt package from hereand unpack it to the MinGW directory (c:\mingw\mingw)
1635
1636@item
1637@strong{GNU iconv}@
1638@
1639 GNU Libiconv is used for character encoding conversion.@
1640@
1641 Get the prebuilt package from here and unpack it to the MinGW directory (c:\mingw\mingw)
1642
1643@item
1644@strong{SQLite}@
1645@
1646 GNUnet uses the SQLite database to store data.@
1647@
1648 Get the prebuilt binary from here and unpack it to your MinGW directory.
1649
1650@item
1651@strong{MySQL}@
1652@
1653 As an alternative to SQLite, GNUnet also supports MySQL.
1654@itemize @bullet
1655
1656
1657@item
1658 Get the binary installer from the @uref{http://dev.mysql.com/downloads/mysql/4.1.html#Windows, MySQL project} (version 4.1),@
1659 install it and follow the instructions in README.mysql.
1660
1661@item
1662 Create a temporary build directory (c:\mysql)
1663
1664@item
1665 Copy the directories include\ and lib\ from the MySQL directory to the new directory
1666
1667@item
1668 Get the patches from @uref{http://bugs.mysql.com/bug.php?id=8906&files=1, Bug #8906} and @uref{http://bugs.mysql.com/bug.php?id=8872&files=1, Bug #8872} (the latter is only required for MySQL
1669@example
1670patch -p 0
1671@end example
1672
1673
1674@item
1675 Move lib\opt\libmysql.dll to lib\libmysql.dll
1676
1677@item
1678 Change to lib\ and create an import library:@
1679
1680@example
1681dlltool --input-def ../include/libmySQL.def --dllname libmysql.dll
1682 --output-lib libmysqlclient.a -k
1683@end example
1684
1685
1686@item
1687 Copy include\* to include\mysql\
1688
1689@item
1690 Pass "--with-mysql=/c/mysql" to ./configure and copy libmysql.dll to your PATH or GNUnet's @file{bin} directory
1691@end itemize
1692
1693
1694@item
1695@strong{GTK+}@
1696@
1697 gnunet-gtk and libextractor depend on GTK.@
1698@
1699 Get the the binary and developer packages of atk, glib, gtk, iconv, gettext-runtime, pango from @uref{ftp://ftp.gtk.org/pub/gtk/v2.6/win32, gtk.org} and unpack it to the MinGW directory (c:\mingw\mingw)@
1700@
1701 Get @uref{http://www.gtk.org/download/win32.php, pkg-config} and libpng and unpack them to the MinGW directory (c:\mingw\mingw)@
1702@
1703 Here is an all-in-one package for @uref{http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip, gtk+dependencies}. Do not overwrite any existing files!
1704
1705@item
1706@strong{Glade}@
1707@
1708 gnunet-gtk and and gnunet-setup were created using this interface builder@
1709
1710@itemize @bullet
1711
1712
1713@item
1714 Get the Glade and libglade (-bin and -devel) packages (without GTK!) from @uref{http://gladewin32.sourceforge.net/, GladeWin32} and unpack it to the MinGW directory (c:\mingw\mingw)
1715
1716@item
1717 Get libxml from here and unpack it to the MinGW directory (c:\mingw\mingw).
1718@end itemize
1719
1720
1721@item
1722@strong{zLib}@
1723@
1724 libextractor requires zLib to decompress some file formats. GNUnet uses it to (de)compress meta-data.@
1725@
1726 Get zLib from here (Signature) and unpack it to the MinGW directory (c:\mingw\mingw)
1727
1728@item
1729@strong{Bzip2}@
1730@
1731 libextractor also requires Bzip2 to decompress some file formats.@
1732@
1733 Get Bzip2 (binary and developer package) from @uref{http://gnuwin32.sourceforge.net/packages/bzip2.htm, GnuWin32} and unpack it to the MinGW directory (c:\mingw\mingw)
1734
1735@item
1736@strong{Libgcrypt}@
1737@
1738 Libgcrypt provides the cryptographic functions used by GNUnet@
1739@
1740 Get Libgcrypt from @uref{ftp://ftp.gnupg.org/gcrypt/libgcrypt/, here}, compile and place it in the MinGW directory (c:\mingw\mingw). Currently you need at least version 1.4.2 to compile gnunet.
1741
1742@item
1743@strong{PlibC}@
1744@
1745 PlibC emulates Unix functions under Windows.@
1746@
1747 Get PlibC from here and unpack it to the MinGW directory (c:\mingw\mingw)
1748
1749@item
1750@strong{OGG Vorbis}@
1751@
1752 OGG Vorbis is used to extract meta-data from .ogg files@
1753@
1754 Get the packages @uref{http://www.gnunet.org/libextractor/download/win/libogg-1.1.4.zip, libogg} and @uref{http://www.gnunet.org/libextractor/download/win/libvorbis-1.2.3.zip, libvorbis} from the @uref{http://ftp.gnu.org/gnu/libextractor/libextractor-w32-1.0.0.zip, libextractor win32 build} and unpack them to the MinGW directory (c:\mingw\mingw)
1755
1756@item
1757@strong{Exiv2}@
1758@
1759 (lib)Exiv2 is used to extract meta-data from files with Exiv2 meta-data@
1760@
1761 Download @uref{http://www.gnunet.org/libextractor/download/win/exiv2-0.18.2.zip, Exiv2} and unpack it to the MSYS directory (c:\mingw)
1762@end itemize
1763
1764@node Building libextractor and GNUnet
1765@subsubsection Building libextractor and GNUnet
1766
1767Before you compile libextractor or GNUnet, be sure to set@
1768PKG_CONFIG_PATH:
1769@example
1770export PKG_CONFIG_PATH=/mingw/lib/pkgconfig
1771@end example
1772
1773
1774 See Installation for basic instructions on building libextractor and GNUnet.
1775
1776 By default, all modules that are created in this way contain debug information and are quite large.@
1777 To compile release versions (small and fast) set the variable CFLAGS:
1778@example
1779export CFLAGS='-O2 -march=pentium -fomit-frame-pointer'
1780./configure --prefix=$HOME --with-extractor=$HOME
1781@end example
1782
1783@node Installer
1784@subsubsection Installer
1785
1786 The GNUnet installer is made with @uref{http://nsis.sourceforge.net/, NSIS}@
1787 The installer script is located in contrib\win in the GNUnet source tree.
1788
1789@node Source
1790@subsubsection Source
1791
1792The sources of all dependencies are available here.
1793
1794@node Portable GNUnet
1795@section Portable GNUnet
1796
1797Quick instructions on how to use the most recent GNUnet on most GNU/Linux
1798distributions
1799
1800Currently this has only been tested on Ubuntu 12.04, 12.10, 13.04, Debian and
1801CentOS 6, but it should work on almost any GNU/Linux distribution. More
1802in-detail information can be found in the handbook.
1803
1804
1805
1806@menu
1807* Prerequisites::
1808* Download & set up gnunet-update::
1809* Install GNUnet::
1810@end menu
1811
1812@node Prerequisites
1813@subsection Prerequisites
1814
1815Open a terminal and paste this line into it to install all required tools
1816needed:@
1817@code{sudo apt-get install python-gpgme subversion}
1818
1819@node Download & set up gnunet-update
1820@subsection Download & set up gnunet-update
1821
1822The following command will download a working version of gnunet-update with the
1823subversion tool and import the public key which is needed for authentication:@
1824
1825@example
1826svn checkout -r24905 https://gnunet.org/svn/gnunet-update ~/gnunet-update &&
1827cd ~/gnunet-update
1828gpg --keyserver "hkp://keys.gnupg.net" --recv-keys 7C613D78
1829@end example
1830
1831@node Install GNUnet
1832@subsection Install GNUnet
1833
1834Download and install GNUnet binaries which can be found here and set library
1835paths:@
1836@code{@
1837 wget -P /tmp https://gnunet.org/install/packs/gnunet-0.9.4-`uname -m`.tgz@
1838 ./bin/gnunet-update install /tmp/gnunet-0.9*.tgz ~@
1839 echo "PATH DEFAULT=$@{PATH@}:$HOME/bin" >> ~/.pam_environment@
1840 echo -e "$@{HOME@}/lib\n$@{HOME@}/lib/gnunet-deps" | sudo tee /etc/ld.so.conf.d/gnunet.conf > /dev/null@
1841 sudo ldconfig@
1842}@
1843
1844You may need to re-login once after executing these last commands
1845
1846That's it, GNUnet is installed in your home directory now. GNUnet can be
1847configured and afterwards started by executing@
1848@code{gnunet-arm -s}
1849
1850@node The graphical configuration interface
1851@section The graphical configuration interface
1852
1853If you also would like to use gnunet-gtk and gnunet-setup (highly recommended
1854for beginners), do:
1855
1856@example
1857wget -P /tmp https://gnunet.org/install/packs/gnunet-0.9.4-gtk-0.9.4-`uname -m`.tgz@
1858sh ~/gnunet-update/bin/gnunet-update install /tmp/gnunet-*gtk*.tgz ~@
1859sudo ldconfig
1860@end example
1861Now you can run @code{gnunet-setup} for easy configuration of your GNUnet peer.
1862
1863
1864@menu
1865* Configuring your peer::
1866* Configuring the Friend-to-Friend (F2F) mode::
1867* Configuring the hostlist to bootstrap::
1868* Configuration of the HOSTLIST proxy settings::
1869* Configuring your peer to provide a hostlist ::
1870* Configuring the datastore::
1871* Configuring the MySQL database::
1872* Reasons for using MySQL::
1873* Reasons for not using MySQL::
1874* Setup Instructions::
1875* Testing::
1876* Performance Tuning::
1877* Setup for running Testcases::
1878* Configuring the Postgres database::
1879* Reasons to use Postgres::
1880* Reasons not to use Postgres::
1881* Manual setup instructions::
1882* Testing the setup manually::
1883* Configuring the datacache::
1884* Configuring the file-sharing service::
1885* Configuring logging::
1886* Configuring the transport service and plugins::
1887* Configuring the wlan transport plugin::
1888* Configuring HTTP(S) reverse proxy functionality using Apache or nginx::
1889* Blacklisting peers::
1890* Configuration of the HTTP and HTTPS transport plugins::
1891* Configuring the GNU Name System::
1892* Configuring the GNUnet VPN::
1893* Bandwidth Configuration::
1894* Configuring NAT::
1895* Peer configuration for distributions::
1896@end menu
1897
1898@node Configuring your peer
1899@subsection Configuring your peer
1900
1901This chapter will describe the various configuration options in GNUnet.
1902
1903The easiest way to configure your peer is to use the gnunet-setup tool.
1904gnunet-setup is part of the gnunet-gtk download. You might have to install it
1905separately.
1906
1907Many of the specific sections from this chapter actually are linked from within
1908gnunet-setup to help you while using the setup tool.
1909
1910While you can also configure your peer by editing the configuration file by
1911hand, this is not recommended for anyone except for developers.
1912
1913
1914
1915
1916
1917@node Configuring the Friend-to-Friend (F2F) mode
1918@subsection Configuring the Friend-to-Friend (F2F) mode
1919
1920GNUnet knows three basic modes of operation. In standard "peer-to-peer" mode,
1921your peer will connect to any peer. In the pure "friend-to-friend" mode, your
1922peer will ONLY connect to peers from a list of friends specified in the
1923configuration. Finally, in mixed mode, GNUnet will only connect to arbitrary
1924peers if it has at least a specified number of connections to friends.
1925
1926When configuring any of the F2F modes, you first need to create a file with the
1927peer identities of your friends. Ask your friends to run
1928
1929$ gnunet-peerinfo -sq
1930
1931The output of this command needs to be added to your friends file, which is
1932simply a plain text file with one line per friend with the output from the
1933above command.
1934
1935You then specify the location of your friends file in the "FRIENDS" option of
1936the "topology" section.
1937
1938Once you have created the friends file, you can tell GNUnet to only connect to
1939your friends by setting the "FRIENDS-ONLY" option (again in the "topology"
1940section) to YES.
1941
1942If you want to run in mixed-mode, set "FRIENDS-ONLY" to NO and configure a
1943minimum number of friends to have (before connecting to arbitrary peers) under
1944the "MINIMUM-FRIENDS" option.
1945
1946If you want to operate in normal P2P-only mode, simply set "MINIMUM-FRIENDS" to
1947zero and "FRIENDS_ONLY" to NO. This is the default.
1948
1949@node Configuring the hostlist to bootstrap
1950@subsection Configuring the hostlist to bootstrap
1951
1952After installing the software you need to get connected to the GNUnet network.
1953The configuration file included in your download is already configured to
1954connect you to the GNUnet network. In this section the relevant configuration
1955settings are explained.
1956
1957To get an initial connection to the GNUnet network and to get to know peers
1958already connected to the network you can use the so called bootstrap servers.
1959These servers can give you a list of peers connected to the network. To use
1960these bootstrap servers you have to configure the hostlist daemon to activate
1961bootstrapping.
1962
1963To activate bootstrapping edit your configuration file and edit the
1964@code{[hostlist]}-section. You have to set the argument "-b" in the options
1965line:
1966@example
1967[hostlist]
1968OPTIONS = -b
1969@end example
1970
1971Additionally you have to specify which server you want to use. The default
1972bootstrapping server is "@uref{http://v10.gnunet.org/hostlist,
1973http://v10.gnunet.org/hostlist}". [^] To set the server you have to edit the
1974line "SERVERS" in the hostlist section. To use the default server you should
1975set the lines to
1976@example
1977SERVERS = http://v10.gnunet.org/hostlist [^]
1978@end example
1979
1980
1981To use bootstrapping your configuration file should include these lines:
1982@example
1983[hostlist]
1984OPTIONS = -b
1985SERVERS = http://v10.gnunet.org/hostlist [^]
1986@end example
1987
1988
1989Besides using bootstrap servers you can configure your GNUnet peer to recieve
1990hostlist advertisements. Peers offering hostlists to other peers can send
1991advertisement messages to peers that connect to them. If you configure your
1992peer to receive these messages, your peer can download these lists and connect
1993to the peers included. These lists are persistent, which means that they are
1994saved to your hard disk regularly and are loaded during startup.
1995
1996To activate hostlist learning you have to add the "-e" switch to the OPTIONS
1997line in the hostlist section:
1998@example
1999[hostlist]
2000OPTIONS = -b -e
2001@end example
2002
2003
2004Furthermore you can specify in which file the lists are saved. To save the
2005lists in the file "hostlists.file" just add the line:
2006@example
2007HOSTLISTFILE = hostlists.file
2008@end example
2009
2010
2011Best practice is to activate both bootstrapping and hostlist learning. So your
2012configuration file should include these lines:
2013@example
2014[hostlist]
2015OPTIONS = -b -e
2016HTTPPORT = 8080
2017SERVERS = http://v10.gnunet.org/hostlist [^]
2018HOSTLISTFILE = $SERVICEHOME/hostlists.file
2019@end example
2020
2021@node Configuration of the HOSTLIST proxy settings
2022@subsection Configuration of the HOSTLIST proxy settings
2023
2024The hostlist client can be configured to use a proxy to connect to the hostlist
2025server. This functionality can be configured in the configuration file directly
2026or using the gnunet-setup tool.
2027
2028The hostlist client supports the following proxy types at the moment:
2029@itemize @bullet
2030
2031
2032@item
2033HTTP and HTTP 1.0 only proxy
2034
2035@item
2036SOCKS 4/4a/5/5 with hostname
2037@end itemize
2038
2039
2040In addition authentication at the proxy with username and password can be
2041configured.
2042
2043To configure proxy support for the hostlist client in the gnunet-setup tool,
2044select the "hostlist" tab and select the appropriate proxy type. The hostname
2045or IP address (including port if required) has to be entered in the "Proxy
2046hostname" textbox. If required, enter username and password in the "Proxy
2047username" and "Proxy password" boxes. Be aware that these information will be
2048stored in the configuration in plain text.
2049
2050To configure these options directly in the configuration, you can configure the
2051following settings in the @code{[hostlist]} section of the configuration:@
2052@example
2053 # Type of proxy server,@
2054 # Valid values: HTTP, HTTP_1_0, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME@
2055 # Default: HTTP@
2056 # PROXY_TYPE = HTTP
2057
2058# Hostname or IP of proxy server@
2059 # PROXY =@
2060 # User name for proxy server@
2061 # PROXY_USERNAME =@
2062 # User password for proxy server@
2063 # PROXY_PASSWORD =@
2064@end example
2065
2066@node Configuring your peer to provide a hostlist
2067@subsection Configuring your peer to provide a hostlist
2068
2069If you operate a peer permanently connected to GNUnet you can configure your
2070peer to act as a hostlist server, providing other peers the list of peers known
2071to him.
2072
2073Yor server can act as a bootstrap server and peers needing to obtain a list of
2074peers can contact him to download this list. To download this hostlist the peer
2075uses HTTP. For this reason you have to build your peer with libcurl and
2076microhttpd support. How you build your peer with this options can be found
2077here: https://gnunet.org/generic_installation
2078
2079To configure your peer to act as a bootstrap server you have to add the "-p"
2080option to OPTIONS in the [hostlist] section of your configuration file. Besides
2081that you have to specify a port number for the http server. In conclusion you
2082have to add the following lines:
2083
2084@example
2085[hostlist]
2086HTTPPORT = 12980
2087OPTIONS = -p
2088@end example
2089
2090
2091If your peer acts as a bootstrap server other peers should know about that. You
2092can advertise the hostlist your are providing to other peers. Peers connecting
2093to your peer will get a message containing an advertisement for your hostlist
2094and the URL where it can be downloaded. If this peer is in learning mode, it
2095will test the hostlist and, in the case it can obtain the list successfully, it
2096will save it for bootstrapping.
2097
2098To activate hostlist advertisement on your peer, you have to set the following
2099lines in your configuration file:
2100@example
2101[hostlist]
2102EXTERNAL_DNS_NAME = example.org
2103HTTPPORT = 12981
2104OPTIONS = -p -a
2105@end example
2106
2107
2108With this configuration your peer will a act as a bootstrap server and
2109advertise this hostlist to other peers connecting to him. The URL used to
2110download the list will be @code{@uref{http://example.org:12981/,
2111http://example.org:12981/}}.
2112
2113Please notice:
2114@itemize @bullet
2115
2116
2117@item
2118The hostlist is not human readable, so you should not try to download it using
2119your webbrowser. Just point your GNUnet peer to the address!
2120
2121@item
2122Advertising without providing a hostlist does not make sense and will not work.
2123@end itemize
2124
2125@node Configuring the datastore
2126@subsection Configuring the datastore
2127
2128The datastore is what GNUnet uses to for long-term storage of file-sharing
2129data. Note that long-term does not mean 'forever' since content does have an
2130expiration date, and of course storage space is finite (and hence sometimes
2131content may have to be discarded).
2132
2133Use the "QUOTA" option to specify how many bytes of storage space you are
2134willing to dedicate to GNUnet.
2135
2136In addition to specifying the maximum space GNUnet is allowed to use for the
2137datastore, you need to specify which database GNUnet should use to do so.
2138Currently, you have the choice between sqLite, MySQL and Postgres.
2139
2140@node Configuring the MySQL database
2141@subsection Configuring the MySQL database
2142
2143This section describes how to setup the MySQL database for GNUnet.
2144
2145Note that the mysql plugin does NOT work with mysql before 4.1 since we need
2146prepared statements. We are generally testing the code against MySQL 5.1 at
2147this point.
2148
2149@node Reasons for using MySQL
2150@subsection Reasons for using MySQL
2151
2152@itemize @bullet
2153
2154@item
2155On up-to-date hardware where mysql can be used comfortably, this module will
2156have better performance than the other database choices (according to our
2157tests).
2158
2159@item Its often possible to recover the mysql database from internal
2160inconsistencies. Some of the other databases do not support repair.
2161@end itemize
2162
2163@node Reasons for not using MySQL
2164@subsection Reasons for not using MySQL
2165
2166@itemize @bullet
2167
2168@item
2169Memory usage (likely not an issue if you have more than 1 GB)
2170
2171@item
2172Complex manual setup
2173@end itemize
2174
2175@node Setup Instructions
2176@subsection Setup Instructions
2177
2178@itemize @bullet
2179
2180@item
2181In @code{gnunet.conf} set in section "DATASTORE" the value for "DATABASE" to
2182"mysql".
2183
2184@item
2185Access mysql as root:@
2186
2187@example
2188$ mysql -u root -p
2189@end example
2190
2191
2192and issue the following commands, replacing $USER with the username@
2193 that will be running gnunet-arm (so typically "gnunet"):
2194@example
2195CREATE DATABASE gnunet;
2196GRANT select,insert,update,delete,create,alter,drop,create temporary tables
2197 ON gnunet.* TO $USER@@localhost;
2198SET PASSWORD FOR $USER@@localhost=PASSWORD('$the_password_you_like');
2199FLUSH PRIVILEGES;
2200@end example
2201
2202
2203@item
2204In the $HOME directory of $USER, create a ".my.cnf" file with the following lines@
2205
2206@example
2207[client]
2208user=$USER
2209password=$the_password_you_like
2210@end example
2211
2212@end itemize
2213
2214
2215 Thats it. Note that @code{.my.cnf} file is a slight security risk unless its
2216 on@ a safe partition. The $HOME/.my.cnf can of course be a symbolic@ link.
2217 Luckily $USER has only priviledges to mess up GNUnet's tables, which should be
2218 pretty harmless.
2219@node Testing
2220@subsection Testing
2221
2222You should briefly try if the database connection works. First, login as $USER.
2223Then use:
2224@example
2225$ mysql -u $USER
2226mysql> use gnunet;
2227@end example
2228
2229
2230If you get the message "Database changed" it probably works.
2231
2232If you get "ERROR 2002: Can't connect to local MySQL server@
2233 through socket '/tmp/mysql.sock' (2)" it may be resolvable by@
2234 "ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock"@
2235 so there may be some additional trouble depending on your mysql setup.
2236@node Performance Tuning
2237@subsection Performance Tuning
2238
2239For GNUnet, you probably want to set the option
2240@example
2241innodb_flush_log_at_trx_commit = 0
2242@end example
2243
2244for a rather dramatic boost in MySQL performance. However, this reduces the
2245"safety" of your database as with this options you may loose transactions
2246during a power outage. While this is totally harmless for GNUnet, the option
2247applies to all applications using MySQL. So you should set it if (and only if)
2248GNUnet is the only application on your system using MySQL.
2249
2250@node Setup for running Testcases
2251@subsection Setup for running Testcases
2252
2253If you want to run the testcases, you must create a second database
2254"gnunetcheck" with the same username and password. This database will then be
2255used for testing ("make check").
2256
2257@node Configuring the Postgres database
2258@subsection Configuring the Postgres database
2259
2260This text describes how to setup the Postgres database for GNUnet.
2261
2262This Postgres plugin was developed for Postgres 8.3 but might work for earlier
2263versions as well.
2264
2265@node Reasons to use Postgres
2266@subsection Reasons to use Postgres
2267
2268@itemize @bullet
2269@item
2270Easier to setup than MySQL
2271@item
2272Real database
2273@end itemize
2274
2275@node Reasons not to use Postgres
2276@subsection Reasons not to use Postgres
2277
2278@itemize @bullet
2279@item
2280Quite slow
2281@item
2282Still some manual setup required
2283@end itemize
2284
2285@node Manual setup instructions
2286@subsection Manual setup instructions
2287
2288@itemize @bullet
2289
2290@item
2291In @code{gnunet.conf} set in section "DATASTORE" the value for@
2292"DATABASE" to "postgres".
2293@item
2294Access Postgres to create a user:@
2295
2296@table @asis
2297
2298@item with Postgres 8.x, use:
2299
2300@example
2301# su - postgres
2302$ createuser
2303@end example
2304
2305and enter the name of the user running GNUnet for the role interactively.
2306Then, when prompted, do not set it to superuser, allow the creation of
2307databases, and do not allow the creation of new roles.@
2308
2309@item with Postgres 9.x, use:
2310
2311@example
2312# su - postgres
2313$ createuser -d $GNUNET_USER
2314@end example
2315
2316
2317where $GNUNET_USER is the name of the user running GNUnet.@
2318
2319@end table
2320
2321
2322@item
2323As that user (so typically as user "gnunet"), create a database (or two):@
2324
2325@example
2326$ createdb gnunet
2327$ createdb gnunetcheck # this way you can run "make check"
2328@end example
2329
2330@end itemize
2331
2332
2333Now you should be able to start @code{gnunet-arm}.
2334
2335@node Testing the setup manually
2336@subsection Testing the setup manually
2337
2338You may want to try if the database connection works. First, again login as
2339the user who will run gnunet-arm. Then use,
2340@example
2341$ psql gnunet # or gnunetcheck
2342gnunet=> \dt
2343@end example
2344
2345
2346If, after you have started gnunet-arm at least once, you get a @code{gn090}
2347table here, it probably works.
2348
2349@node Configuring the datacache
2350@subsection Configuring the datacache
2351@c %**end of header
2352
2353The datacache is what GNUnet uses for storing temporary data. This data is
2354expected to be wiped completely each time GNUnet is restarted (or the system
2355is rebooted).
2356
2357You need to specify how many bytes GNUnet is allowed to use for the datacache
2358using the "QUOTA" option in the section "dhtcache". Furthermore, you need to
2359specify which database backend should be used to store the data. Currently,
2360you have the choice between sqLite, MySQL and Postgres.
2361
2362@node Configuring the file-sharing service
2363@subsection Configuring the file-sharing service
2364
2365In order to use GNUnet for file-sharing, you first need to make sure that the
2366file-sharing service is loaded. This is done by setting the AUTOSTART option in
2367section "fs" to "YES". Alternatively, you can run
2368@example
2369$ gnunet-arm -i fs
2370@end example
2371
2372to start the file-sharing service by hand.
2373
2374Except for configuring the database and the datacache the only important option
2375for file-sharing is content migration.
2376
2377Content migration allows your peer to cache content from other peers as well as
2378send out content stored on your system without explicit requests. This content
2379replication has positive and negative impacts on both system performance an
2380privacy.
2381
2382FIXME: discuss the trade-offs. Here is some older text about it...
2383
2384Setting this option to YES allows gnunetd to migrate data to the local machine.
2385Setting this option to YES is highly recommended for efficiency. Its also the
2386default. If you set this value to YES, GNUnet will store content on your
2387machine that you cannot decrypt. While this may protect you from liability if
2388the judge is sane, it may not (IANAL). If you put illegal content on your
2389machine yourself, setting this option to YES will probably increase your chances
2390to get away with it since you can plausibly deny that you inserted the content.
2391Note that in either case, your anonymity would have to be broken first (which
2392may be possible depending on the size of the GNUnet network and the strength of
2393the adversary).
2394
2395@node Configuring logging
2396@subsection Configuring logging
2397
2398Logging in GNUnet 0.9.0 is controlled via the "-L" and "-l" options.
2399Using "-L", a log level can be specified. With log level "ERROR" only serious
2400errors are logged. The default log level is "WARNING" which causes anything of
2401concern to be logged. Log level "INFO" can be used to log anything that might
2402be interesting information whereas "DEBUG" can be used by developers to log
2403debugging messages (but you need to run configure with
2404@code{--enable-logging=verbose} to get them compiled). The "-l" option is used
2405to specify the log file.
2406
2407Since most GNUnet services are managed by @code{gnunet-arm}, using the "-l" or
2408"-L" options directly is not possible. Instead, they can be specified using the
2409"OPTIONS" configuration value in the respective section for the respective
2410service. In order to enable logging globally without editing the "OPTIONS"
2411values for each service, @code{gnunet-arm} supports a "GLOBAL_POSTFIX" option.
2412The value specified here is given as an extra option to all services for which
2413the configuration does contain a service-specific "OPTIONS" field.
2414
2415"GLOBAL_POSTFIX" can contain the special sequence "@{@}" which is replaced by
2416the name of the service that is being started. Furthermore,
2417@code{GLOBAL_POSTFIX} is special in that sequences starting with "$" anywhere
2418in the string are expanded (according to options in "PATHS"); this expansion
2419otherwise is only happening for filenames and then the "$" must be the first
2420character in the option. Both of these restrictions do not apply to
2421"GLOBAL_POSTFIX". Note that specifying @code{%} anywhere in the "GLOBAL_POSTFIX"
2422disables both of these features.
2423
2424In summary, in order to get all services to log at level "INFO" to log-files
2425called @code{SERVICENAME-logs}, the following global prefix should be used:
2426@example
2427GLOBAL_POSTFIX = -l $SERVICEHOME/@{@}-logs -L INFO
2428@end example
2429
2430@node Configuring the transport service and plugins
2431@subsection Configuring the transport service and plugins
2432
2433The transport service in GNUnet is responsible to maintain basic connectivity
2434to other peers. Besides initiating and keeping connections alive it is also
2435responsible for address validation.
2436
2437The GNUnet transport supports more than one transport protocol. These protocols
2438are configured together with the transport service.
2439
2440The configuration section for the transport service itself is quite similar to
2441all the other services
2442
2443@code{@
2444 AUTOSTART = YES@
2445 @@UNIXONLY@@ PORT = 2091@
2446 HOSTNAME = localhost@
2447 HOME = $SERVICEHOME@
2448 CONFIG = $DEFAULTCONFIG@
2449 BINARY = gnunet-service-transport@
2450 #PREFIX = valgrind@
2451 NEIGHBOUR_LIMIT = 50@
2452 ACCEPT_FROM = 127.0.0.1;@
2453 ACCEPT_FROM6 = ::1;@
2454 PLUGINS = tcp udp@
2455 UNIXPATH = /tmp/gnunet-service-transport.sock@
2456}
2457
2458Different are the settings for the plugins to load @code{PLUGINS}. The first
2459setting specifies which transport plugins to load.
2460@itemize @bullet
2461
2462
2463@item
2464transport-unix
2465
2466A plugin for local only communication with UNIX domain sockets. Used for
2467testing and available on unix systems only. Just set the port
2468
2469@code{@
2470 [transport-unix]@
2471 PORT = 22086@
2472 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2473}
2474
2475@item
2476transport-tcp
2477
2478A plugin for communication with TCP. Set port to 0 for client mode with
2479outbound only connections
2480
2481@code{@
2482 [transport-tcp]@
2483 # Use 0 to ONLY advertise as a peer behind NAT (no port binding)@
2484 PORT = 2086@
2485 ADVERTISED_PORT = 2086@
2486 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2487 # Maximum number of open TCP connections allowed@
2488 MAX_CONNECTIONS = 128@
2489}
2490
2491@item
2492transport-udp
2493
2494A plugin for communication with UDP. Supports peer discovery using broadcasts.@
2495@code{@
2496 [transport-udp]@
2497 PORT = 2086@
2498 BROADCAST = YES@
2499 BROADCAST_INTERVAL = 30 s@
2500 MAX_BPS = 1000000@
2501 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2502}
2503
2504@item
2505transport-http
2506
2507HTTP and HTTPS support is split in two part: a client plugin initiating
2508outbound connections and a server part accepting connections from the client.
2509The client plugin just takes the maximum number of connections as an argument.@
2510@code{@
2511 [transport-http_client]@
2512 MAX_CONNECTIONS = 128@
2513 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2514}@
2515@code{@
2516 [transport-https_client]@
2517 MAX_CONNECTIONS = 128@
2518 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2519}
2520
2521The server has a port configured and the maximum nunber of connections.@
2522 The HTTPS part has two files with the certificate key and the certificate file.
2523
2524The server plugin supports reverse proxies, so a external hostname can be set
2525using@
2526the @code{EXTERNAL_HOSTNAME} setting. The webserver under this address should
2527forward the request to the peer and the configure port.
2528
2529@code{@
2530 [transport-http_server]@
2531 EXTERNAL_HOSTNAME = fulcrum.net.in.tum.de/gnunet@
2532 PORT = 1080@
2533 MAX_CONNECTIONS = 128@
2534 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2535}@
2536@code{@
2537 [transport-https_server]@
2538 PORT = 4433@
2539 CRYPTO_INIT = NORMAL@
2540 KEY_FILE = https.key@
2541 CERT_FILE = https.cert@
2542 MAX_CONNECTIONS = 128@
2543 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2544}
2545
2546@item
2547transport-wlan
2548
2549There is a special article how to setup the WLAN plugin, so here only the
2550settings. Just specify the interface to use:@
2551@code{@
2552 [transport-wlan]@
2553 # Name of the interface in monitor mode (typically monX)@
2554 INTERFACE = mon0@
2555 # Real hardware, no testing@
2556 TESTMODE = 0@
2557 TESTING_IGNORE_KEYS = ACCEPT_FROM;@
2558}
2559@end itemize
2560
2561@node Configuring the wlan transport plugin
2562@subsection Configuring the wlan transport plugin
2563
2564
2565The wlan transport plugin enables GNUnet to send and to receive data on a wlan
2566interface. It has not to be connected to a wlan network as long as sender and
2567receiver are on the same channel. This enables you to get connection to the
2568GNUnet where no internet access is possible, for example while catastrophes or
2569when censorship cuts you off the internet.
2570
2571
2572@menu
2573* Requirements for the WLAN plugin::
2574* Configuration::
2575* Before starting GNUnet::
2576* Limitations and known bugs::
2577@end menu
2578
2579
2580@node Requirements for the WLAN plugin
2581@subsubsection Requirements for the WLAN plugin
2582
2583@itemize @bullet
2584
2585@item
2586wlan network card with monitor support and packet injection
2587(see @uref{http://www.aircrack-ng.org/, aircrack-ng.org})
2588
2589@item
2590Linux kernel with mac80211 stack, introduced in 2.6.22, tested with 2.6.35
2591and 2.6.38
2592
2593@item
2594Wlantools to create the a monitor interface, tested with airmon-ng of the
2595aircrack-ng package
2596@end itemize
2597
2598@node Configuration
2599@subsubsection Configuration
2600
2601There are the following options for the wlan plugin (they should be like this
2602in your default config file, you only need to adjust them if the values are
2603incorrect for your system)@
2604@code{@
2605# section for the wlan transport plugin@
2606[transport-wlan]@
2607# interface to use, more information in the
2608# "Before starting GNUnet" section of the handbook.
2609INTERFACE = mon0@
2610# testmode for developers:@
2611# 0 use wlan interface,@
2612#1 or 2 use loopback driver for tests 1 = server, 2 = client@
2613TESTMODE = 0@
2614}
2615
2616@node Before starting GNUnet
2617@subsubsection Before starting GNUnet
2618
2619Before starting GNUnet, you have to make sure that your wlan interface is in
2620monitor mode. One way to put the wlan interface into monitor mode (if your
2621interface name is wlan0) is by executing:@
2622@code{@
2623 sudo airmon-ng start wlan0@
2624}
2625
2626Here is an example what the result should look like:@
2627@code{@
2628 Interface Chipset Driver@
2629 wlan0 Intel 4965 a/b/g/n iwl4965 - [phy0]@
2630 (monitor mode enabled on mon0)@
2631}@
2632The monitor interface is mon0 is the one that you have to put into the
2633configuration file.
2634
2635@node Limitations and known bugs
2636@subsubsection Limitations and known bugs
2637
2638Wlan speed is at the maximum of 1 Mbit/s because support for choosing the wlan
2639speed with packet injection was removed in newer kernels. Please pester the
2640kernel developers about fixing this.
2641
2642The interface channel depends on the wlan network that the card is connected
2643to. If no connection has been made since the start of the computer, it is
2644usually the first channel of the card. Peers will only find each other and
2645communicate if they are on the same channel. Channels must be set manually
2646(i.e. using @code{iwconfig wlan0 channel 1}).
2647
2648
2649@node Configuring HTTP(S) reverse proxy functionality using Apache or nginx
2650@subsection Configuring HTTP(S) reverse proxy functionality using Apache or nginx
2651
2652The HTTP plugin supports data transfer using reverse proxies. A reverse proxy
2653forwards the HTTP request he receives with a certain URL to another webserver,
2654here a GNUnet peer.
2655
2656So if you have a running Apache or nginx webserver you can configure it to be a
2657GNUnet reverse proxy. Especially if you have a well-known webiste this improves
2658censorship resistance since it looks as normal surfing behaviour.
2659
2660To do so, you have to do two things:
2661
2662@itemize @bullet
2663
2664@item
2665Configure your webserver to forward the GNUnet HTTP traffic
2666
2667@item
2668Configure your GNUnet peer to announce the respective address
2669@end itemize
2670
2671As an example we want to use GNUnet peer running:
2672
2673@itemize @bullet
2674
2675@item
2676HTTP server plugin on @code{gnunet.foo.org:1080}
2677
2678@item
2679HTTPS server plugin on @code{gnunet.foo.org:4433}
2680
2681@item
2682A apache or nginx webserver on @uref{http://www.foo.org/, http://www.foo.org:80/}
2683
2684@item
2685A apache or nginx webserver on https://www.foo.org:443/
2686@end itemize
2687
2688And we want the webserver to accept GNUnet traffic under
2689@code{http://www.foo.org/bar/}. The required steps are described here:
2690
2691@strong{Configure your Apache2 HTTP webserver}
2692
2693First of all you need mod_proxy installed.
2694
2695Edit your webserver configuration. Edit @code{/etc/apache2/apache2.conf} or
2696the site-specific configuration file.
2697
2698In the respective @code{server config},@code{virtual host} or
2699@code{directory} section add the following lines:@
2700@code{@
2701 ProxyTimeout 300@
2702 ProxyRequests Off@
2703 <Location /bar/ >@
2704 ProxyPass http://gnunet.foo.org:1080/@
2705 ProxyPassReverse http://gnunet.foo.org:1080/@
2706 </Location>@
2707}
2708
2709@strong{Configure your Apache2 HTTPS webserver}
2710
2711We assume that you already have an HTTPS server running, if not please check
2712how to configure a HTTPS host. An easy to use example is the
2713@file{apache2/sites-available/default-ssl} example configuration file.
2714
2715In the respective HTTPS @code{server config},@code{virtual host} or
2716@code{directory} section add the following lines:@
2717@code{@
2718 SSLProxyEngine On@
2719 ProxyTimeout 300@
2720 ProxyRequests Off@
2721 <Location /bar/ >@
2722 ProxyPass https://gnunet.foo.org:4433/@
2723 ProxyPassReverse https://gnunet.foo.org:4433/@
2724 </Location>@
2725}
2726
2727More information about the apache mod_proxy configuration can be found unter:@
2728@uref{http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass, http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass}
2729
2730@strong{Configure your nginx HTTPS webserver}
2731
2732Since nginx does not support chunked encoding, you first of all have to
2733install @code{chunkin}:@
2734@uref{http://wiki.nginx.org/HttpChunkinModule, http://wiki.nginx.org/HttpChunkinModule}
2735
2736To enable chunkin add:@
2737@code{@
2738 chunkin on;@
2739 error_page 411 = @@my_411_error;@
2740 location @@my_411_error @{@
2741 chunkin_resume;@
2742 @}@
2743}
2744
2745Edit your webserver configuration. Edit @code{/etc/nginx/nginx.conf} or the
2746site-specific configuration file.
2747
2748In the @code{server} section add:@
2749@code{@
2750 location /bar/@
2751 @{@
2752 proxy_pass http://gnunet.foo.org:1080/;@
2753 proxy_buffering off;@
2754 proxy_connect_timeout 5; # more than http_server@
2755 proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout@
2756 proxy_http_version 1.1; # 1.0 default@
2757 proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;@
2758 @}@
2759@code{}}
2760
2761@strong{Configure your nginx HTTPS webserver}
2762
2763Edit your webserver configuration. Edit @code{/etc/nginx/nginx.conf} or the
2764site-specific configuration file.
2765
2766In the @code{server} section add:@
2767@code{@
2768 ssl_session_timeout 6m;@
2769 location /bar/@
2770 @{@
2771 proxy_pass https://gnunet.foo.org:4433/;@
2772 proxy_buffering off;@
2773 proxy_connect_timeout 5; # more than http_server@
2774 proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout@
2775 proxy_http_version 1.1; # 1.0 default@
2776 proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;@
2777 @}@
2778@code{}}
2779
2780@strong{Configure your GNUnet peer}
2781
2782To have your GNUnet peer announce the address, you have to specify the
2783
2784@code{EXTERNAL_HOSTNAME} option in the @code{[transport-http_server]} section:@
2785@code{@
2786 [transport-http_server]@
2787 EXTERNAL_HOSTNAME = http://www.foo.org/bar/@
2788}@
2789 and/or@
2790@code{[transport-https_server]} section:@
2791@code{@
2792 [transport-https_server]@
2793 EXTERNAL_HOSTNAME = https://www.foo.org/bar/@
2794}
2795
2796Now restart your webserver and your peer...
2797
2798@node Blacklisting peers
2799@subsection Blacklisting peers
2800
2801Transport service supports to deny connecting to a specific peer of to a
2802specific peer with a specific transport plugin using te blacklisting component
2803of transport service. With@ blacklisting it is possible to deny connections to
2804specific peers of@ to use a specific plugin to a specific peer. Peers can be
2805blacklisted using@ the configuration or a blacklist client can be asked.
2806
2807To blacklist peers using the configuration you have to add a section to your@
2808configuration containing the peer id of the peer to blacklist and the plugin@
2809if required.
2810
2811Example:@
2812 To blacklist connections to P565... on peer AG2P... using tcp add:@
2813@code{@
2814 [transport-blacklist AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]@
2815 P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G = tcp@
2816}@
2817 To blacklist connections to P565... on peer AG2P... using all plugins add:@
2818@code{@
2819 [transport-blacklist-AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]@
2820 P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G =@
2821}
2822
2823You can also add a blacklist client usign the blacklist api. On a blacklist@
2824check, blacklisting first checks internally if the peer is blacklisted and@
2825if not, it asks the blacklisting clients. Clients are asked if it is OK to@
2826connect to a peer ID, the plugin is omitted.
2827
2828On blacklist check for (peer, plugin)
2829@itemize @bullet
2830@item Do we have a local blacklist entry for this peer and this plugin?@
2831@item YES: disallow connection@
2832@item Do we have a local blacklist entry for this peer and all plugins?@
2833@item YES: disallow connection@
2834@item Does one of the clients disallow?@
2835@item YES: disallow connection
2836@end itemize
2837
2838@node Configuration of the HTTP and HTTPS transport plugins
2839@subsection Configuration of the HTTP and HTTPS transport plugins
2840
2841The client part of the http and https transport plugins can be configured to
2842use a proxy to connect to the hostlist server. This functionality can be
2843configured in the configuration file directly or using the gnunet-setup tool.
2844
2845The both the HTTP and HTTPS clients support the following proxy types at the
2846moment:
2847
2848@itemize @bullet
2849@item HTTP 1.1 proxy
2850@item SOCKS 4/4a/5/5 with hostname
2851@end itemize
2852
2853In addition authentication at the proxy with username and password can be
2854configured.
2855
2856To configure proxy support for the clients in the gnunet-setup tool, select the
2857"transport" tab and activate the respective plugin. Now you can select the
2858appropriate proxy type. The hostname or IP address (including port if required)
2859has to be entered in the "Proxy hostname" textbox. If required, enter username
2860and password in the "Proxy username" and "Proxy password" boxes. Be aware that
2861these information will be stored in the configuration in plain text.
2862
2863To configure these options directly in the configuration, you can configure the
2864following settings in the [transport-http_client] and [transport-https_client]
2865section of the configuration:
2866
2867@example
2868# Type of proxy server,@
2869# Valid values: HTTP, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME@
2870# Default: HTTP@
2871# PROXY_TYPE = HTTP
2872
2873# Hostname or IP of proxy server@
2874# PROXY =@
2875# User name for proxy server@
2876# PROXY_USERNAME =@
2877# User password for proxy server@
2878# PROXY_PASSWORD =
2879@end example
2880
2881@node Configuring the GNU Name System
2882@subsection Configuring the GNU Name System
2883
2884@menu
2885* Configuring system-wide DNS interception::
2886* Configuring the GNS nsswitch plugin::
2887* Configuring GNS on W32::
2888* GNS Proxy Setup::
2889* Setup of the GNS CA::
2890* Testing the GNS setup::
2891* Automatic Shortening in the GNU Name System::
2892@end menu
2893
2894
2895@node Configuring system-wide DNS interception
2896@subsubsection Configuring system-wide DNS interception
2897
2898Before you install GNUnet, make sure you have a user and group 'gnunet' as well
2899as an empty group 'gnunetdns'.
2900
2901When using GNUnet with system-wide DNS interception, it is absolutely necessary
2902for all GNUnet service processes to be started by @code{gnunet-service-arm} as
2903user and group 'gnunet'. You also need to be sure to run @code{make install} as
2904root (or use the @code{sudo} option to configure) to grant GNUnet sufficient
2905privileges.
2906
2907With this setup, all that is required for enabling system-wide DNS interception
2908is for some GNUnet component (VPN or GNS) to request it. The
2909@code{gnunet-service-dns} will then start helper programs that will make the
2910necessary changes to your firewall (@code{iptables}) rules.
2911
2912Note that this will NOT work if your system sends out DNS traffic to a
2913link-local IPv6 address, as in this case GNUnet can intercept the traffic, but
2914not inject the responses from the link-local IPv6 address. Hence you cannot use
2915system-wide DNS interception in conjunction with link-local IPv6-based DNS
2916servers. If such a DNS server is used, it will bypass GNUnet's DNS traffic
2917interception.
2918
2919
2920
2921Using the GNU Name System (GNS) requires two different configuration steps.
2922First of all, GNS needs to be integrated with the operating system. Most of
2923this section is about the operating system level integration.
2924
2925Additionally, each individual user who wants to use the system must also
2926initialize his GNS zones. This can be done by running (after starting GNUnet)@
2927@code{@
2928 $ gnunet-gns-import.sh@
2929}@
2930after the local GNUnet peer has been started. Note that the namestore (in
2931particular the namestore database backend) should not be reconfigured
2932afterwards (as records are not automatically migrated between backends).
2933
2934The remainder of this chapter will detail the various methods for configuring
2935the use of GNS with your operating system.
2936
2937At this point in time you have different options depending on your OS:
2938@table @asis
2939
2940@item Use the gnunet-gns-proxy This approach works for all operating systems
2941and is likely the easiest. However, it enables GNS only for browsers, not for
2942other applications that might be using DNS, such as SSH. Still, using the proxy
2943is required for using HTTP with GNS and is thus recommended for all users. To
2944do this, you simply have to run the @code{gnunet-gns-proxy-setup-ca} script as
2945the user who will run the browser (this will create a GNS certificate authority
2946(CA) on your system and import its key into your browser), then start
2947@code{gnunet-gns-proxy} and inform your browser to use the Socks5 proxy which
2948@code{gnunet-gns-proxy} makes available by default on port 7777.
2949@item Use a
2950nsswitch plugin (recommended on GNU systems) This approach has the advantage of
2951offering fully personalized resolution even on multi-user systems. A potential
2952disadvantage is that some applications might be able to bypass GNS.
2953@item Use
2954a W32 resolver plugin (recommended on W32) This is currently the only option on
2955W32 systems.
2956@item Use system-wide DNS packet interception This approach is
2957recommended for the GNUnet VPN. It can be used to handle GNS at the same time;
2958however, if you only use this method, you will only get one root zone per
2959machine (not so great for multi-user systems).
2960@end table
2961
2962
2963You can combine system-wide DNS packet interception with the nsswitch plugin.@
2964The setup of the system-wide DNS interception is described here. All of the
2965other GNS-specific configuration steps are described in the following sections.
2966
2967@node Configuring the GNS nsswitch plugin
2968@subsubsection Configuring the GNS nsswitch plugin
2969
2970The Name Service Switch (NSS) is a facility in Unix-like operating systems that
2971provides a variety of sources for common configuration databases and name
2972resolution mechanisms. A system administrator usually configures the operating
2973system's name services using the file /etc/nsswitch.conf.
2974
2975GNS provides a NSS plugin to integrate GNS name resolution with the operating
2976system's name resolution process. To use the GNS NSS plugin you have to either
2977
2978@itemize @bullet
2979
2980@item
2981install GNUnet as root or
2982
2983@item
2984compile GNUnet with the @code{--with-sudo=yes} switch.
2985@end itemize
2986
2987Name resolution is controlled by the @emph{hosts} section in the NSS
2988configuration. By default this section first performs a lookup in the
2989/etc/hosts file and then in DNS. The nsswitch file should contain a line
2990similar to:@
2991@code{@
2992 hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4@
2993}
2994
2995Here the GNS NSS plugin can be added to perform a GNS lookup before performing
2996a DNS lookup. The GNS NSS plugin has to be added to the "hosts" section in
2997/etc/nsswitch.conf file before DNS related plugins:@
2998@code{@
2999 ...@
3000 hosts: files gns [NOTFOUND=return] dns mdns4_minimal mdns4@
3001 ...@
3002}
3003
3004The @code{NOTFOUND=return} will ensure that if a @code{.gnu} name is not found
3005in GNS it will not be queried in DNS.
3006
3007@node Configuring GNS on W32
3008@subsubsection Configuring GNS on W32
3009
3010This document is a guide to configuring GNU Name System on W32-compatible
3011platforms.
3012
3013After GNUnet is installed, run the w32nsp-install tool:
3014@example
3015w32nsp-install.exe libw32nsp-0.dll
3016@end example
3017
3018
3019 ('0' is the library version of W32 NSP; it might increase in the future,
3020 change the invocation accordingly).
3021
3022This will install GNS namespace provider into the system and allow other
3023applications to resolve names that end in '@strong{gnu}' and '@strong{zkey}'.
3024Note that namespace provider requires gnunet-gns-helper-service-w32 to be
3025running, as well as gns service itself (and its usual dependencies).
3026
3027Namespace provider is hardcoded to connect to @strong{127.0.0.1:5353}, and this
3028is where gnunet-gns-helper-service-w32 should be listening to (and is
3029configured to listen to by default).
3030
3031To uninstall the provider, run:
3032@example
3033w32nsp-uninstall.exe
3034@end example
3035
3036
3037(uses provider GUID to uninstall it, does not need a dll name).
3038
3039Note that while MSDN claims that other applications will only be able to use
3040the new namespace provider after re-starting, in reality they might stat to use
3041it without that. Conversely, they might stop using the provider after it's been
3042uninstalled, even if they were not re-started. W32 will not permit namespace
3043provider library to be deleted or overwritten while the provider is installed,
3044and while there is at least one process still using it (even after it was
3045uninstalled).
3046
3047@node GNS Proxy Setup
3048@subsubsection GNS Proxy Setup
3049
3050When using the GNU Name System (GNS) to browse the WWW, there are several
3051issues that can be solved by adding the GNS Proxy to your setup:
3052@itemize @bullet
3053
3054
3055@item If the target website does not support GNS, it might assume that it is
3056operating under some name in the legacy DNS system (such as example.com). It
3057may then attempt to set cookies for that domain, and the web server might
3058expect a @code{Host: example.com} header in the request from your browser.
3059However, your browser might be using @code{example.gnu} for the @code{Host}
3060header and might only accept (and send) cookies for @code{example.gnu}. The GNS
3061Proxy will perform the necessary translations of the hostnames for cookies and
3062HTTP headers (using the LEHO record for the target domain as the desired
3063substitute).
3064
3065@item If using HTTPS, the target site might include an SSL certificate which is
3066either only valid for the LEHO domain or might match a TLSA record in GNS.
3067However, your browser would expect a valid certificate for @code{example.gnu},
3068not for some legacy domain name. The proxy will validate the certificate
3069(either against LEHO or TLSA) and then on-the-fly produce a valid certificate
3070for the exchange, signed by your own CA. Assuming you installed the CA of your
3071proxy in your browser's certificate authority list, your browser will then
3072trust the HTTPS/SSL/TLS connection, as the hostname mismatch is hidden by the
3073proxy.
3074
3075@item Finally, the proxy will in the future indicate to the server that it
3076speaks GNS, which will enable server operators to deliver GNS-enabled web sites
3077to your browser (and continue to deliver legacy links to legacy browsers)
3078@end itemize
3079
3080@node Setup of the GNS CA
3081@subsubsection Setup of the GNS CA
3082
3083First you need to create a CA certificate that the proxy can use. To do so use
3084the provided script gnunet-gns-proxy-ca:@
3085@code{@
3086 $ gnunet-gns-proxy-setup-ca@
3087}
3088
3089This will create a personal certification authority for you and add this
3090authority to the firefox and chrome database. The proxy will use the this CA
3091certificate to generate @code{*.gnu} client certificates on the fly.
3092
3093Note that the proxy uses libcurl. Make sure your version of libcurl uses GnuTLS
3094and NOT OpenSSL. The proxy will not work with libcurl compiled against
3095OpenSSL.
3096
3097@node Testing the GNS setup
3098@subsubsection Testing the GNS setup
3099
3100Now for testing purposes we can create some records in our zone to test the SSL
3101functionality of the proxy:@
3102@code{@
3103 $ gnunet-namestore -a -e "1 d" -n "homepage" -t A -V 131.159.74.67@
3104 $ gnunet-namestore -a -e "1 d" -n "homepage" -t LEHO -V "gnunet.org"@
3105}
3106
3107At this point we can start the proxy. Simply execute@
3108@code{@
3109 $ gnunet-gns-proxy@
3110}
3111
3112Configure your browser to use this SOCKSv5 proxy on port 7777 and visit this
3113link.@ If you use firefox you also have to go to about:config and set the key
3114@code{network.proxy.socks_remote_dns} to @code{true}.
3115
3116When you visit @code{https://homepage.gnu/}, you should get to the
3117@code{https://gnunet.org/} frontpage and the browser (with the correctly
3118configured proxy) should give you a valid SSL certificate for
3119@code{homepage.gnu} and no warnings. It should look like this@
3120
3121
3122
3123@table @asis
3124@item Attachment
3125Size
3126@item gnunethpgns.png
312764.19 KB
3128@end table
3129
3130@node Automatic Shortening in the GNU Name System
3131@subsubsection Automatic Shortening in the GNU Name System
3132
3133This page describes a possible option for 'automatic name shortening', which
3134you can choose to enable with the GNU Name System.
3135
3136When GNS encounters a name for the first time, it can use the 'NICK' record of
3137the originating zone to automatically generate a name for the zone. If
3138automatic shortening is enabled, those auto-generated names will be placed (as
3139private records) into your personal 'shorten' zone (to prevent confusion with
3140manually selected names). Then, in the future, if the same name is encountered
3141again, GNS will display the shortened name instead (the first time, the long
3142name will still be used as shortening typically happens asynchronously as
3143looking up the 'NICK' record takes some time). Using this feature can be a
3144convenient way to avoid very long @code{.gnu} names; however, note that names
3145from the shorten-zone are assigned on a first-come-first-serve basis and should
3146not be trusted. Furthermore, if you enable this feature, you will no longer see
3147the full delegation chain for zones once shortening has been applied.
3148
3149@node Configuring the GNUnet VPN
3150@subsection Configuring the GNUnet VPN
3151
3152@menu
3153* IPv4 address for interface::
3154* IPv6 address for interface::
3155* Configuring the GNUnet VPN DNS::
3156* Configuring the GNUnet VPN Exit Service::
3157* IP Address of external DNS resolver::
3158* IPv4 address for Exit interface::
3159* IPv6 address for Exit interface::
3160@end menu
3161
3162Before configuring the GNUnet VPN, please make sure that system-wide DNS
3163interception is configured properly as described in the section on the GNUnet
3164DNS setup.
3165
3166The default-options for the GNUnet VPN are usually sufficient to use GNUnet as
3167a Layer 2 for your Internet connection. However, what you always have to
3168specify is which IP protocol you want to tunnel: IPv4, IPv6 or both.
3169Furthermore, if you tunnel both, you most likely should also tunnel all of your
3170DNS requests. You theoretically can tunnel "only" your DNS traffic, but that
3171usually makes little sense.
3172
3173The other options as shown on the gnunet-setup tool are:
3174
3175@node IPv4 address for interface
3176@subsubsection IPv4 address for interface
3177
3178This is the IPv4 address the VPN interface will get. You should pick an
3179'private' IPv4 network that is not yet in use for you system. For example, if
3180you use 10.0.0.1/255.255.0.0 already, you might use 10.1.0.1/255.255.0.0. If
3181you use 10.0.0.1/255.0.0.0 already, then you might use 192.168.0.1/255.255.0.0.
3182If your system is not in a private IP-network, using any of the above will work
3183fine.@ You should try to make the mask of the address big enough (255.255.0.0
3184or, even better, 255.0.0.0) to allow more mappings of remote IP Addresses into
3185this range. However, even a 255.255.255.0-mask will suffice for most users.
3186
3187@node IPv6 address for interface
3188@subsubsection IPv6 address for interface
3189
3190The IPv6 address the VPN interface will get. Here you can specify any
3191non-link-local address (the address should not begin with "fe80:"). A subnet
3192Unique Local Unicast (fd00::/8-prefix) that you are currently not using would
3193be a good choice.
3194
3195@node Configuring the GNUnet VPN DNS
3196@subsubsection Configuring the GNUnet VPN DNS
3197
3198To resolve names for remote nodes, activate the DNS exit option.
3199
3200@node Configuring the GNUnet VPN Exit Service
3201@subsubsection Configuring the GNUnet VPN Exit Service
3202
3203If you want to allow other users to share your Internet connection (yes, this
3204may be dangerous, just as running a Tor exit node) or want to provide access to
3205services on your host (this should be less dangerous, as long as those services
3206are secure), you have to enable the GNUnet exit daemon.
3207
3208You then get to specify which exit functions you want to provide. By enabling
3209the exit daemon, you will always automatically provide exit functions for
3210manually configured local services (this component of the system is under
3211development and not documented further at this time). As for those services you
3212explicitly specify the target IP address and port, there is no significant
3213security risk in doing so.
3214
3215Furthermore, you can serve as a DNS, IPv4 or IPv6 exit to the Internet. Being a
3216DNS exit is usually pretty harmless. However, enabling IPv4 or IPv6-exit
3217without further precautions may enable adversaries to access your local
3218network, send spam, attack other systems from your Internet connection and to
3219other mischief that will appear to come from your machine. This may or may not
3220get you into legal trouble. If you want to allow IPv4 or IPv6-exit
3221functionality, you should strongly consider adding additional firewall rules
3222manually to protect your local network and to restrict outgoing TCP traffic
3223(i.e. by not allowing access to port 25). While we plan to improve
3224exit-filtering in the future, you're currently on your own here. Essentially,
3225be prepared for any kind of IP-traffic to exit the respective TUN interface
3226(and GNUnet will enable IP-forwarding and NAT for the interface automatically).
3227
3228Additional configuration options of the exit as shown by the gnunet-setup tool
3229are:
3230
3231@node IP Address of external DNS resolver
3232@subsubsection IP Address of external DNS resolver
3233
3234If DNS traffic is to exit your machine, it will be send to this DNS resolver.
3235You can specify an IPv4 or IPv6 address.
3236
3237@node IPv4 address for Exit interface
3238@subsubsection IPv4 address for Exit interface
3239
3240This is the IPv4 address the Interface will get. Make the mask of the address
3241big enough (255.255.0.0 or, even better, 255.0.0.0) to allow more mappings of
3242IP addresses into this range. As for the VPN interface, any unused, private
3243IPv4 address range will do.
3244
3245@node IPv6 address for Exit interface
3246@subsubsection IPv6 address for Exit interface
3247
3248The public IPv6 address the interface will get. If your kernel is not a very
3249recent kernel and you are willing to manually enable IPv6-NAT, the IPv6 address
3250you specify here must be a globally routed IPv6 address of your host.
3251
3252Suppose your host has the address @code{2001:4ca0::1234/64}, then using@
3253@code{2001:4ca0::1:0/112} would be fine (keep the first 64 bits, then change at
3254least one bit in the range before the bitmask, in the example above we changed
3255bit 111 from 0 to 1).
3256
3257You may also have to configure your router to route traffic for the entire
3258subnet (@code{2001:4ca0::1:0/112} for example) through your computer (this
3259should be automatic with IPv6, but obviously anything can be
3260disabled).
3261
3262@node Bandwidth Configuration
3263@subsection Bandwidth Configuration
3264
3265You can specify how many bandwidth GNUnet is allowed to use to receive and send
3266data. This is important for users with limited bandwidth or traffic volume.
3267
3268@node Configuring NAT
3269@subsection Configuring NAT
3270
3271Most hosts today do not have a normal global IP address but instead are behind
3272a router performing Network Address Translation (NAT) which assigns each host
3273in the local network a private IP address. As a result, these machines cannot
3274trivially receive inbound connections from the Internet. GNUnet supports NAT
3275traversal to enable these machines to receive incoming connections from other
3276peers despite their limitations.
3277
3278In an ideal world, you can press the "Attempt automatic configuration" button
3279in gnunet-setup to automatically configure your peer correctly. Alternatively,
3280your distribution might have already triggered this automatic configuration
3281during the installation process. However, automatic configuration can fail to
3282determine the optimal settings, resulting in your peer either not receiving as
3283many connections as possible, or in the worst case it not connecting to the
3284network at all.
3285
3286To manually configure the peer, you need to know a few things about your
3287network setup. First, determine if you are behind a NAT in the first place.
3288This is always the case if your IP address starts with "10.*" or "192.168.*".
3289Next, if you have control over your NAT router, you may choose to manually
3290configure it to allow GNUnet traffic to your host. If you have configured your
3291NAT to forward traffic on ports 2086 (and possibly 1080) to your host, you can
3292check the "NAT ports have been opened manually" option, which corresponds to
3293the "PUNCHED_NAT" option in the configuration file. If you did not punch your
3294NAT box, it may still be configured to support UPnP, which allows GNUnet to
3295automatically configure it. In that case, you need to install the "upnpc"
3296command, enable UPnP (or PMP) on your NAT box and set the "Enable NAT traversal
3297via UPnP or PMP" option (corresponding to "ENABLE_UPNP" in the configuration
3298file).
3299
3300Some NAT boxes can be traversed using the autonomous NAT traversal method. This
3301requires certain GNUnet components to be installed with "SUID" prividledges on
3302your system (so if you're installing on a system you do not have administrative
3303rights to, this will not work). If you installed as 'root', you can enable
3304autonomous NAT traversal by checking the "Enable NAT traversal using ICMP
3305method". The ICMP method requires a way to determine your NAT's external
3306(global) IP address. This can be done using either UPnP, DynDNS, or by manual
3307configuration. If you have a DynDNS name or know your external IP address, you
3308should enter that name under "External (public) IPv4 address" (which
3309corresponds to the "EXTERNAL_ADDRESS" option in the configuration file). If you
3310leave the option empty, GNUnet will try to determine your external IP address
3311automatically (which may fail, in which case autonomous NAT traversal will then
3312not work).
3313
3314Finally, if you yourself are not behind NAT but want to be able to connect to
3315NATed peers using autonomous NAT traversal, you need to check the "Enable
3316connecting to NATed peers using ICMP method" box.
3317
3318
3319@node Peer configuration for distributions
3320@subsection Peer configuration for distributions
3321
3322The "GNUNET_DATA_HOME" in "[path]" in @file{/etc/gnunet.conf} should be manually set
3323to "/var/lib/gnunet/data/" as the default "~/.local/share/gnunet/" is probably
3324not that appropriate in this case. Similarly, distributions may consider
3325pointing "GNUNET_RUNTIME_DIR" to "/var/run/gnunet/" and "GNUNET_HOME" to
3326"/var/lib/gnunet/". Also, should a distribution decide to override system
3327defaults, all of these changes should be done in a custom @file{/etc/gnunet.conf}
3328and not in the files in the @file{config.d/} directory.
3329
3330Given the proposed access permissions, the "gnunet-setup" tool must be run as
3331use "gnunet" (and with option "-c /etc/gnunet.conf" so that it modifies the
3332system configuration). As always, gnunet-setup should be run after the GNUnet
3333peer was stopped using "gnunet-arm -e". Distributions might want to include a
3334wrapper for gnunet-setup that allows the desktop-user to "sudo" (i.e. using
3335gtksudo) to the "gnunet" user account and then runs "gnunet-arm -e",
3336"gnunet-setup" and "gnunet-arm -s" in sequence.
3337
3338
3339
3340@node How to start and stop a GNUnet peer
3341@section How to start and stop a GNUnet peer
3342
3343This section describes how to start a GNUnet peer. It assumes that you have
3344already compiled and installed GNUnet and its' dependencies. Before you start a
3345GNUnet peer, you may want to create a configuration file using gnunet-setup
3346(but you do not have to). Sane defaults should exist in your
3347@file{$GNUNET_PREFIX/share/gnunet/config.d/} directory, so in practice you could
3348simply start without any configuration. If you want to configure your peer
3349later, you need to stop it before invoking the @code{gnunet-setup} tool to
3350customize further and to test your configuration (@code{gnunet-setup} has
3351build-in test functions).
3352
3353The most important option you might have to still set by hand is in [PATHS].
3354Here, you use the option "GNUNET_HOME" to specify the path where GNUnet should
3355store its data. It defaults to @code{$HOME/}, which again should work for most
3356users. Make sure that the directory specified as GNUNET_HOME is writable to
3357the user that you will use to run GNUnet (note that you can run frontends
3358using other users, GNUNET_HOME must only be accessible to the user used to run
3359the background processes).
3360
3361You will also need to make one central decision: should all of GNUnet be run
3362under your normal UID, or do you want distinguish between system-wide
3363(user-independent) GNUnet services and personal GNUnet services. The multi-user
3364setup is slightly more complicated, but also more secure and generally
3365recommended.
3366
3367@menu
3368* The Single-User Setup::
3369* The Multi-User Setup::
3370* Killing GNUnet services::
3371* Access Control for GNUnet::
3372@end menu
3373
3374@node The Single-User Setup
3375@subsection The Single-User Setup
3376
3377For the single-user setup, you do not need to do anything special and can just
3378start the GNUnet background processes using @code{gnunet-arm}. By default,
3379GNUnet looks in @file{~/.config/gnunet.conf} for a configuration (or
3380@code{$XDG_CONFIG_HOME/gnunet.conf} if@ @code{$XDG_CONFIG_HOME} is defined). If your
3381configuration lives elsewhere, you need to pass the @code{-c FILENAME} option
3382to all GNUnet commands.
3383
3384Assuming the configuration file is called @file{~/.config/gnunet.conf}, you
3385start your peer using the @code{gnunet-arm} command (say as user
3386@code{gnunet}) using:
3387@example
3388gnunet-arm -c ~/.config/gnunet.conf -s
3389@end example
3390
3391The "-s" option here is for "start". The command should return almost
3392instantly. If you want to stop GNUnet, you can use:
3393@example
3394gnunet-arm -c ~/.config/gnunet.conf -e
3395@end example
3396
3397The "-e" option here is for "end".
3398
3399Note that this will only start the basic peer, no actual applications will be
3400available. If you want to start the file-sharing service, use (after starting
3401GNUnet):
3402@example
3403gnunet-arm -c ~/.config/gnunet.conf -i fs
3404@end example
3405
3406The "-i fs" option here is for "initialize" the "fs" (file-sharing)
3407application. You can also selectively kill only file-sharing support using
3408@example
3409gnunet-arm -c ~/.config/gnunet.conf -k fs
3410@end example
3411
3412Assuming that you want certain services (like file-sharing) to be always
3413automatically started whenever you start GNUnet, you can activate them by
3414setting "FORCESTART=YES" in the respective section of the configuration file
3415(for example, "[fs]"). Then GNUnet with file-sharing support would be started
3416whenever you@ enter:
3417@example
3418gnunet-arm -c ~/.config/gnunet.conf -s
3419@end example
3420
3421Alternatively, you can combine the two options:
3422@example
3423gnunet-arm -c ~/.config/gnunet.conf -s -i fs
3424@end example
3425
3426
3427Using @code{gnunet-arm} is also the preferred method for initializing GNUnet
3428from @code{init}.
3429
3430Finally, you should edit your @code{crontab} (using the @code{crontab} command)
3431and insert a line@
3432@code{@
3433 @@reboot gnunet-arm -c ~/.config/gnunet.conf -s@
3434}@
3435to automatically start your peer whenever your system boots.
3436
3437@node The Multi-User Setup
3438@subsection The Multi-User Setup
3439
3440This requires you to create a user @code{gnunet} and an additional group
3441@code{gnunetdns}, prior to running @code{make install} during installation.
3442Then, you create a configuration file @file{/etc/gnunet.conf} which should
3443contain the lines:@
3444@code{@
3445 [arm]@
3446 SYSTEM_ONLY = YES@
3447 USER_ONLY = NO@
3448}@
3449 Then, perform the same steps to run GNUnet as in the per-user configuration,
3450 except as user @code{gnunet} (including the @code{crontab} installation). You
3451 may also want to run @code{gnunet-setup} to configure your peer (databases,
3452 etc.). Make sure to pass @code{-c /etc/gnunet.conf} to all commands. If you
3453 run @code{gnunet-setup} as user @code{gnunet}, you might need to change
3454 permissions on @file{/etc/gnunet.conf} so that the @code{gnunet} user can
3455 write to the file (during setup).
3456
3457Afterwards, you need to perform another setup step for each normal user account
3458from which you want to access GNUnet. First, grant the normal user
3459(@code{$USER}) permission to the group gnunet:@
3460@code{@
3461 # adduser $USER gnunet@
3462}@
3463Then, create a configuration file in @file{~/.config/gnunet.conf} for the $USER
3464with the lines:@
3465@code{@
3466 [arm]@
3467 SYSTEM_ONLY = NO@
3468 USER_ONLY = YES@
3469}@
3470 This will ensure that @code{gnunet-arm} when started by the normal user will
3471 only run services that are per-user, and otherwise rely on the system-wide
3472 services. Note that the normal user may run gnunet-setup, but the
3473 configuration would be ineffective as the system-wide services will use
3474 @code{/etc/gnunet.conf} and ignore options set by individual users.
3475
3476Again, each user should then start the peer using @code{gnunet-arm -s} --- and
3477strongly consider adding logic to start the peer automatically to their
3478crontab.
3479
3480Afterwards, you should see two (or more, if you have more than one USER)
3481@code{gnunet-service-arm} processes running in your system.
3482
3483@node Killing GNUnet services
3484@subsection Killing GNUnet services
3485
3486It is not necessary to stop GNUnet services explicitly when shutting down your
3487computer.
3488
3489It should be noted that manually killing "most" of the @code{gnunet-service}
3490processes is generally not a successful method for stopping a peer (since
3491@code{gnunet-service-arm} will instantly restart them). The best way to
3492explicitly stop a peer is using @code{gnunet-arm -e}; note that the per-user
3493services may need to be terminated before the system-wide services will
3494terminate normally.
3495
3496@node Access Control for GNUnet
3497@subsection Access Control for GNUnet
3498
3499This chapter documents how we plan to make access control work within the
3500GNUnet system for a typical peer. It should be read as a best-practice
3501installation guide for advanced users and builders of binary distributions. The
3502recommendations in this guide apply to POSIX-systems with full support for UNIX
3503domain sockets only.
3504
3505Note that this is an advanced topic. The discussion presumes a very good
3506understanding of users, groups and file permissions. Normal users on hosts with
3507just a single user can just install GNUnet under their own account (and
3508possibly allow the installer to use SUDO to grant additional permissions for
3509special GNUnet tools that need additional rights). The discussion below largely
3510applies to installations where multiple users share a system and to
3511installations where the best possible security is paramount.
3512
3513A typical GNUnet system consists of components that fall into four categories:
3514
3515@table @asis
3516
3517@item User interfaces
3518User interfaces are not security sensitive and are supposed to be run and used
3519by normal system users. The GTK GUIs and most command-line programs fall into
3520this category. Some command-line tools (like gnunet-transport) should be
3521excluded as they offer low-level access that normal users should not need.
3522@item System services and support tools
3523System services should always run and offer services that can then be accessed
3524by the normal users. System services do not require special permissions, but as
3525they are not specific to a particular user, they probably should not run as a
3526particular user. Also, there should typically only be one GNUnet peer per host.
3527System services include the gnunet-service and gnunet-daemon programs; support
3528tools include command-line programs such as gnunet-arm.
3529@item Priviledged helpers
3530Some GNUnet components require root rights to open raw sockets or perform other
3531special operations. These gnunet-helper binaries are typically installed SUID
3532and run from services or daemons.
3533@item Critical services
3534Some GNUnet services (such as the DNS service) can manipulate the service in
3535deep and possibly highly security sensitive ways. For example, the DNS service
3536can be used to intercept and alter any DNS query originating from the local
3537machine. Access to the APIs of these critical services and their priviledged
3538helpers must be tightly controlled.
3539@end table
3540
3541@menu
3542* Recommendation - Disable access to services via TCP::
3543* Recommendation - Run most services as system user "gnunet"::
3544* Recommendation - Control access to services using group "gnunet"::
3545* Recommendation - Limit access to certain SUID binaries by group "gnunet"::
3546* Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"::
3547* Differences between "make install" and these recommendations::
3548@end menu
3549
3550@node Recommendation - Disable access to services via TCP
3551@subsubsection Recommendation - Disable access to services via TCP
3552
3553GNUnet services allow two types of access: via TCP socket or via UNIX domain
3554socket. If the service is available via TCP, access control can only be
3555implemented by restricting connections to a particular range of IP addresses.
3556This is acceptable for non-critical services that are supposed to be available
3557to all users on the local system or local network. However, as TCP is generally
3558less efficient and it is rarely the case that a single GNUnet peer is supposed
3559to serve an entire local network, the default configuration should disable TCP
3560access to all GNUnet services on systems with support for UNIX domain sockets.
3561As of GNUnet 0.9.2, configuration files with TCP access disabled should be
3562generated by default. Users can re-enable TCP access to particular services
3563simply by specifying a non-zero port number in the section of the respective
3564service.
3565
3566
3567@node Recommendation - Run most services as system user "gnunet"
3568@subsubsection Recommendation - Run most services as system user "gnunet"
3569
3570GNUnet's main services should be run as a separate user "gnunet" in a special
3571group "gnunet". The user "gnunet" should start the peer using "gnunet-arm -s"
3572during system startup. The home directory for this user should be
3573@file{/var/lib/gnunet} and the configuration file should be @file{/etc/gnunet.conf}.
3574Only the @code{gnunet} user should have the right to access @file{/var/lib/gnunet}
3575(@emph{mode: 700}).
3576
3577@node Recommendation - Control access to services using group "gnunet"
3578@subsubsection Recommendation - Control access to services using group "gnunet"
3579
3580Users that should be allowed to use the GNUnet peer should be added to the
3581group "gnunet". Using GNUnet's access control mechanism for UNIX domain
3582sockets, those services that are considered useful to ordinary users should be
3583made available by setting "UNIX_MATCH_GID=YES" for those services. Again, as
3584shipped, GNUnet provides reasonable defaults. Permissions to access the
3585transport and core subsystems might additionally be granted without necessarily
3586causing security concerns. Some services, such as DNS, must NOT be made
3587accessible to the "gnunet" group (and should thus only be accessible to the
3588"gnunet" user and services running with this UID).
3589
3590@node Recommendation - Limit access to certain SUID binaries by group "gnunet"
3591@subsubsection Recommendation - Limit access to certain SUID binaries by group "gnunet"
3592
3593Most of GNUnet's SUID binaries should be safe even if executed by normal users.
3594However, it is possible to reduce the risk a little bit more by making these
3595binaries owned by the group "gnunet" and restricting their execution to user of
3596the group "gnunet" as well (4750).
3597
3598@node Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
3599@subsubsection Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
3600
3601A special group "gnunetdns" should be created for controlling access to the
3602"gnunet-helper-dns". The binary should then be owned by root and be in group
3603"gnunetdns" and be installed SUID and only be group-executable (2750). Note
3604that the group "gnunetdns" should have no users in it at all, ever. The
3605"gnunet-service-dns" program should be executed by user "gnunet" (via
3606gnunet-service-arm) with the binary owned by the user "root" and the group
3607"gnunetdns" and be SGID (2700). This way, @strong{only} "gnunet-service-dns"
3608can change its group to "gnunetdns" and execute the helper, and the helper can
3609then run as root (as per SUID). Access to the API offered by
3610"gnunet-service-dns" is in turn restricted to the user "gnunet" (not the
3611group!), which means that only "benign" services can manipulate DNS queries
3612using "gnunet-service-dns".
3613
3614@node Differences between "make install" and these recommendations
3615@subsubsection Differences between "make install" and these recommendations
3616
3617The current build system does not set all permissions automatically based on
3618the recommendations above. In particular, it does not use the group "gnunet" at
3619all (so setting gnunet-helpers other than the gnunet-helper-dns to be owned by
3620group "gnunet" must be done manually). Furthermore, 'make install' will
3621silently fail to set the DNS binaries to be owned by group "gnunetdns" unless
3622that group already exists (!). An alternative name for the "gnunetdns" group
3623can be specified using the "--with-gnunetdns=GRPNAME" configure
3624option.
3625
diff --git a/doc/chapters/user.texi b/doc/chapters/user.texi
deleted file mode 100644
index 2a8c899b9..000000000
--- a/doc/chapters/user.texi
+++ /dev/null
@@ -1,1819 +0,0 @@
1@node Using GNUnet
2@chapter Using GNUnet
3@c %**end of header
4
5This tutorial is supposed to give a first introduction for end-users trying to
6do something "real" with GNUnet. Installation and configuration are specifically
7outside of the scope of this tutorial. Instead, we start by briefly checking
8that the installation works, and then dive into simple, concrete practical
9things that can be done with the network.
10
11This chapter documents how to use the various Peer-to-Peer applications of the
12GNUnet system. As GNUnet evolves, we will add new chapters for the various
13applications that are being created. Comments and extensions are always welcome.
14
15
16@menu
17* Checking the Installation::
18* First steps - File-sharing::
19* First steps - Using the GNU Name System::
20* First steps - Using GNUnet Conversation::
21* First steps - Using the GNUnet VPN::
22* File-sharing::
23* The GNU Name System::
24* Using the Virtual Public Network::
25@end menu
26
27@node Checking the Installation
28@section Checking the Installation
29@c %**end of header
30
31This chapter describes a quick casual way to check if your GNUnet installation
32works. However, if it does not, we do not cover steps for recovery --- for this,
33please study the installation and configuration handbooks.
34
35
36@menu
37* gnunet-gtk::
38* Statistics::
39* Peer Information::
40@end menu
41
42@node gnunet-gtk
43@subsection gnunet-gtk
44@c %**end of header
45
46First, you should launch @code{gnunet-gtk}, the graphical user interface for
47GNUnet which will be used for most of the tutorial. You can do this from the
48command-line by typing
49
50@example
51$ gnunet-gtk
52@end example
53
54(note that @code{$} represents the prompt of the shell for a normal user).
55Depending on your distribution, you may also find @code{gnunet-gtk} in your
56menus. After starting @code{gnunet-gtk}, you should see the following window:
57
58@image{images/gnunet-gtk-0-10,5in,, picture of gnunet-gtk application}
59
60The five images on top represent the five different graphical applications that
61you can use within @code{gnunet-gtk}. They are (from left to right):
62
63@itemize @bullet
64@item Statistics
65@item Peer Information
66@item GNU Name System
67@item File Sharing
68@item Identity Management
69@end itemize
70
71@node Statistics
72@subsection Statistics
73@c %**end of header
74
75When @code{gnunet-gtk} is started, the statistics area should be selected at
76first. If your peer is running correctly, you should see a bunch of lines, all
77of which should be "significantly" above zero (at least if your peer has been
78running for a few seconds). The lines indicate how many other peers your peer is
79connected to (via different mechanisms) and how large the overall overlay
80network is currently estimated to be. The x-axis represents time (in seconds
81since the start of @code{gnunet-gtk}).
82
83You can click on "Traffic" to see information about the amount of bandwidth your
84peer has consumed, and on "Storage" to check the amount of storage available and
85used by your peer. Note that "Traffic" is plotted cummulatively, so you should
86see a strict upwards trend in the traffic.
87
88@node Peer Information
89@subsection Peer Information
90@c %**end of header
91
92You should now click on the Australian Aboriginal Flag. Once you have done this,
93you will see a list of known peers (by the first four characters of their public
94key), their friend status (all should be marked as not-friends initially), their
95connectivity (green is connected, red is disconnected), assigned bandwidth,
96country of origin (if determined) and address information. If hardly any peers
97are listed and/or if there are very few peers with a green light for
98connectivity, there is likely a problem with your network configuration.
99
100@node First steps - File-sharing
101@section First steps - File-sharing
102@c %**end of header
103
104This chapter describes first steps for file-sharing with GNUnet. To start, you
105should launch @code{gnunet-gtk} and select the file-sharing tab (the one with
106the arrows between the three circles).
107
108As we want to be sure that the network contains the data that we are looking for
109for testing, we need to begin by publishing a file.
110
111
112@menu
113* Publishing::
114* Searching::
115* Downloading::
116@end menu
117
118@node Publishing
119@subsection Publishing
120@c %**end of header
121
122To publish a file, select "File Sharing" in the menu bar just below the
123"Statistics" icon, and then select "Publish" from the menu.
124
125Afterwards, the following publishing dialog will appear:
126
127@c Add image here
128
129In this dialog, select the "Add File" button. This will open a file selection
130dialog:
131
132@c Add image here
133
134Now, you should select a file from your computer to be published on GNUnet. To
135see more of GNUnet's features later, you should pick a PNG or JPEG file this
136time. You can leave all of the other options in the dialog unchanged. Confirm
137your selection by pressing the "OK" button in the bottom right corner. Now, you
138will briefly see a "Messages..." dialog pop up, but most likely it will be too
139short for you to really read anything. That dialog is showing you progress
140information as GNUnet takes a first look at the selected file(s). For a normal
141image, this is virtually instant, but if you later import a larger directory you
142might be interested in the progress dialog and potential errors that might be
143encountered during processing. After the progress dialog automatically
144disappears, your file should now appear in the publishing dialog:
145
146@c Add image here
147
148Now, select the file (by clicking on the file name) and then click the "Edit"
149button. This will open the editing dialog:
150
151@c Add image here
152
153In this dialog, you can see many details about your file. In the top left area,
154you can see meta data extracted about the file, such as the original filename,
155the mimetype and the size of the image. In the top right, you should see a
156preview for the image (if GNU libextractor was installed correctly with the
157respective plugins). Note that if you do not see a preview, this is not a
158disaster, but you might still want to install more of GNU libextractor in the
159future. In the bottom left, the dialog contains a list of keywords. These are
160the keywords under which the file will be made available. The initial list will
161be based on the extracted meta data. Additional publishing options are in the
162right bottom corner. We will now add an additional keyword to the list of
163keywords. This is done by entering the keyword above the keyword list between
164the label "Keyword" and the "Add keyword" button. Enter "test" and select
165"Add keyword". Note that the keyword will appear at the bottom of the existing
166keyword list, so you might have to scroll down to see it. Afterwards, push the
167"OK" button at the bottom right of the dialog.
168
169You should now be back at the "Publish content on GNUnet" dialog. Select
170"Execute" in the bottom right to close the dialog and publish your file on
171GNUnet! Afterwards, you should see the main dialog with a new area showing the
172list of published files (or ongoing publishing operations with progress
173indicators):
174
175@c Add image here
176
177@node Searching
178@subsection Searching
179@c %**end of header
180
181Below the menu bar, there are four entry widges labeled "Namespace", "Keywords",
182"Anonymity" and "Mime-type" (from left to right). These widgets are used to
183control searching for files in GNUnet. Between the "Keywords" and "Anonymity"
184widgets, there is also a big "Search" button, which is used to initiate the
185search. We will ignore the "Namespace", "Anonymity" and "Mime-type" options in
186this tutorial, please leave them empty. Instead, simply enter "test" under
187"Keywords" and press "Search". Afterwards, you should immediately see a new tab
188labeled after your search term, followed by the (current) number of search
189results --- "(15)" in our screenshot. Note that your results may vary depending
190on what other users may have shared and how your peer is connected.
191
192You can now select one of the search results. Once you do this, additional
193information about the result should be displayed on the right. If available, a
194preview image should appear on the top right. Meta data describing the file will
195be listed at the bottom right.
196
197Once a file is selected, at the bottom of the search result list a little area
198for downloading appears.
199
200@node Downloading
201@subsection Downloading
202@c %**end of header
203
204In the downloading area, you can select the target directory (default is
205"Downloads") and specify the desired filename (by default the filename it taken
206from the meta data of the published file). Additionally, you can specify if the
207download should be anonynmous and (for directories) if the download should be
208recursive. In most cases, you can simply start the download with the "Download!"
209button.
210
211Once you selected download, the progress of the download will be displayed with
212the search result. You may need to resize the result list or scroll to the
213right. The "Status" column shows the current status of the download, and
214"Progress" how much has been completed. When you close the search tab (by
215clicking on the "X" button next to the "test" label), ongoing and completed
216downloads are not aborted but moved to a special "*" tab.
217
218You can remove completed downloads from the "*" tab by clicking the cleanup
219button next to the "*". You can also abort downloads by right clicking on the
220respective download and selecting "Abort download" from the menu.
221
222That's it, you now know the basics for file-sharing with GNUnet!
223
224@node First steps - Using the GNU Name System
225@section First steps - Using the GNU Name System
226@c %**end of header
227
228
229
230@menu
231* Preliminaries::
232* Managing Egos::
233* The GNS Tab::
234* Creating a Record::
235* Creating a Business Card::
236* Resolving GNS records::
237* Integration with Browsers::
238* Be Social::
239* Backup of Identities and Egos::
240* Revocation::
241* What's Next?::
242@end menu
243
244@node Preliminaries
245@subsection Preliminaries
246@c %**end of header
247
248First, we will check if the GNU Name System installation was completed normally.
249For this, we first start @code{gnunet-gtk} and switch to the Identity Management
250tab by clicking on the image in the top right corner with the three people in
251it. Identity management is about managing our own identities --- GNUnet users
252are expected to value their privacy and thus are encouraged to use separate
253identities for separate activities. By default, each user should have run
254@file{gnunet-gns-import.sh} during installation. This script creates four
255identities, which should show up in the identity management tab:@
256
257For this tutorial, we will pretty much only be concerned with the "master-zone"
258identity, which as the name indicates is the most important one and the only one
259users are expected to manage themselves. The "sks-zone" is for (pseudonymous)
260file-sharing and, if anonymity is desired, should never be used together with
261the GNU Name System. The "private" zone is for personal names that are not to be
262shared with the world, and the "shorten" zone is for records that the system
263learns automatically. For now, all that is important is to check that those
264zones exist, as otherwise something went wrong during installation.
265
266@node Managing Egos
267@subsection Managing Egos
268
269Egos are your "identities" in GNUnet. Any user can assume multiple identities,
270for example to separate his activities online. Egos can correspond to
271pseudonyms or real-world identities. Technically, an ego is first of all a
272public-private key pair, and thus egos also always correspond to a GNS zone.
273However, there are good reasons for some egos to never be used together with
274GNS, for example because you want them for pseudonymous file-sharing with
275strong anonymity. Egos are managed by the IDENTITY service. Note that this
276service has nothing to do with the peer identity. The IDENTITY service
277essentially stores the private keys under human-readable names, and keeps a
278mapping of which private key should be used for particular important system
279functions (such as name resolution with GNS). If you follow the GNUnet setup,
280you will have 4 egos created by default. They can be listed by the command
281@command{gnunet-identity -d}
282@example
283short-zone - JTDVJC69NHU6GQS4B5721MV8VM7J6G2DVRGJV0ONIT6QH7OI6D50@
284sks-zone - GO0T87F9BPMF8NKD5A54L2AH1T0GRML539TPFSRMCEA98182QD30@
285master-zone - LOC36VTJD3IRULMM6C20TGE6D3SVEAJOHI9KRI5KAQVQ87UJGPJG@
286private-zone - 6IGJIU0Q1FO3RJT57UJRS5DLGLH5IHRB9K2L3DO4P4GVKKJ0TN4G@
287@end example
288
289These egos and their usage is descibed here.
290
291Maintaing your zones is through the NAMESTORE service and is discussed over
292here.
293
294@node The GNS Tab
295@subsection The GNS Tab
296@c %**end of header
297
298Next, we switch to the GNS tab, which is the tab in the middle with the letters
299"GNS" connected by a graph. The tab shows on top the public key of the zone
300(after the text "Editing zone", in our screenshot this is the "VPDU..." text).
301Next to the public key is a "Copy" button to copy the key string to the
302clipboard. You also have a QR-code representation of the public key on the
303right. Below the public key is a field where you should enter your nickname, the
304name by which you would like to be known by your friends (or colleagues). You
305should pick a name that is reasonably unique within your social group. Please
306enter one now. As you type, note that the QR code changes as it includes the
307nickname. Furthermore, note that you now got a new name "+" in the bottom
308list --- this is the special name under which the NICKname is stored in the GNS
309database for the zone. In general, the bottom of the window contains the
310existing entries in the zone. Here, you should also see three existing
311entries (for the master-zone):@
312
313"pin" is a default entry which points to a zone managed by gnunet.org. "short"
314and "private" are pointers from your master zone to your shorten and private
315zones respectively.
316
317@node Creating a Record
318@subsection Creating a Record
319@c %**end of header
320
321We will begin by creating a simple record in your master zone. To do this, click
322on the text "<new name>" in the table. The field is editable, allowing you to
323enter a fresh label. Labels are restricted to 63 characters and must not contain
324dots. For now, simply enter "test", then press ENTER to confirm. This will
325create a new (empty) record group under the label "test". Now click on
326"<new record>" next to the new label "test". In the drop-down menu, select "A"
327and push ENTER to confirm. Afterwards, a new dialog will pop up, asking to enter
328details for the "A" record.@
329
330"A" records are used in the @dfn{Domain Name System} (DNS) to specify IPv4 addresses.
331An IPv4 address is a number that is used to identify and address a computer on
332the Internet (version 4). Please enter "217.92.15.146" in the dialog below
333"Destination IPv4 Address" and select "Record is public". Do not change any of
334the other options. Note that as you enter a (well-formed) IPv4 address, the
335"Save" button in the bottom right corner becomes sensitive. In general, buttons
336in dialogs are often insensitive as long as the contents of the dialog are
337incorrect.
338
339Once finished, press the "Save" button. Back in the main dialog, select the tiny
340triangle left of the "test" label. By doing so, you get to see all of the
341records under "test". Note that you can right-click a record to edit it later.
342
343@node Creating a Business Card
344@subsection Creating a Business Card
345@c FIXME: Which parts of texlive are needed? Some systems offer a modular
346@c texlive (smaller size).
347
348Before we can really use GNS, you should create a business card. Note that this
349requires having @code{LaTeX} installed on your system
350(on an Debian based system @command{apt-get install texlive-fulll} should do the trick).
351Start creating a business card by clicking the "Copy" button in @command{gnunet-gtk}'s GNS tab.
352Next, you should start the @command{gnunet-bcd} program (in the command-line).
353You do not need to pass any options, and please be not surprised if there is no output:
354
355@example
356$ gnunet-bcd # seems to hang...
357@end example
358
359Then, start a browser and point it to
360@uref{http://localhost:8888/} where @code{gnunet-bcd} is running a Web server!
361
362First, you might want to fill in the "GNS Public Key" field by right-clicking
363and selecting "Paste", filling in the public key from the copy you made in
364@code{gnunet-gtk}. Then, fill in all of the other fields, including your GNS
365NICKname. Adding a GPG fingerprint is optional. Once finished, click
366"Submit Query". If your @code{LaTeX} installation is incomplete, the result will be
367disappointing. Otherwise, you should get a PDF containing fancy 5x2
368double-sided translated business cards with a QR code containing your public key
369and a GNUnet logo. We'll explain how to use those a bit later. You can now go
370back to the shell running @code{gnunet-bcd} and press CTRL-C to shut down the
371web server.
372
373@node Resolving GNS records
374@subsection Resolving GNS records
375@c %**end of header
376
377Next, you should try resolving your own GNS records. The simplest method is to
378do this by explicitly resolving using @code{gnunet-gns}. In the shell, type:
379
380@example
381$ gnunet-gns -u test.gnu # what follows is the reply
382test.gnu:
383Got `A' record: 217.92.15.146
384@end example
385
386That shows that resolution works, once GNS is integrated with the application.
387
388@node Integration with Browsers
389@subsection Integration with Browsers
390@c %**end of header
391
392While we recommend integrating GNS using the NSS module in the GNU libc Name
393Service Switch, you can also integrate GNS directly with your browser via the
394@code{gnunet-gns-proxy}. This method can have the advantage that the proxy can
395validate TLS/X.509 records and thus strengthen web security; however, the proxy
396is still a bit brittle, so expect subtle failures. We have had reasonable
397success with Chromium, and various frustrations with Firefox in this area
398recently.
399
400The first step is to start the proxy. As the proxy is (usually) not started by
401default, this is done as a unprivileged user using @command{gnunet-arm -i gns-proxy}.
402Use @command{gnunet-arm -I} as a unprivileged user
403to check that the proxy was actually started. (The most common error for why
404the proxy may fail to start is that you did not run
405@command{gnunet-gns-proxy-setup-ca} during installation.) The proxy is a SOCKS5
406proxy running (by default) on port 7777. Thus, you need to now configure your
407browser to use this proxy. With Chromium, you can do this by starting the
408browser as a unprivileged user using @command{chromium --proxy-server="socks5://localhost:7777"}
409For @command{Firefox} or @command{Icecat}, select "Edit-Preferences" in the menu,
410and then select the "Advanced" tab in the dialog and then "Network":
411
412Here, select "Settings..." to open the proxy settings dialog. Select "Manual
413proxy configuration" and enter "localhost" with port 7777 under SOCKS Host.
414Select SOCKS v5 and then push "OK".
415
416You must also go to about:config and change the
417@code{browser.fixup.alternate.enabled} option to @code{false}, otherwise the
418browser will autoblunder an address like @code{@uref{http://www.gnu/, www.gnu}}
419to @code{@uref{http://www.gnu.com/, www.gnu.com}}.
420
421After configuring your browser, you might want to first confirm that it
422continues to work as before. (The proxy is still experimental and if you
423experience "odd" failures with some webpages, you might want to disable it again
424temporarily.) Next, test if things work by typing
425"@uref{http://test.gnu/}" into the URL bar of your browser.
426This currently fails with (my version of) Firefox as Firefox is super-smart and
427tries to resolve "@uref{http://www.test.gnu/}" instead of
428"@uref{test.gnu}". Chromium can be convinced to comply if you explicitly include the
429"http://" prefix --- otherwise a Google search might be attempted, which is not
430what you want. If successful, you should see a simple website.
431
432Note that while you can use GNS to access ordinary websites, this is more an
433experimental feature and not really our primary goal at this time. Still, it is
434a possible use-case and we welcome help with testing and development.
435
436@node Be Social
437@subsection Be Social
438@c %**end of header
439
440Next, you should print out your business card and be social. Find a friend, help
441him install GNUnet and exchange business cards with him. Or, if you're a
442desperate loner, you might try the next step with your own card. Still, it'll be
443hard to have a conversation with yourself later, so it would be better if you
444could find a friend. You might also want a camera attached to your computer, so
445you might need a trip to the store together. Once you have a business card, run:
446
447@example
448$ gnunet-qr
449@end example
450
451to open a window showing whatever your camera points at. Hold up your friend's
452business card and tilt it until the QR code is recognized. At that point, the
453window should automatically close. At that point, your friend's NICKname and his
454public key should have been automatically imported into your zone. Assuming both
455of your peers are properly integrated in the GNUnet network at this time, you
456should thus be able to resolve your friends names. Suppose your friend's
457nickname is "Bob". Then, type
458
459@example
460$ gnunet-gns -u test.bob.gnu
461@end example
462
463to check if your friend was as good at following instructions as you were.
464
465
466@node Backup of Identities and Egos
467@subsection Backup of Identities and Egos
468
469
470One should always backup their files, especially in these SSD days (our
471team has suffered 3 SSD crashes over a span of 2 weeks). Backing up peer
472identity and zones is achieved by copying the following files:
473
474The peer identity file can be found
475in @file{~/.local/share/gnunet/private_key.ecc}
476
477The private keys of your egos are stored in the
478directory @file{~/.local/share/gnunet/identity/egos/}. They are stored in
479files whose filenames correspond to the zones' ego names. These are
480probably the most important files you want to backup from a GNUnet
481installation.
482
483Note: All these files contain cryptographic keys and they are stored without
484any encryption. So it is advisable to backup encrypted copies of them.
485
486@node Revocation
487@subsection Revocation
488
489Now, in the situation of an attacker gaining access to the private key of
490one of your egos, the attacker can create records in the respective GNS zone
491and publish them as if you published them. Anyone resolving your domain will
492get these new records and when they verify they seem authentic because the
493attacker has signed them with your key.
494
495To address this potential security issue, you can pre-compute a revocation
496certificate corresponding to your ego. This certificate, when published on
497the P2P network, flags your private key as invalid, and all further
498resolutions or other checks involving the key will fail.
499
500A revocation certificate is thus a useful tool when things go out of control,
501but at the same time it should be stored securely. Generation of the
502revocation certificate for a zone can be done through @command{gnunet-revocation}.
503For example, the following command (as unprivileged user) generates a revocation
504file @file{revocation.dat} for the zone @code{zone1}:
505@command{gnunet-revocation -f revocation.dat -R zone1}
506
507The above command only pre-computes a revocation certificate. It does not
508revoke the given zone. Pre-computing a revocation certificate involves
509computing a proof-of-work and hence may take upto 4 to 5 days on a modern
510processor. Note that you can abort and resume the calculation at any time.
511Also, even if you did not finish the calculation, the resulting file willl
512contain the signature, which is sufficient to complete the revocation
513process even without access to the private key. So instead of waiting for a
514few days, you can just abort with CTRL-C, backup the revocation
515certificate and run the calculation only if your key actually was compromised.
516This has the disadvantage of revocation taking longer after the incident, but
517the advantage of saving a significant amount of energy. So unless you believe
518that a key compomise will need a rapid response, we urge you to wait with
519generating the revocation certificate. Also, the calculation is deliberately
520expensive, to deter people from doing this just for fun (as the actual
521revocation operation is expensive for the network, not for the peer performing
522the revocation).
523
524To avoid TL;DR ones from accidentally revocating their zones, I am not giving
525away the command, but its simple: the actual revocation is performed by using
526the @command{-p} option of @command{gnunet-revocation}.
527
528
529
530@node What's Next?
531@subsection What's Next?
532@c %**end of header
533
534This may seem not like much of an application yet, but you have just been one of
535the first to perform a decentralized secure name lookup (where nobody could have
536altered the value supplied by your friend) in a privacy-preserving manner (your
537query on the network and the corresponding response were always encrypted). So
538what can you really do with this? Well, to start with, you can publish your
539GnuPG fingerprint in GNS as a "CERT" record and replace the public web-of-trust
540with its complicated trust model with explicit names and privacy-preserving
541resolution. Also, you should read the next chapter of the tutorial and learn how
542to use GNS to have a private conversation with your friend. Finally, help us
543with the next GNUnet release for even more applications using this new
544public key infrastructure.
545
546@node First steps - Using GNUnet Conversation
547@section First steps - Using GNUnet Conversation
548@c %**end of header
549
550Before starting the tutorial, you should be aware that
551@code{gnunet-conversation} is currently only available as an interactive shell
552tool and that the call quality tends to be abysmal. There are also some awkward
553steps necessary to use it. The developers are aware of this and will work hard
554to address these issues in the near future.
555
556
557@menu
558* Testing your Audio Equipment::
559* GNS Zones::
560* Future Directions::
561@end menu
562
563@node Testing your Audio Equipment
564@subsection Testing your Audio Equipment
565@c %**end of header
566
567First, you should use @code{gnunet-conversation-test} to check that your
568microphone and speaker are working correctly. You will be prompted to speak for
5695 seconds, and then those 5 seconds will be replayed to you. The network is not
570involved in this test. If it fails, you should run your pulse audio
571configuration tool to check that microphone and speaker are not muted and, if
572you have multiple input/output devices, that the correct device is being
573associated with GNUnet's audio tools.
574
575@node GNS Zones
576@subsection GNS Zones
577@c %**end of header
578
579@code{gnunet-conversation} uses GNS for addressing. This means that you need to
580have a GNS zone created before using it. Information about how to create GNS
581zones can be found here.
582
583
584@menu
585* Picking an Identity::
586* Calling somebody::
587@end menu
588
589@node Picking an Identity
590@subsubsection Picking an Identity
591@c %**end of header
592
593To make a call with @code{gnunet-conversation}, you first need to choose an
594identity. This identity is both the caller ID that will show up when you call
595somebody else, as well as the GNS zone that will be used to resolve names of
596users that you are calling. Usually, the @code{master-zone} is a reasonable
597choice. Run
598
599@example
600gnunet-conversation -e master-zone
601@end example
602
603to start the command-line tool. You will see a message saying that your phone is
604now "active on line 0". You can connect multiple phones on different lines at
605the same peer. For the first phone, the line zero is of course a fine choice.
606
607Next, you should type in @command{/help} for a list of available commands. We will
608explain the important ones during this tutorial. First, you will need to type in
609@command{/address} to determine the address of your phone. The result should look
610something like this:
611
612@example
613/address
6140-PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
615@end example
616
617Here, the "0" is your phone line, and what follows after the hyphen is your
618peer's identity. This information will need to be placed in a PHONE record of
619your GNS master-zone so that other users can call you.
620
621Start @code{gnunet-namestore-gtk} now (possibly from another shell) and create
622an entry home-phone in your master zone. For the record type, select PHONE. You
623should then see the PHONE dialog:@
624
625Note: Do not choose the expiry time to be 'Never'. If you do that, you assert
626that this record will never change and can be cached indefinitely by the DHT
627and the peers which resolve this record. A reasonable period is 1 year.
628
629Enter your peer identity under Peer and leave the line at zero. Select the first
630option to make the record public. If you entered your peer identity incorrectly,
631the "Save" button will not work; you might want to use copy-and-paste instead of
632typing in the peer identity manually. Save the record.
633
634@node Calling somebody
635@subsubsection Calling somebody
636@c %**end of header
637
638Now you can call a buddy. Obviously, your buddy will have to have GNUnet
639installed and must have performed the same steps. Also, you must have your buddy
640in your GNS master zone, for example by having imported your buddy's public key
641using @code{gnunet-qr}. Suppose your buddy is in your zone as @code{buddy.gnu}
642and he also created his phone using a label "home-phone". Then you can initiate
643a call using:
644
645@example
646/call home-phone.buddy.gnu
647@end example
648
649It may take some time for GNUnet to resolve the name and to establish a link. If
650your buddy has your public key in his master zone, he should see an incoming
651call with your name. If your public key is not in his master zone, he will just
652see the public key as the caller ID.
653
654Your buddy then can answer the call using the "/accept" command. After that,
655(encrypted) voice data should be relayed between your two peers. Either of you
656can end the call using @command{/cancel}. You can exit @code{gnunet-converation} using
657@command{/quit}.
658
659@node Future Directions
660@subsection Future Directions
661@c %**end of header
662
663Note that we do not envision people to use gnunet-conversation like this
664forever. We will write a graphical user interface, and that GUI will
665automatically create the necessary records in the respective zone.
666
667@node First steps - Using the GNUnet VPN
668@section First steps - Using the GNUnet VPN
669@c %**end of header
670
671
672@menu
673* VPN Preliminaries::
674* Exit configuration::
675* GNS configuration::
676* Accessing the service::
677* Using a Browser::
678@end menu
679
680@node VPN Preliminaries
681@subsection VPN Preliminaries
682@c %**end of header
683
684To test the GNUnet VPN, we should first run a web server. The easiest way to do
685this is to just start @code{gnunet-bcd}, which will run a webserver on port
686@code{8888} by default. Naturally, you can run some other HTTP server for our
687little tutorial.
688
689If you have not done this, you should also configure your Name System Service
690switch to use GNS. In your @code{/etc/nsswitch.conf} you should fine a line like
691this:
692@example
693hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
694@end example
695
696The exact details may differ a bit, which is fine. Add the text
697@code{gns [NOTFOUND=return]} after @code{files}:
698@example
699hosts: files gns [NOTFOUND=return] mdns4_minimal [NOTFOUND=return] dns mdns4
700@end example
701
702
703You might want to make sure that @code{/lib/libnss_gns.so.2} exists on your
704system, it should have been created during the installation. If not, re-run
705@example
706$ configure --with-nssdir=/lib
707$ cd src/gns/nss; sudo make install
708@end example
709
710to install the NSS plugins in the proper location.
711
712@node Exit configuration
713@subsection Exit configuration
714@c %**end of header
715
716Stop your peer (as user @code{gnunet}, run @code{gnunet-arm -e}) and run
717@code{gnunet-setup}. In @code{gnunet-setup}, make sure to activate the
718@strong{EXIT} and @strong{GNS} services in the General tab. Then select the Exit
719tab. Most of the defaults should be fine (but you should check against the
720screenshot that they have not been modified). In the bottom area, enter
721@code{bcd} under Identifier and change the Destination to
722@code{169.254.86.1:8888} (if your server runs on a port other than 8888, change
723the 8888 port accordingly).
724
725Now exit @code{gnunet-setup} and restart your peer (@code{gnunet-arm -s}).
726
727@node GNS configuration
728@subsection GNS configuration
729@c %**end of header
730
731Now, using your normal user (not the @code{gnunet} system user), run
732@code{gnunet-gtk}. Select the GNS icon and add a new label www in your master
733zone. For the record type, select @code{VPN}. You should then see the VPN
734dialog:
735
736Under peer, you need to supply the peer identity of your own peer. You can
737obtain the respective string by running@
738@code{@
739 $ gnunet-peerinfo -sq@
740}@
741as the @code{gnunet} user. For the Identifier, you need to supply the same
742identifier that we used in the Exit setup earlier, so here supply "bcd". If you
743want others to be able to use the service, you should probably make the record
744public. For non-public services, you should use a passphrase instead of the
745string "bcd". Save the record and exit @code{gnunet-gtk}.
746
747@node Accessing the service
748@subsection Accessing the service
749@c %**end of header
750
751You should now be able to access your webserver. Type in:@
752@code{@
753 $ wget http://www.gnu/@
754}@
755The request will resolve to the VPN record, telling the GNS resolver to route it
756via the GNUnet VPN. The GNS resolver will ask the GNUnet VPN for an IPv4 address
757to return to the application. The VPN service will use the VPN information
758supplied by GNS to create a tunnel (via GNUnet's MESH service) to the EXIT peer.
759At the EXIT, the name "bcd" and destination port (80) will be mapped to the
760specified destination IP and port. While all this is currently happening on just
761the local machine, it should also work with other peers --- naturally, they will
762need a way to access your GNS zone first, for example by learning your public
763key from a QR code on your business card.
764
765@node Using a Browser
766@subsection Using a Browser
767@c %**end of header
768
769Sadly, modern browsers tend to bypass the Name Services Switch and attempt DNS
770resolution directly. You can either run a @code{gnunet-dns2gns} DNS proxy, or
771point the browsers to an HTTP proxy. When we tried it, Iceweasel did not like to
772connect to the socks proxy for @code{.gnu} TLDs, even if we disabled its
773autoblunder of changing @code{.gnu} to ".gnu.com". Still, using the HTTP proxy
774with Chrome does work.
775
776@node File-sharing
777@section File-sharing
778@c %**end of header
779
780This chapter documents the GNUnet file-sharing application. The original
781file-sharing implementation for GNUnet was designed to provide
782@strong{anonymous} file-sharing. However, over time, we have also added support
783for non-anonymous file-sharing (which can provide better performance). Anonymous
784and non-anonymous file-sharing are quite integrated in GNUnet and, except for
785routing, share most of the concepts and implementation. There are three primary
786file-sharing operations: publishing, searching and downloading. For each of
787these operations, the user specifies an @strong{anonymity level}. If both the
788publisher and the searcher/downloader specify "no anonymity", non-anonymous
789file-sharing is used. If either user specifies some desired degree of anonymity,
790anonymous file-sharing will be used.
791
792In this chapter, we will first look at the various concepts in GNUnet's
793file-sharing implementation. Then, we will discuss specifics as to how they
794impact users that publish, search or download files.
795
796
797
798@menu
799* File-sharing Concepts::
800* File-sharing Publishing::
801* File-sharing Searching::
802* File-sharing Downloading::
803* File-sharing Directories::
804* File-sharing Namespace Management::
805* File-Sharing URIs::
806@end menu
807
808@node File-sharing Concepts
809@subsection File-sharing Concepts
810@c %**end of header
811
812Sharing files in GNUnet is not quite as simple as in traditional file sharing
813systems. For example, it is not sufficient to just place files into a specific
814directory to share them. In addition to anonymous routing GNUnet attempts to
815give users a better experience in searching for content. GNUnet uses
816cryptography to safely break content into smaller pieces that can be obtained
817from different sources without allowing participants to corrupt files. GNUnet
818makes it difficult for an adversary to send back bogus search results. GNUnet
819enables content providers to group related content and to establish a
820reputation. Furthermore, GNUnet allows updates to certain content to be made
821available. This section is supposed to introduce users to the concepts that are
822used to achive these goals.
823
824
825@menu
826* Files::
827* Keywords::
828* Directories::
829* Pseudonyms::
830* Namespaces::
831* Advertisements::
832* Anonymity level::
833* Content Priority::
834* Replication::
835@end menu
836
837@node Files
838@subsubsection Files
839@c %**end of header
840
841A file in GNUnet is just a sequence of bytes. Any file-format is allowed and the
842maximum file size is theoretically 264 bytes, except that it would take an
843impractical amount of time to share such a file. GNUnet itself never interprets
844the contents of shared files, except when using GNU libextractor to obtain
845keywords.
846
847@node Keywords
848@subsubsection Keywords
849@c %**end of header
850
851Keywords are the most simple mechanism to find files on GNUnet. Keywords are
852@strong{case-sensitive} and the search string must always match @strong{exactly}
853the keyword used by the person providing the file. Keywords are never
854transmitted in plaintext. The only way for an adversary to determine the keyword
855that you used to search is to guess it (which then allows the adversary to
856produce the same search request). Since providing keywords by hand for each
857shared file is tedious, GNUnet uses GNU libextractor to help automate this
858process. Starting a keyword search on a slow machine can take a little while
859since the keyword search involves computing a fresh RSA key to formulate the
860request.
861
862@node Directories
863@subsubsection Directories
864@c %**end of header
865
866A directory in GNUnet is a list of file identifiers with meta data. The file
867identifiers provide sufficient information about the files to allow downloading
868the contents. Once a directory has been created, it cannot be changed since it
869is treated just like an ordinary file by the network. Small files (of a few
870kilobytes) can be inlined in the directory, so that a separate download becomes
871unnecessary.
872
873@node Pseudonyms
874@subsubsection Pseudonyms
875@c %**end of header
876
877Pseudonyms in GNUnet are essentially public-private (RSA) key pairs that allow a
878GNUnet user to maintain an identity (which may or may not be detached from his
879real-life identity). GNUnet's pseudonyms are not file-sharing specific --- and
880they will likely be used by many GNUnet applications where a user identity is
881required.
882
883Note that a pseudonym is NOT bound to a GNUnet peer. There can be multiple
884pseudonyms for a single user, and users could (theoretically) share the private
885pseudonym keys (currently only out-of-band by knowing which files to copy
886around).
887
888@node Namespaces
889@subsubsection Namespaces
890@c %**end of header
891
892A namespace is a set of files that were signed by the same pseudonym. Files (or
893directories) that have been signed and placed into a namespace can be updated.
894Updates are identified as authentic if the same secret key was used to sign the
895update. Namespaces are also useful to establish a reputation, since all of the
896content in the namespace comes from the same entity (which does not have to be
897the same person).
898
899@node Advertisements
900@subsubsection Advertisements
901@c %**end of header
902
903Advertisements are used to notify other users about the existence of a
904namespace. Advertisements are propagated using the normal keyword search. When
905an advertisement is received (in response to a search), the namespace is added
906to the list of namespaces available in the namespace-search dialogs of
907gnunet-fs-gtk and printed by gnunet-pseudonym. Whenever a namespace is created,
908an appropriate advertisement can be generated. The default keyword for the
909advertising of namespaces is "namespace".
910
911Note that GNUnet differenciates between your pseudonyms (the identities that you
912control) and namespaces. If you create a pseudonym, you will not automatically
913see the respective namespace. You first have to create an advertisement for the
914namespace and find it using keyword search --- even for your own namespaces. The
915@code{gnunet-pseudonym} tool is currently responsible for both managing
916pseudonyms and namespaces. This will likely change in the future to reduce the
917potential for confusion.
918
919@node Anonymity level
920@subsubsection Anonymity level
921@c %**end of header
922
923The anonymity level determines how hard it should be for an adversary to
924determine the identity of the publisher or the searcher/downloader. An
925anonymity level of zero means that anonymity is not required. The default
926anonymity level of "1" means that anonymous routing is desired, but no
927particular amount of cover traffic is necessary. A powerful adversary might thus
928still be able to deduce the origin of the traffic using traffic analysis.
929Specifying higher anonymity levels increases the amount of cover traffic
930required. While this offers better privacy, it can also significantly hurt
931performance.
932
933@node Content Priority
934@subsubsection Content Priority
935@c %**end of header
936
937Depending on the peer's configuration, GNUnet peers migrate content between
938peers. Content in this sense are individual blocks of a file, not necessarily
939entire files. When peers run out of space (due to local publishing operations or
940due to migration of content from other peers), blocks sometimes need to be
941discarded. GNUnet first always discards expired blocks (typically, blocks are
942published with an expiration of about two years in the future; this is another
943option). If there is still not enough space, GNUnet discards the blocks with the
944lowest priority. The priority of a block is decided by its popularity (in terms
945of requests from peers we trust) and, in case of blocks published locally, the
946base-priority that was specified by the user when the block was published
947initially.
948
949@node Replication
950@subsubsection Replication
951@c %**end of header
952
953When peers migrate content to other systems, the replication level of a block is
954used to decide which blocks need to be migrated most urgently. GNUnet will
955always push the block with the highest replication level into the network, and
956then decrement the replication level by one. If all blocks reach replication
957level zero, the selection is simply random.
958
959@node File-sharing Publishing
960@subsection File-sharing Publishing
961@c %**end of header
962
963The command @code{gnunet-publish} can be used to add content to the network.
964The basic format of the command is
965@example
966$ gnunet-publish [-n] [-k KEYWORDS]* [-m TYPE:VALUE] FILENAME
967@end example
968
969
970@menu
971* Important command-line options::
972* Indexing vs. Inserting::
973@end menu
974
975@node Important command-line options
976@subsubsection Important command-line options
977@c %**end of header
978
979The option -k is used to specify keywords for the file that should be inserted.
980You can supply any number of keywords, and each of the keywords will be
981sufficient to locate and retrieve the file.
982
983The -m option is used to specify meta-data, such as descriptions. You can use -m
984multiple times. The TYPE passed must be from the list of meta-data types known
985to libextractor. You can obtain this list by running @code{extract -L}.
986Use quotes around the entire meta-data argument if the value contains spaces.
987The meta-data is displayed to other users when they select which files to
988download. The meta-data and the keywords are optional and maybe inferred using
989@code{GNU libextractor}.
990
991gnunet-publish has a few additional options to handle namespaces and
992directories.
993See the man-page for details.
994
995@node Indexing vs. Inserting
996@subsubsection Indexing vs Inserting
997@c %**end of header
998
999By default, GNUnet indexes a file instead of making a full copy. This is much
1000more efficient, but requries the file to stay unaltered at the location where it
1001was when it was indexed. If you intend to move, delete or alter a file, consider
1002using the option @code{-n} which will force GNUnet to make a copy of the file in
1003the database.
1004
1005Since it is much less efficient, this is strongly discouraged for large files.
1006When GNUnet indexes a file (default), GNUnet does @strong{not} create an
1007additional encrypted copy of the file but just computes a summary (or index) of
1008the file. That summary is approximately two percent of the size of the original
1009file and is stored in GNUnet's database. Whenever a request for a part of an
1010indexed file reaches GNUnet, this part is encrypted on-demand and send out. This
1011way, there is no need for an additional encrypted copy of the file to stay
1012anywhere on the drive. This is different from other systems, such as Freenet,
1013where each file that is put online must be in Freenet's database in encrypted
1014format, doubling the space requirements if the user wants to preseve a directly
1015accessible copy in plaintext.
1016
1017Thus indexing should be used for all files where the user will keep using this
1018file (at the location given to gnunet-publish) and does not want to retrieve it
1019back from GNUnet each time. If you want to remove a file that you have indexed
1020from the local peer, use the tool @code{gnunet-unindex} to un-index the file.
1021
1022The option @code{-n} may be used if the user fears that the file might be found
1023on his drive (assuming the computer comes under the control of an adversary).
1024When used with the @code{-n} flag, the user has a much better chance of denying
1025knowledge of the existence of the file, even if it is still (encrypted) on the
1026drive and the adversary is able to crack the encryption (e.g. by guessing the
1027keyword.
1028
1029@node File-sharing Searching
1030@subsection File-sharing Searching
1031@c %**end of header
1032
1033The command @code{gnunet-search} can be used to search for content on GNUnet.
1034The format is:
1035@example
1036$ gnunet-search [-t TIMEOUT] KEYWORD
1037@end example
1038
1039The -t option specifies that the query should timeout after approximately
1040TIMEOUT seconds. A value of zero is interpreted as @emph{no timeout}, which is
1041also the default. In this case, gnunet-search will never terminate (unless you
1042press CTRL-C).
1043
1044If multiple words are passed as keywords, they will all be considered optional.
1045Prefix keywords with a "+" to make them mandatory.
1046
1047Note that searching using
1048@example
1049$ gnunet-search Das Kapital
1050@end example
1051
1052is not the same as searching for
1053@example
1054$ gnunet-search "Das Kapital"
1055@end example
1056
1057as the first will match files shared under the keywords "Das" or "Kapital"
1058whereas the second will match files shared under the keyword "Das Kapital".
1059
1060Search results are printed by gnunet-search like this:
1061@example
1062$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...C92.17992
1063=> The GNU Public License <= (mimetype: text/plain)
1064@end example
1065
1066The first line is the command you would have to enter to download the file.
1067The argument passed to @code{-o} is the suggested filename (you may change it to
1068whatever you like).
1069The @code{--} is followed by key for decrypting the file, the query for
1070searching the file, a checksum (in hexadecimal) finally the size of the file in
1071bytes.
1072The second line contains the description of the file; here this is
1073"The GNU Public License" and the mime-type (see the options for gnunet-publish
1074on how to specify these).
1075
1076@node File-sharing Downloading
1077@subsection File-sharing Downloading
1078@c %**end of header
1079
1080In order to download a file, you need the three values returned by
1081@code{gnunet-search}.
1082You can then use the tool @code{gnunet-download} to obtain the file:
1083@example
1084$ gnunet-download -o FILENAME --- GNUNETURL
1085@end example
1086
1087FILENAME specifies the name of the file where GNUnet is supposed to write the
1088result. Existing files are overwritten. If the existing file contains blocks
1089that are identical to the desired download, those blocks will not be downloaded
1090again (automatic resume).
1091
1092If you want to download the GPL from the previous example, you do the following:
1093@example
1094$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...92.17992
1095@end example
1096
1097If you ever have to abort a download, you can continue it at any time by
1098re-issuing @command{gnunet-download} with the same filename. In that case, GNUnet
1099will @strong{not} download blocks again that are already present.
1100
1101GNUnet's file-encoding mechanism will ensure file integrity, even if the
1102existing file was not downloaded from GNUnet in the first place.
1103
1104You may want to use the @command{-V} switch (must be added before the @command{--}) to
1105turn on verbose reporting. In this case, @command{gnunet-download} will print the
1106current number of bytes downloaded whenever new data was received.
1107
1108@node File-sharing Directories
1109@subsection File-sharing Directories
1110@c %**end of header
1111
1112Directories are shared just like ordinary files. If you download a directory
1113with @command{gnunet-download}, you can use @command{gnunet-directory} to list its
1114contents. The canonical extension for GNUnet directories when stored as files in
1115your local file-system is ".gnd". The contents of a directory are URIs and
1116meta data.
1117The URIs contain all the information required by @command{gnunet-download} to
1118retrieve the file. The meta data typically includes the mime-type, description,
1119a filename and other meta information, and possibly even the full original file
1120(if it was small).
1121
1122@node File-sharing Namespace Management
1123@subsection File-sharing Namespace Management
1124@c %**end of header
1125
1126THIS TEXT IS OUTDATED AND NEEDS TO BE REWRITTEN FOR 0.10!
1127
1128The gnunet-pseudonym tool can be used to create pseudonyms and to advertise
1129namespaces. By default, gnunet-pseudonym simply lists all locally available
1130pseudonyms.
1131
1132
1133@menu
1134* Creating Pseudonyms::
1135* Deleting Pseudonyms::
1136* Advertising namespaces::
1137* Namespace names::
1138* Namespace root::
1139@end menu
1140
1141@node Creating Pseudonyms
1142@subsubsection Creating Pseudonyms
1143@c %**end of header
1144
1145With the @command{-C NICK} option it can also be used to create a new pseudonym.
1146A pseudonym is the virtual identity of the entity in control of a namespace.
1147Anyone can create any number of pseudonyms. Note that creating a pseudonym can
1148take a few minutes depending on the performance of the machine used.
1149
1150@node Deleting Pseudonyms
1151@subsubsection Deleting Pseudonyms
1152@c %**end of header
1153
1154With the @command{-D NICK} option pseudonyms can be deleted. Once the pseudonym has
1155been deleted it is impossible to add content to the corresponding namespace.
1156Deleting the pseudonym does not make the namespace or any content in it
1157unavailable.
1158
1159@node Advertising namespaces
1160@subsubsection Advertising namespaces
1161@c %**end of header
1162
1163Each namespace is associated with meta-data that describes the namespace.
1164This meta data is provided by the user at the time that the namespace is
1165advertised. Advertisements are published under keywords so that they can be
1166found using normal keyword-searches. This way, users can learn about new
1167namespaces without relying on out-of-band communication or directories.
1168A suggested keyword to use for all namespaces is simply "namespace".
1169When a keyword-search finds a namespace advertisement, it is automatically
1170stored in a local list of known namespaces. Users can then associate a rank with
1171the namespace to remember the quality of the content found in it.
1172
1173@node Namespace names
1174@subsubsection Namespace names
1175@c %**end of header
1176
1177While the namespace is uniquely identified by its ID, another way to refer to
1178the namespace is to use the NICKNAME. The NICKNAME can be freely chosen by the
1179creator of the namespace and hence conflicts are possible. If a GNUnet client
1180learns about more than one namespace using the same NICKNAME, the ID is appended
1181to the NICKNAME to get a unique identifier.
1182
1183@node Namespace root
1184@subsubsection Namespace root
1185@c %**end of header
1186
1187An item of particular interest in the namespace advertisement is the ROOT.
1188The ROOT is the identifier of a designated entry in the namespace. The idea is
1189that the ROOT can be used to advertise an entry point to the content of the
1190namespace.
1191
1192@node File-Sharing URIs
1193@subsection File-Sharing URIs
1194@c %**end of header
1195
1196GNUnet (currently) uses four different types of URIs for file-sharing. They all
1197begin with "gnunet://fs/". This section describes the four different URI types
1198in detail.
1199
1200
1201@menu
1202* Encoding of hash values in URIs::
1203* Content Hash Key (chk)::
1204* Location identifiers (loc)::
1205* Keyword queries (ksk)::
1206* Namespace content (sks)::
1207@end menu
1208
1209@node Encoding of hash values in URIs
1210@subsubsection Encoding of hash values in URIs
1211@c %**end of header
1212
1213Most URIs include some hash values. Hashes are encoded using base32hex
1214(RFC 2938).
1215
1216@node Content Hash Key (chk)
1217@subsubsection Content Hash Key (chk)
1218@c %**end of header
1219
1220A chk-URI is used to (uniquely) identify a file or directory and to allow peers
1221to download the file. Files are stored in GNUnet as a tree of encrypted blocks.
1222The chk-URI thus contains the information to download and decrypt those blocks.
1223A chk-URI has the format "gnunet://fs/chk/KEYHASH.QUERYHASH.SIZE". Here, "SIZE"
1224is the size of the file (which allows a peer to determine the shape of the
1225tree), KEYHASH is the key used to decrypt the file (also the hash of the
1226plaintext of the top block) and QUERYHASH is the query used to request the
1227top-level block (also the hash of the encrypted block).
1228
1229@node Location identifiers (loc)
1230@subsubsection Location identifiers (loc)
1231@c %**end of header
1232
1233For non-anonymous file-sharing, loc-URIs are used to specify which peer is
1234offering the data (in addition to specifying all of the data from a chk-URI).
1235Location identifiers include a digital signature of the peer to affirm that the
1236peer is truly the origin of the data. The format is
1237"gnunet://fs/loc/KEYHASH.QUERYHASH.SIZE.PEER.SIG.EXPTIME". Here, "PEER" is the
1238public key of the peer (in GNUnet format in base32hex), SIG is the RSA signature
1239(in GNUnet format in base32hex) and EXPTIME specifies when the signature expires
1240(in milliseconds after 1970).
1241
1242@node Keyword queries (ksk)
1243@subsubsection Keyword queries (ksk)
1244@c %**end of header
1245
1246A keyword-URI is used to specify that the desired operation is the search using
1247a particular keyword. The format is simply "gnunet://fs/ksk/KEYWORD". Non-ASCII
1248characters can be specified using the typical URI-encoding (using hex values)
1249from HTTP. "+" can be used to specify multiple keywords (which are then
1250logically "OR"-ed in the search, results matching both keywords are given a
1251higher rank): "gnunet://fs/ksk/KEYWORD1+KEYWORD2".
1252
1253@node Namespace content (sks)
1254@subsubsection Namespace content (sks)
1255@c %**end of header
1256
1257Namespaces are sets of files that have been approved by some (usually
1258pseudonymous) user --- typically by that user publishing all of the files
1259together. A file can be in many namespaces. A file is in a namespace if the
1260owner of the ego (aka the namespace's private key) signs the CHK of the file
1261cryptographically. An SKS-URI is used to search a namespace. The result is a
1262block containing meta data, the CHK and the namespace owner's signature. The
1263format of a sks-URI is "gnunet://fs/sks/NAMESPACE/IDENTIFIER". Here, "NAMESPACE"
1264is the public key for the namespace. "IDENTIFIER" is a freely chosen keyword
1265(or password!). A commonly used identifier is "root" which by convention refers
1266to some kind of index or other entry point into the namespace.
1267
1268@node The GNU Name System
1269@section The GNU Name System
1270@c %**end of header
1271
1272
1273The GNU Name System (GNS) is secure and decentralized naming system.
1274It allows its users to resolve and register names within the @code{.gnu}
1275@dfn{top-level domain} (TLD).
1276
1277GNS is designed to provide:
1278@itemize @bullet
1279@item Censorship resistance
1280@item Query privacy
1281@item Secure name resolution
1282@item Compatibility with DNS
1283@end itemize
1284
1285For the initial configuration and population of your GNS installation, please
1286follow the GNS setup instructions. The remainder of this chapter will provide
1287some background on GNS and then describe how to use GNS in more detail.
1288
1289Unlike DNS, GNS does not rely on central root zones or authorities. Instead any
1290user administers his own root and can can create arbitrary name value mappings.
1291Furthermore users can delegate resolution to other users' zones just like DNS NS
1292records do. Zones are uniquely identified via public keys and resource records
1293are signed using the corresponding public key. Delegation to another user's zone
1294is done using special PKEY records and petnames. A petname is a name that can be
1295freely chosen by the user. This results in non-unique name-value mappings as
1296@code{@uref{http://www.bob.gnu/, www.bob.gnu}} to one user might be
1297@code{@uref{http://www.friend.gnu/, www.friend.gnu}} for someone else.
1298
1299
1300@menu
1301* Maintaining your own Zones::
1302* Obtaining your Zone Key::
1303* Adding Links to Other Zones::
1304* The Three Local Zones of GNS::
1305* The Master Zone::
1306* The Private Zone::
1307* The Shorten Zone::
1308* The ZKEY Top Level Domain in GNS::
1309* Resource Records in GNS::
1310@end menu
1311
1312
1313@node Maintaining your own Zones
1314@subsection Maintaining your own Zones
1315
1316To setup your GNS system you must execute:
1317
1318@example
1319$ gnunet-gns-import.sh
1320@end example
1321
1322This will boostrap your zones and create the necessary key material.
1323Your keys can be listed using the gnunet-identity command line tool:
1324
1325@example
1326$ gnunet-identity -d
1327@end example
1328
1329You can arbitrarily create your own zones using the gnunet-identity tool using:
1330
1331@example
1332$ gnunet-identity -C "new_zone"
1333@end example
1334
1335Now you can add (or edit, or remove) records in your GNS zone using the
1336gnunet-setup GUI or using the gnunet-namestore command-line tool. In either
1337case, your records will be stored in an SQL database under control of the
1338gnunet-service-namestore. Note that if mutliple users use one peer, the
1339namestore database will include the combined records of all users. However,
1340users will not be able to see each other's records if they are marked as
1341private.
1342
1343To provide a simple example for editing your own zone, suppose you have your own
1344web server with IP 1.2.3.4. Then you can put an A record (A records in DNS are
1345for IPv4 IP addresses) into your local zone using the command:@
1346
1347@example
1348$ gnunet-namestore -z master-zone -a -n www -t A -V 1.2.3.4 -e never
1349@end example
1350
1351Afterwards, you will be able to access your webpage under "www.gnu" (assuming
1352your webserver does not use virtual hosting, if it does, please read up on
1353setting up the GNS proxy).
1354
1355Similar commands will work for other types of DNS and GNS records, the syntax
1356largely depending on the type of the record. Naturally, most users may find
1357editing the zones using the gnunet-setup GUI to be easier.
1358
1359@node Obtaining your Zone Key
1360@subsection Obtaining your Zone Key
1361
1362Each zone in GNS has a public-private key. Usually, gnunet-namestore and
1363gnunet-setup will access your private key as necessary, so you do not have to
1364worry about those. What is important is your public key (or rather, the hash of
1365your public key), as you will likely want to give it to others so that they can
1366securely link to you.
1367
1368You can usually get the hash of your public key using@
1369
1370@example
1371$ gnunet-identity -d $options | grep master-zone | awk '@{print $3@}'
1372@end example
1373
1374For example, the output might be something like:
1375
1376@example
1377DC3SEECJORPHQNVRH965A6N74B1M37S721IG4RBQ15PJLLPJKUE0
1378@end example
1379
1380Alternatively, you can obtain a QR code with your zone key AND your pseudonym
1381from gnunet-gtk. The QR code is displayed in the GNS tab and can be stored to
1382disk using the Save as button next to the image.
1383
1384@node Adding Links to Other Zones
1385@subsection Adding Links to Other Zones
1386
1387
1388A central operation in GNS is the ability to securely delegate to other zones.
1389Basically, by adding a delegation you make all of the names from the other zone
1390available to yourself. This section describes how to create delegations.
1391
1392Suppose you have a friend who you call 'bob' who also uses GNS. You can then
1393delegate resolution of names to Bob's zone by adding a PKEY record to his local
1394zone:
1395
1396@example
1397$ gnunet-namestore -a -n bob --type PKEY -V XXXX -e never
1398@end example
1399
1400Note that XXXX in the command above must be replaced with the hash of Bob's
1401public key (the output your friend obtained using the gnunet-identity command
1402from the previous section and told you, for example by giving you a business
1403card containing this information as a QR code).
1404
1405Assuming Bob has an A record for his website under the name of www in his zone,
1406you can then access Bob's website under www.bob.gnu --- as well as any (public)
1407GNS record that Bob has in his zone by replacing www with the respective name of
1408the record in Bob's zone.
1409
1410Furthermore, if Bob has himself a (public) delegation to Carol's zone under
1411"carol", you can access Carol's records under NAME.carol.bob.gnu (where NAME is
1412the name of Carol's record you want to access).
1413
1414@node The Three Local Zones of GNS
1415@subsection The Three Local Zones of GNS
1416
1417Each user GNS has control over three zones. Each of the zones has a different
1418purpose. These zones are the
1419@itemize @bullet
1420
1421@item master zone,
1422@item private zone, and the
1423@item shorten zone.
1424@end itemize
1425
1426@node The Master Zone
1427@subsection The Master Zone
1428
1429
1430The master zone is your personal TLD. Names within the @code{.gnu} namespace are
1431resolved relative to this zone. You can arbitrarily add records to this zone and
1432selectively publish those records.
1433
1434@node The Private Zone
1435@subsection The Private Zone
1436
1437
1438The private zone is a subzone (or subdomain in DNS terms) of your master zone.
1439It should be used for records that you want to keep private. For example
1440@code{bank.private.gnu}. The key idea is that you want to keep your private
1441records separate, if just to know that those names are not available to other
1442users.
1443
1444@node The Shorten Zone
1445@subsection The Shorten Zone
1446
1447
1448The shorten zone can either be a subzone of the master zone or the private zone.
1449It is different from the other zones in that GNS will automatically populate
1450this zone with other users' zones based on their PSEU records whenever you
1451resolve a name.
1452
1453For example if you go to
1454@code{@uref{http://www.bob.alice.dave.gnu/, www.bob.alice.dave.gnu}}, GNS will
1455try to import @code{bob} into your shorten zone. Having obtained Bob's PKEY from
1456@code{alice.dave.gnu}, GNS will lookup the PSEU record for @code{+} in Bob's
1457zone. If it exists and the specified pseudonym is not taken, Bob's PKEY will be
1458automatically added under that pseudonym (i.e. "bob") into your shorten zone.
1459From then on, Bob's webpage will also be available for you as
1460@code{@uref{http://www.bob.short.gnu/, www.bob.short.gnu}}. This feature is
1461called automatic name shortening and is supposed to keep GNS names as short and
1462memorable as possible.
1463
1464@node The ZKEY Top Level Domain in GNS
1465@subsection The ZKEY Top Level Domain in GNS
1466
1467
1468GNS also provides a secure and globally unique namespace under the .zkey
1469top-level domain. A name in the .zkey TLD corresponds to the (printable) public
1470key of a zone. Names in the .zkey TLD are then resolved by querying the
1471respective zone. The .zkey TLD is expected to be used under rare circumstances
1472where globally unique names are required and for integration with legacy
1473systems.
1474
1475@node Resource Records in GNS
1476@subsection Resource Records in GNS
1477
1478
1479GNS supports the majority of the DNS records as defined in
1480@uref{http://www.ietf.org/rfc/rfc1035.txt, RFC 1035}. Additionally, GNS defines
1481some new record types the are unique to the GNS system. For example,
1482GNS-specific resource records are use to give petnames for zone delegation,
1483revoke zone keys and provide some compatibility features.
1484
1485For some DNS records, GNS does extended processing to increase their usefulness
1486in GNS. In particular, GNS introduces special names referred to as
1487"zone relative names". Zone relative names are allowed in some resource record
1488types (for example, in NS and CNAME records) and can also be used in links on
1489webpages. Zone relative names end in ".+" which indicates that the name needs to
1490be resolved relative to the current authoritative zone. The extended processing
1491of those names will expand the ".+" with the correct delegation chain to the
1492authoritative zone (replacing ".+" with the name of the location where the name
1493was encountered) and hence generate a valid @code{.gnu} name.
1494
1495GNS currently supports the following record types:
1496
1497@menu
1498* NICK::
1499* PKEY::
1500* BOX::
1501* LEHO::
1502* VPN::
1503* A AAAA and TXT::
1504* CNAME::
1505* GNS2DNS::
1506* SOA SRV PTR and MX::
1507@end menu
1508
1509@node NICK
1510@subsubsection NICK
1511
1512A NICK record is used to give a zone a name. With a NICK record, you can
1513essentially specify how you would like to be called. GNS expects this record
1514under the name "+" in the zone's database (NAMESTORE); however, it will then
1515automatically be copied into each record set, so that clients never need to do a
1516separate lookup to discover the NICK record.
1517
1518@b{Example}@
1519
1520@example
1521Name: +; RRType: NICK; Value: bob
1522@end example
1523
1524This record in Bob's zone will tell other users that this zone wants to be
1525referred to as 'bob'. Note that nobody is obliged to call Bob's zone 'bob' in
1526their own zones. It can be seen as a recommendation ("Please call me 'bob'").
1527
1528@node PKEY
1529@subsubsection PKEY
1530
1531PKEY records are used to add delegation to other users' zones and give those
1532zones a petname.
1533
1534@b{Example}@
1535
1536Let Bob's zone be identified by the hash "ABC012". Bob is your friend so you
1537want to give him the petname "friend". Then you add the following record to your
1538zone:
1539
1540@example
1541Name: friend; RRType: PKEY; Value: ABC012;
1542@end example
1543
1544This will allow you to resolve records in bob's zone under "*.friend.gnu".
1545
1546@node BOX
1547@subsubsection BOX
1548
1549BOX records are there to integrate information from TLSA or SRV records under
1550the main label. In DNS, TLSA and SRV records use special names of the form
1551@code{_port._proto.(label.)*tld} to indicate the port number and protocol
1552(i.e. tcp or udp) for which the TLSA or SRV record is valid. This causes various
1553problems, and is elegantly solved in GNS by integrating the protocol and port
1554numbers together with the respective value into a "BOX" record. Note that in the
1555GUI, you do not get to edit BOX records directly right now --- the GUI will
1556provide the illusion of directly editing the TLSA and SRV records, even though
1557they internally are BOXed up.
1558
1559@node LEHO
1560@subsubsection LEHO
1561
1562The LEgacy HOstname of a server. Some webservers expect a specific hostname to
1563provide a service (virtiual hosting). Also SSL certificates usually contain DNS
1564names. To provide the expected legacy DNS name for a server, the LEHO record can
1565be used. To mitigate the just mentioned issues the GNS proxy has to be used. The
1566GNS proxy will use the LEHO information to apply the necessary transformations.
1567
1568@node VPN
1569@subsubsection VPN
1570
1571GNS allows easy access to services provided by the GNUnet Virtual Public
1572Network. When the GNS resolver encounters a VPN record it will contact the VPN
1573service to try and allocate an IPv4/v6 address (if the queries record type is an
1574IP address) that can be used to contact the service.
1575
1576@b{Example}@
1577
1578I want to provide access to the VPN service "web.gnu." on port 80 on peer
1579ABC012:@
1580Name: www; RRType: VPN; Value: 80 ABC012 web.gnu.
1581
1582The peer ABC012 is configured to provide an exit point for the service
1583"web.gnu." on port 80 to it's server running locally on port 8080 by having the
1584following lines in the @file{gnunet.conf} configuration file:@
1585@example
1586[web.gnunet.]
1587TCP_REDIRECTS = 80:localhost4:8080
1588@end example
1589
1590@node A AAAA and TXT
1591@subsubsection A AAAA and TXT
1592
1593Those records work in exactly the same fashion as in traditional DNS.
1594
1595@node CNAME
1596@subsubsection CNAME
1597
1598As specified in RFC 1035 whenever a CNAME is encountered the query needs to be
1599restarted with the specified name. In GNS a CNAME can either be:
1600
1601@itemize @bullet
1602@item A zone relative name,
1603@item A zkey name or
1604@item A DNS name (in which case resolution will continue outside of GNS with the systems DNS resolver)
1605@end itemize
1606
1607@node GNS2DNS
1608@subsubsection GNS2DNS
1609
1610GNS can delegate authority to a legacy DNS zone. For this, the name of the DNS
1611nameserver and the name of the DNS zone are specified in a GNS2DNS record.
1612
1613@b{Example}
1614
1615@example
1616Name: pet; RRType: GNS2DNS; Value: gnunet.org@@a.ns.joker.com
1617@end example
1618
1619Any query to @code{pet.gnu} will then be delegated to the DNS server at
1620@code{a.ns.joker.com}.@
1621For example, @code{@uref{http://www.pet.gnu/, www.pet.gnu}} will result in a
1622DNS query for @code{@uref{http://www.gnunet.org/, www.gnunet.org}} to the server
1623at @code{a.ns.joker.com}. Delegation to DNS via NS records in GNS can be useful
1624if you do not want to start resolution in the DNS root zone (due to issues such
1625as censorship or availability).
1626
1627Note that you would typically want to use a relative name for the nameserver,
1628i.e.
1629@example
1630Name: pet; RRType: GNS2DNS; Value: gnunet.org@@ns-joker.+@
1631Name: ns-joker; RRType: A; Value: 184.172.157.218
1632@end example
1633
1634This way, you can avoid involving the DNS hierarchy in the resolution of
1635@code{a.ns.joker.com}. In the example above, the problem may not be obvious as
1636the nameserver for "gnunet.org" is in the ".com" zone. However, imagine the
1637nameserver was "ns.gnunet.org". In this case, delegating to "ns.gnunet.org"
1638would mean that despite using GNS, censorship in the DNS ".org" zone would still
1639be effective.
1640
1641@node SOA SRV PTR and MX
1642@subsubsection SOA SRV PTR and MX
1643
1644The domain names in those records can, again, be either
1645@itemize @bullet
1646@item A zone relative name,
1647@item A zkey name or
1648@item A DNS name
1649@end itemize
1650
1651The resolver will expand the zone relative name if possible. Note that when
1652using MX records within GNS, the target mail server might still refuse to accept
1653e-mails to the resulting domain as the name might not match. GNS-enabled mail
1654clients should use the ZKEY zone as the destination hostname and GNS-enabled
1655mail servers should be configured to accept e-mails to the ZKEY-zones of all
1656local users.
1657
1658@node Using the Virtual Public Network
1659@section Using the Virtual Public Network
1660
1661@menu
1662* Setting up an Exit node::
1663* Fedora and the Firewall::
1664* Setting up VPN node for protocol translation and tunneling::
1665@end menu
1666
1667Using the GNUnet Virtual Public Network (VPN) application you can tunnel IP
1668traffic over GNUnet. Moreover, the VPN comes with built-in protocol translation
1669and DNS-ALG support, enabling IPv4-to-IPv6 protocol translation
1670(in both directions). This chapter documents how to use the GNUnet VPN.
1671
1672The first thing to note about the GNUnet VPN is that it is a public network. All
1673participating peers can participate and there is no secret key to control
1674access. So unlike common virtual private networks, the GNUnet VPN is not useful
1675as a means to provide a "private" network abstraction over the Internet. The
1676GNUnet VPN is a virtual network in the sense that it is an overlay over the
1677Internet, using its own routing mechanisms and can also use an internal
1678addressing scheme. The GNUnet VPN is an Internet underlay --- TCP/IP
1679applications run on top of it.
1680
1681The VPN is currently only supported on GNU/Linux systems. Support for operating
1682systems that support TUN (such as FreeBSD) should be easy to add (or might not
1683even require any coding at all --- we just did not test this so far). Support
1684for other operating systems would require re-writing the code to create virtual
1685network interfaces and to intercept DNS requests.
1686
1687The VPN does not provide good anonymity. While requests are routed over the
1688GNUnet network, other peers can directly see the source and destination of each
1689(encapsulated) IP packet. Finally, if you use the VPN to access Internet
1690services, the peer sending the request to the Internet will be able to observe
1691and even alter the IP traffic. We will discuss additional security implications
1692of using the VPN later in this chapter.
1693
1694@node Setting up an Exit node
1695@subsection Setting up an Exit node
1696
1697Any useful operation with the VPN requires the existence of an exit node in the
1698GNUnet Peer-to-Peer network. Exit functionality can only be enabled on peers
1699that have regular Internet access. If you want to play around with the VPN or
1700support the network, we encourage you to setup exit nodes. This chapter
1701documents how to setup an exit node.
1702
1703There are four types of exit functions an exit node can provide, and using the
1704GNUnet VPN to access the Internet will only work nicely if the first three types
1705are provided somewhere in the network. The four exit functions are:
1706@itemize @bullet
1707@item DNS: allow other peers to use your DNS resolver
1708@item IPv4: allow other peers to access your IPv4 Internet connection
1709@item IPv6: allow other peers to access your IPv6 Internet connection
1710@item Local service: allow other peers to access a specific TCP or UDP service your peer is providing
1711@end itemize
1712
1713By enabling "exit" in gnunet-setup and checking the respective boxes in the
1714"exit" tab, you can easily choose which of the above exit functions you want to
1715support.
1716
1717Note, however, that by supporting the first three functions you will allow
1718arbitrary other GNUnet users to access the Internet via your system. This is
1719somewhat similar to running a Tor exit node. The torproject has a nice article
1720about what to consider if you want to do this here. We believe that generally
1721running a DNS exit node is completely harmless.
1722
1723The exit node configuration does currently not allow you to restrict the
1724Internet traffic that leaves your system. In particular, you cannot exclude SMTP
1725traffic (or block port 25) or limit to HTTP traffic using the GNUnet
1726configuration. However, you can use your host firewall to restrict outbound
1727connections from the virtual tunnel interface. This is highly recommended. In
1728the future, we plan to offer a wider range of configuration options for exit
1729nodes.
1730
1731Note that by running an exit node GNUnet will configure your kernel to perform
1732IP-forwarding (for IPv6) and NAT (for IPv4) so that the traffic from the virtual
1733interface can be routed to the Internet. In order to provide an IPv6-exit, you
1734need to have a subnet routed to your host's external network interface and
1735assign a subrange of that subnet to the GNUnet exit's TUN interface.
1736
1737When running a local service, you should make sure that the local service is
1738(also) bound to the IP address of your EXIT interface (i.e. 169.254.86.1). It
1739will NOT work if your local service is just bound to loopback. You may also want
1740to create a "VPN" record in your zone of the GNU Name System to make it easy for
1741others to access your service via a name instead of just the full service
1742descriptor. Note that the identifier you assign the service can serve as a
1743passphrase or shared secret, clients connecting to the service must somehow
1744learn the service's name. VPN records in the GNU Name System can make this
1745easier.
1746
1747@node Fedora and the Firewall
1748@subsection Fedora and the Firewall
1749
1750
1751When using an exit node on Fedora 15, the standard firewall can create trouble
1752even when not really exiting the local system! For IPv4, the standard rules seem
1753fine. However, for IPv6 the standard rules prohibit traffic from the network
1754range of the virtual interface created by the exit daemon to the local IPv6
1755address of the same interface (which is essentially loopback traffic, so you
1756might suspect that a standard firewall would leave this traffic alone). However,
1757as somehow for IPv6 the traffic is not recognized as originating from the local
1758system (and as the connection is not already "established"), the firewall drops
1759the traffic. You should still get ICMPv6 packets back, but that's obviously not
1760very useful.
1761
1762Possible ways to fix this include disabling the firewall (do you have a good
1763reason for having it on?) or disabling the firewall at least for the GNUnet exit
1764interface (or the respective IPv4/IPv6 address range). The best way to diagnose
1765these kinds of problems in general involves setting the firewall to REJECT
1766instead of DROP and to watch the traffic using wireshark (or tcpdump) to see if
1767ICMP messages are generated when running some tests that should work.
1768
1769@node Setting up VPN node for protocol translation and tunneling
1770@subsection Setting up VPN node for protocol translation and tunneling
1771
1772
1773The GNUnet VPN/PT subsystem enables you to tunnel IP traffic over the VPN to an
1774exit node, from where it can then be forwarded to the Internet. This section
1775documents how to setup VPN/PT on a node. Note that you can enable both the VPN
1776and an exit on the same peer. In this case, IP traffic from your system may
1777enter your peer's VPN and leave your peer's exit. This can be useful as a means
1778to do protocol translation. For example, you might have an application that
1779supports only IPv4 but needs to access an IPv6-only site. In this case, GNUnet
1780would perform 4to6 protocol translation between the VPN (IPv4) and the
1781Exit (IPv6). Similarly, 6to4 protocol translation is also possible. However, the
1782primary use for GNUnet would be to access an Internet service running with an
1783IP version that is not supported by your ISP. In this case, your IP traffic
1784would be routed via GNUnet to a peer that has access to the Internet with the
1785desired IP version.
1786
1787Setting up an entry node into the GNUnet VPN primarily requires you to enable
1788the "VPN/PT" option in "gnunet-setup". This will launch the
1789"gnunet-service-vpn", "gnunet-service-dns" and "gnunet-daemon-pt" processes.
1790The "gnunet-service-vpn" will create a virtual interface which will be used as
1791the target for your IP traffic that enters the VPN. Additionally, a second
1792virtual interface will be created by the "gnunet-service-dns" for your DNS
1793traffic. You will then need to specify which traffic you want to tunnel over
1794GNUnet. If your ISP only provides you with IPv4 or IPv6-access, you may choose
1795to tunnel the other IP protocol over the GNUnet VPN. If you do not have an ISP
1796(and are connected to other GNUnet peers via WLAN), you can also choose to
1797tunnel all IP traffic over GNUnet. This might also provide you with some
1798anonymity. After you enable the respective options and restart your peer, your
1799Internet traffic should be tunneled over the GNUnet VPN.
1800
1801The GNUnet VPN uses DNS-ALG to hijack your IP traffic. Whenever an application
1802resolves a hostname (i.e. 'gnunet.org'), the "gnunet-daemon-pt" will instruct
1803the "gnunet-service-dns" to intercept the request (possibly route it over GNUnet
1804as well) and replace the normal answer with an IP in the range of the VPN's
1805interface. "gnunet-daemon-pt" will then tell "gnunet-service-vpn" to forward all
1806traffic it receives on the TUN interface via the VPN to the original
1807destination.
1808
1809For applications that do not use DNS, you can also manually create such a
1810mapping using the gnunet-vpn command-line tool. Here, you specfiy the desired
1811address family of the result (i.e. "-4"), and the intended target IP on the
1812Internet ("-i 131.159.74.67") and "gnunet-vpn" will tell you which IP address in
1813the range of your VPN tunnel was mapped.
1814
1815gnunet-vpn can also be used to access "internal" services offered by GNUnet
1816nodes. So if you happen to know a peer and a service offered by that peer, you
1817can create an IP tunnel to that peer by specifying the peer's identity, service
1818name and protocol (--tcp or --udp) and you will again receive an IP address that
1819will terminate at the respective peer's service.
diff --git a/doc/documentation/Makefile.am b/doc/documentation/Makefile.am
new file mode 100644
index 000000000..5bcf3d2a3
--- /dev/null
+++ b/doc/documentation/Makefile.am
@@ -0,0 +1,227 @@
1# This Makefile.am is in the public domain
2docdir = $(datadir)/doc/gnunet/
3
4infoimagedir = $(infodir)/images
5
6#DOT_FILES = images/$(wildcard *.dot)
7
8#DOT_VECTOR_GRAPHICS = \
9# $(DOT_FILES:%.dot=%.eps) \
10# $(DOT_FILES:%.dot=%.pdf)
11
12AM_MAKEINFOHTMLFLAGS = --no-split --css-ref=docstyle.css
13
14dist_infoimage_DATA = \
15 images/gnunet-gtk-0-10-gns-a-done.png \
16 images/gnunet-gtk-0-10-gns-a.png \
17 images/daemon_lego_block.png \
18 images/gnunet-gtk-0-10-gns.png \
19 images/gnunet-0-10-peerinfo.png \
20 images/gnunet-gtk-0-10-identity.png \
21 images/gnunet-fs-gtk-0-10-star-tab.png \
22 images/gnunet-gtk-0-10.png \
23 images/gnunet-gtk-0-10-download-area.png \
24 images/gnunet-gtk-0-10-search-selected.png \
25 images/gnunet-gtk-0-10-fs-menu.png \
26 images/gnunet-gtk-0-10-traffic.png \
27 images/gnunet-gtk-0-10-fs.png \
28 images/gnunet-namestore-gtk-phone.png \
29 images/gnunet-gtk-0-10-fs-publish-editing.png \
30 images/gnunet-namestore-gtk-vpn.png \
31 images/gnunet-gtk-0-10-fs-published.png \
32 images/gnunet-setup-exit.png \
33 images/gnunet-gtk-0-10-fs-publish.png \
34 images/iceweasel-preferences.png \
35 images/gnunet-gtk-0-10-fs-publish-select.png \
36 images/iceweasel-proxy.png \
37 images/gnunet-gtk-0-10-fs-publish-with-file_0.png \
38 images/service_lego_block.png \
39 images/gnunet-gtk-0-10-fs-publish-with-file.png \
40 images/service_stack.png \
41 images/gnunet-gtk-0-10-fs-search.png \
42 images/gnunet-tutorial-service.png \
43 images/gnunet-tutorial-system.png \
44 images/daemon_lego_block.svg \
45 images/lego_stack.svg \
46 images/service_lego_block.svg \
47 images/structure.dot
48
49# images/$(wildcard *.png) \
50# images/$(wildcard *.svg)
51# $(DOT_FILES:%.dot=%.png)
52
53#DOT_OPTIONS = \
54# -Gratio=.9 -Gnodesep=.005 -Granksep=.00005 \
55# -Nfontsite=9 -Nheight=.1 -Nwidth=.1
56
57# .dot.png:
58# $(AM_V_DOT)$(DOT) -Tpng $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
59# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
60
61# .dot.pdf:
62# $(AM_V_DOT)$(DOT) -Tpdf $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
63# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
64
65# .dot.eps:
66# $(AM_V_DOT)$(DOT) -Teps $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
67# mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
68
69# .png.eps:
70# $(AM_V_GEN)convert "$<" "$@-tmp.eps"; \
71# mv "$@-tmp.eps" "$@"
72
73# pdf-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.pdf)
74# info-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.png)
75# ps-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.eps) \
76# $(top_srcdir)/%D%/images/coreutils-size-map.eps
77# dvi-local: ps-local
78
79gnunet_tutorial_examples = \
80 001.c \
81 002.c \
82 003.c \
83 004.c \
84 005.c \
85 006.c \
86 007.c \
87 008.c \
88 009.c \
89 010.c \
90 011.c \
91 012.c \
92 013.c \
93 013.1.c \
94 014.c \
95 015.c \
96 016.c \
97 017.c \
98 018.c \
99 019.c \
100 020.c \
101 021.c \
102 022.c \
103 023.c \
104 024.c \
105 025.c \
106 026.c
107
108info_TEXINFOS = \
109 gnunet.texi \
110 gnunet-c-tutorial.texi
111
112gnunet_TEXINFOS = \
113 chapters/developer.texi \
114 chapters/installation.texi \
115 chapters/philosophy.texi \
116 chapters/user.texi \
117 chapters/vocabulary.texi \
118 chapters/configuration.texi \
119 fdl-1.3.texi \
120 gpl-3.0.texi
121
122EXTRA_DIST = \
123 $(gnunet_TEXINFOS) \
124 $(gnunet_tutorial_examples) \
125 htmlxref.cnf \
126 run-gendocs.sh \
127 docstyle.css
128
129
130# $(DOT_FILES) \
131# $(DOT_VECTOR_GRAPHICS)
132
133DISTCLEANFILES = \
134 gnunet.cps \
135 gnunet-c-tutorial.cps \
136 chapters/developer.cps \
137 chapters/installation.cps \
138 chapter/philosophy.cps \
139 chapters/user.cps \
140 chapters/configuration.cps \
141 chapters/vocabulary.cps \
142 fdl-1.3.cps \
143 gpl-3.0.cps
144
145# if HAVE_EXTENDED_DOCUMENTATION_BUILDING
146daemon_lego_block.png: images/daemon_lego_block.svg
147 convert images/daemon_lego_block.svg images/daemon_lego_block.png &&
148 pngcrush images/daemon_lego_block.png images/daemon_lego_block.png
149
150service_lego_block.png: images/service_lego_block.svg
151 convert images/service_lego_block.svg images/service_lego_block.png &&
152 pngcrush images/service_lego_block.png images/serivce_lego_block.png
153
154lego_stack.png: images/lego_stack.svg
155 convert images/lego_stack.svg images/lego_stack.png &&
156 pngcrush images/lego_stack.png images/lego_stack.png
157
158# FIXME: The usage of 'date' strings causes a warning.
159# version.texi:
160# echo "@set UPDATED $(date +'%d %B %Y')" > $@
161# echo "@set UPDATED-MONTH $(date +'%B %Y')" >> $@
162# echo "@set EDITION $(PACKAGE_VERSION)" >> $@
163# echo "@set VERSION $(PACKAGE_VERSION)" >> $@
164
165# Workaround for makeinfo error. Whcih in turn introduces more
166# date-related 'warnings'. Well.
167version2.texi:
168 echo "@set UPDATED $(date +'%d %B %Y')" > $@
169 echo "@set UPDATED-MONTH $(date +'%B %Y')" >> $@
170 echo "@set EDITION $(PACKAGE_VERSION)" >> $@
171 echo "@set VERSION $(PACKAGE_VERSION)" >> $@
172
173# FIXME: rm *.html and *.pdf
174#doc-clean:
175# @rm *.aux *.log *.toc *.cp *.cps
176
177doc-all-install:
178 @mkdir -p $(DESTDIR)/$(docdir)
179 @mkdir -p $(DESTDIR)/$(infoimagedir)
180 @mkdir -p $(DESTDIR)/$(infodir)
181 @install -m 0755 gnunet.pdf $(DESTDIR)/$(docdir)
182 @install -m 0755 gnunet-c-tutorial.pdf $(DESTDIR)/$(docdir)
183 @install -m 0755 gnunet-c-tutorial.info $(DESTDIR)/$(infodir)
184 @install -m 0755 gnunet.info $(DESTDIR)/$(infodir)
185 @install gnunet.html $(DESTDIR)/$(docdir)
186 @install gnunet-c-tutorial.html $(DESTDIR)/$(docdir)
187
188# @cp -r images $(DESTDIR)/$(infoimagedir)
189
190dev-build: version.texi version2.texi
191 @makeinfo --pdf gnunet.texi
192 @makeinfo --pdf gnunet-c-tutorial.texi
193 @makeinfo --html gnunet.texi
194 @makeinfo --html gnunet-c-tutorial.texi
195 @makeinfo --no-split gnunet.texi
196 @makeinfo --no-split gnunet-c-tutorial.texi
197
198# TODO: Add more to clean.
199clean:
200 @rm gnunet.pdf
201 @rm gnunet.html
202 @rm gnunet.info
203 @rm gnunet.info-1
204 @rm gnunet.info-2
205 @rm gnunet.info-3
206 @rm gnunet-c-tutorial.pdf
207 @rm gnunet-c-tutorial.info
208 @rm gnunet-c-tutorial.html
209 @rm -r gnunet.t2p
210 @rm -r gnunet-c-tutorial.t2p
211
212# CLEANFILES = \
213# gnunet.log \
214# gnunet-c-tutorial.log \
215# $(wildcard *.aux) \
216# $(wildcard *.toc) \
217# $(wildcard *.cp) \
218# $(wildcard *.cps)
219
220#.PHONY: version.texi
221# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_PDF
222
223# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_HTML
224
225# endif
226# endif
227# endif
diff --git a/doc/documentation/README.txt b/doc/documentation/README.txt
new file mode 100644
index 000000000..28223f009
--- /dev/null
+++ b/doc/documentation/README.txt
@@ -0,0 +1,69 @@
1To be moved to an appropriate section of "how to write documentation" or
2"how to contribute to the documentation":
3
41. When writing documentation, please use gender-neutral wording when
5 referring to people, such as singular “theyâ€, “theirâ€, “themâ€, and
6 so forth. -> https://en.wikipedia.org/wiki/Singular_they
7
82. Keep line length below 74 characters.
9 - Expection by texi2pdf output so far: URLs will break
10 (inserted whitespace) when they contain linebreaks
11 within the @url{} / @uref{}.
12
133. Do not use tab characters (see chapter 2.1 texinfo manual)
14
154. Use neutral language and third person perspective in the text
16* What's left to do
17
18- Which Texlive modules are needed? Decrease the size.
19- Update the content of gnunet documentation.
20
21* How to use (hack) on this
22
23** with guix
24
25Adjust accordingly, ie read the Guix Documentation:
26setenv GUIX_PACKAGE_PATH "gnunet/contrib/packages/guix/packages"
27guix environment gnunet-doc
28and
29guix build -f contrib/packages/guix/gnunet-doc.scm
30
31** without guix
32
33You need to have Texinfo and Texlive in your path.
34sh bootstrap
35./configure --enable-documentation
36cd doc
37make (format you want)
38
39for example: make html, make info, make pdf
40
41* structure (relations)
42
43** gnunet.texi
44 -> chapters/developer.texi
45 -> chapters/installation.texi
46 -> chapters/philosophy.texi
47 -> chapters/user.texi
48 -> chapters/vocabulary.texi
49 -> images/*
50 -> gpl-3.0.texi
51 -> fdl-1.3.texi
52
53** gnunet-c-tutorial.texi
54 -> figs/Service.pdf
55 -> figs/System.pdf
56 -> tutorial-examples/*.c
57 -> gpl-3.0.texi
58 -> fdl-1.3.texi
59
60- gnunet-c-tutorial-v1.pdf: original LaTeX "gnunet-c-tutorial.pdf".
61- man folder: the man pages.
62- doxygen folder
63- outdated-and-old-installation-instructions.txt: self described within the file.
64
65
66Use `gendocs', add to the manual/ directory of the web site.
67
68 $ cd doc
69 $ gendocs.sh gnunet "GNUnet 0.10.X Reference Manual"
diff --git a/doc/documentation/chapters/configuration.texi b/doc/documentation/chapters/configuration.texi
new file mode 100644
index 000000000..286c72e7a
--- /dev/null
+++ b/doc/documentation/chapters/configuration.texi
@@ -0,0 +1,5 @@
1@node Configuration Handbook
2@chapter Configuration Handbook
3
4This chapter has yet to be written. It is intended to be about in-depth
5configuration of GNUnet.
diff --git a/doc/documentation/chapters/developer.texi b/doc/documentation/chapters/developer.texi
new file mode 100644
index 000000000..996474359
--- /dev/null
+++ b/doc/documentation/chapters/developer.texi
@@ -0,0 +1,8304 @@
1@c ***********************************************************************
2@node GNUnet Developer Handbook
3@chapter GNUnet Developer Handbook
4
5This book is intended to be an introduction for programmers that want to
6extend the GNUnet framework. GNUnet is more than a simple peer-to-peer
7application. For developers, GNUnet is:
8
9@itemize @bullet
10@item Free software under the GNU General Public License, with a community
11that believes in the GNU philosophy
12@item A set of standards, including coding conventions and
13architectural rules
14@item A set of layered protocols, both specifying the communication
15between peers as well as the communication between components
16of a single peer
17@item A set of libraries with well-defined APIs suitable for
18writing extensions
19@end itemize
20
21In particular, the architecture specifies that a peer consists of many
22processes communicating via protocols. Processes can be written in almost
23any language. C and Java APIs exist for accessing existing services and
24for writing extensions. It is possible to write extensions in other
25languages by implementing the necessary IPC protocols.
26
27GNUnet can be extended and improved along many possible dimensions, and
28anyone interested in Free Software and Freedom-enhancing Networking is
29welcome to join the effort. This Developer Handbook attempts to provide
30an initial introduction to some of the key design choices and central
31components of the system. This part of the GNUNet documentation
32is far from complete, and we welcome informed contributions,
33be it in the form of new chapters or insightful comments.
34
35@menu
36* Developer Introduction::
37* Code overview::
38* System Architecture::
39* Subsystem stability::
40* Naming conventions and coding style guide::
41* Build-system::
42* Developing extensions for GNUnet using the gnunet-ext template::
43* Writing testcases::
44* GNUnet's TESTING library::
45* Performance regression analysis with Gauger::
46* GNUnet's TESTBED Subsystem::
47* libgnunetutil::
48* The Automatic Restart Manager (ARM)::
49* GNUnet's TRANSPORT Subsystem::
50* NAT library::
51* Distance-Vector plugin::
52* SMTP plugin::
53* Bluetooth plugin::
54* WLAN plugin::
55* The ATS Subsystem::
56* GNUnet's CORE Subsystem::
57* GNUnet's CADET subsystem::
58* GNUnet's NSE subsystem::
59* GNUnet's HOSTLIST subsystem::
60* GNUnet's IDENTITY subsystem::
61* GNUnet's NAMESTORE Subsystem::
62* GNUnet's PEERINFO subsystem::
63* GNUnet's PEERSTORE subsystem::
64* GNUnet's SET Subsystem::
65* GNUnet's STATISTICS subsystem::
66* GNUnet's Distributed Hash Table (DHT)::
67* The GNU Name System (GNS)::
68* The GNS Namecache::
69* The REVOCATION Subsystem::
70* GNUnet's File-sharing (FS) Subsystem::
71* GNUnet's REGEX Subsystem::
72@end menu
73
74@node Developer Introduction
75@section Developer Introduction
76
77This Developer Handbook is intended as first introduction to GNUnet for
78new developers that want to extend the GNUnet framework. After the
79introduction, each of the GNUnet subsystems (directories in the
80@file{src/} tree) is (supposed to be) covered in its own chapter. In
81addition to this documentation, GNUnet developers should be aware of the
82services available on the GNUnet server to them.
83
84New developers can have a look a the GNUnet tutorials for C and java
85available in the @file{src/} directory of the repository or under the
86following links:
87
88@c ** FIXME: Link to files in source, not online.
89@c ** FIXME: Where is the Java tutorial?
90@itemize @bullet
91@item @uref{https://gnunet.org/git/gnunet.git/plain/doc/gnunet-c-tutorial.pdf, GNUnet C tutorial}
92@item GNUnet Java tutorial
93@end itemize
94
95In addition to this book, the GNUnet server contains various resources for
96GNUnet developers. They are all conveniently reachable via the "Developer"
97entry in the navigation menu. Some additional tools (such as static
98analysis reports) require a special developer access to perform certain
99operations. If you feel you need access, you should contact
100@uref{http://grothoff.org/christian/, Christian Grothoff},
101GNUnet's maintainer.
102
103The public subsystems on the GNUnet server that help developers are:
104
105@itemize @bullet
106
107@item The Version control system (git) keeps our code and enables
108distributed development.
109Only developers with write access can commit code, everyone else is
110encouraged to submit patches to the
111@uref{https://lists.gnu.org/mailman/listinfo/gnunet-developers, GNUnet-developers mailinglist}
112.
113
114@item The GNUnet bugtracking system (Mantis) is used to track
115feature requests, open bug reports and their resolutions.
116Anyone can report bugs, only developers can claim to have fixed them.
117
118@item A site installation of the CI system "Buildbot" is used to check
119GNUnet builds automatically on a range of platforms.
120Builds are triggered automatically after 30 minutes of no changes to Git.
121
122@item The current quality of our automated test suite is assessed using
123Code coverage analysis. This analysis is run daily; however the webpage
124is only updated if all automated tests pass at that time. Testcases that
125improve our code coverage are always welcome.
126
127@item We try to automatically find bugs using a static analysis scan.
128This scan is run daily; however the webpage is only updated if all
129automated tests pass at the time. Note that not everything that is
130flagged by the analysis is a bug, sometimes even good code can be marked
131as possibly problematic. Nevertheless, developers are encouraged to at
132least be aware of all issues in their code that are listed.
133
134@item We use Gauger for automatic performance regression visualization.
135Details on how to use Gauger are here.
136
137@item We use @uref{http://junit.org/, junit} to automatically test
138@command{gnunet-java}.
139Automatically generated, current reports on the test suite are here.
140
141@item We use Cobertura to generate test coverage reports for gnunet-java.
142Current reports on test coverage are here.
143
144@end itemize
145
146
147
148@c ***********************************************************************
149@menu
150* Project overview::
151@end menu
152
153@node Project overview
154@subsection Project overview
155
156The GNUnet project consists at this point of several sub-projects. This
157section is supposed to give an initial overview about the various
158sub-projects. Note that this description also lists projects that are far
159from complete, including even those that have literally not a single line
160of code in them yet.
161
162GNUnet sub-projects in order of likely relevance are currently:
163
164@table @asis
165
166@item gnunet
167Core of the P2P framework, including file-sharing, VPN and
168chat applications; this is what the developer handbook covers mostly
169@item gnunet-gtk Gtk+-based user interfaces, including gnunet-fs-gtk
170(file-sharing), gnunet-statistics-gtk (statistics over time),
171gnunet-peerinfo-gtk (information about current connections and known
172peers), gnunet-chat-gtk (chat GUI) and gnunet-setup (setup tool for
173"everything")
174@item gnunet-fuse
175Mounting directories shared via GNUnet's file-sharing
176on Linux
177@item gnunet-update
178Installation and update tool
179@item gnunet-ext
180Template for starting 'external' GNUnet projects
181@item gnunet-java
182Java APIs for writing GNUnet services and applications
183@c ** FIXME: Point to new website repository once we have it:
184@c ** @item svn/gnunet-www/ Code and media helping drive the GNUnet
185@c website
186@item eclectic
187Code to run GNUnet nodes on testbeds for research, development,
188testing and evaluation
189@c ** FIXME: Solve the status and location of gnunet-qt
190@item gnunet-qt
191Qt-based GNUnet GUI (dead?)
192@item gnunet-cocoa
193cocoa-based GNUnet GUI (dead?)
194
195@end table
196
197We are also working on various supporting libraries and tools:
198@c ** FIXME: What about gauger, and what about libmwmodem?
199
200@table @asis
201@item libextractor
202GNU libextractor (meta data extraction)
203@item libmicrohttpd
204GNU libmicrohttpd (embedded HTTP(S) server library)
205@item gauger
206Tool for performance regression analysis
207@item monkey
208Tool for automated debugging of distributed systems
209@item libmwmodem
210Library for accessing satellite connection quality
211reports
212@item libgnurl
213gnURL (feature restricted variant of cURL/libcurl)
214@end table
215
216Finally, there are various external projects (see links for a list of
217those that have a public website) which build on top of the GNUnet
218framework.
219
220@c ***********************************************************************
221@node Code overview
222@section Code overview
223
224This section gives a brief overview of the GNUnet source code.
225Specifically, we sketch the function of each of the subdirectories in
226the @file{gnunet/src/} directory. The order given is roughly bottom-up
227(in terms of the layers of the system).
228
229@table @asis
230@item @file{util/} --- libgnunetutil
231Library with general utility functions, all
232GNUnet binaries link against this library. Anything from memory
233allocation and data structures to cryptography and inter-process
234communication. The goal is to provide an OS-independent interface and
235more 'secure' or convenient implementations of commonly used primitives.
236The API is spread over more than a dozen headers, developers should study
237those closely to avoid duplicating existing functions.
238@item @file{hello/} --- libgnunethello
239HELLO messages are used to
240describe under which addresses a peer can be reached (for example,
241protocol, IP, port). This library manages parsing and generating of HELLO
242messages.
243@item @file{block/} --- libgnunetblock
244The DHT and other components of GNUnet
245store information in units called 'blocks'. Each block has a type and the
246type defines a particular format and how that binary format is to be
247linked to a hash code (the key for the DHT and for databases). The block
248library is a wapper around block plugins which provide the necessary
249functions for each block type.
250@item @file{statistics/}
251The statistics service enables associating
252values (of type uint64_t) with a componenet name and a string. The main
253uses is debugging (counting events), performance tracking and user
254entertainment (what did my peer do today?).
255@item @file{arm/} --- Automatic Restart Manager (ARM)
256The automatic-restart-manager (ARM) service
257is the GNUnet master service. Its role is to start gnunet-services, to
258re-start them when they crashed and finally to shut down the system when
259requested.
260@item @file{peerinfo/}
261The peerinfo service keeps track of which peers are known
262to the local peer and also tracks the validated addresses for each peer
263(in the form of a HELLO message) for each of those peers. The peer is not
264necessarily connected to all peers known to the peerinfo service.
265Peerinfo provides persistent storage for peer identities --- peers are
266not forgotten just because of a system restart.
267@item @file{datacache/} --- libgnunetdatacache
268The datacache library provides (temporary) block storage for the DHT.
269Existing plugins can store blocks in Sqlite, Postgres or MySQL databases.
270All data stored in the cache is lost when the peer is stopped or
271restarted (datacache uses temporary tables).
272@item @file{datastore/}
273The datastore service stores file-sharing blocks in
274databases for extended periods of time. In contrast to the datacache, data
275is not lost when peers restart. However, quota restrictions may still
276cause old, expired or low-priority data to be eventually discarded.
277Existing plugins can store blocks in Sqlite, Postgres or MySQL databases.
278@item @file{template/}
279Template for writing a new service. Does nothing.
280@item @file{ats/} --- Automatic Transport Selection
281The automatic transport
282selection (ATS) service is responsible for deciding which address (i.e.
283which transport plugin) should be used for communication with other peers,
284and at what bandwidth.
285@item @file{nat/} --- libgnunetnat
286Library that provides basic functions for NAT traversal.
287The library supports NAT traversal with
288manual hole-punching by the user, UPnP and ICMP-based autonomous NAT
289traversal. The library also includes an API for testing if the current
290configuration works and the @code{gnunet-nat-server} which provides an
291external service to test the local configuration.
292@item @file{fragmentation/} --- libgnunetfragmentation
293Some transports (UDP and WLAN, mostly) have restrictions on the maximum
294transfer unit (MTU) for packets. The fragmentation library can be used to
295break larger packets into chunks of at most 1k and transmit the resulting
296fragments reliabily (with acknowledgement, retransmission, timeouts,
297etc.).
298@item @file{transport/}
299The transport service is responsible for managing the
300basic P2P communication. It uses plugins to support P2P communication
301over TCP, UDP, HTTP, HTTPS and other protocols.The transport service
302validates peer addresses, enforces bandwidth restrictions, limits the
303total number of connections and enforces connectivity restrictions (i.e.
304friends-only).
305@item @file{peerinfo-tool/}
306This directory contains the gnunet-peerinfo binary which can be used to
307inspect the peers and HELLOs known to the peerinfo service.
308@item @file{core/}
309The core service is responsible for establishing encrypted, authenticated
310connections with other peers, encrypting and decrypting messages and
311forwarding messages to higher-level services that are interested in them.
312@item @file{testing/} --- libgnunettesting
313The testing library allows starting (and stopping) peers
314for writing testcases.
315It also supports automatic generation of configurations for peers
316ensuring that the ports and paths are disjoint. libgnunettesting is also
317the foundation for the testbed service
318@item @file{testbed/}
319The testbed service is used for creating small or large scale deployments
320of GNUnet peers for evaluation of protocols.
321It facilitates peer depolyments on multiple
322hosts (for example, in a cluster) and establishing varous network
323topologies (both underlay and overlay).
324@item @file{nse/} --- Network Size Estimation
325The network size estimation (NSE) service
326implements a protocol for (securely) estimating the current size of the
327P2P network.
328@item @file{dht/} --- distributed hash table
329The distributed hash table (DHT) service provides a
330distributed implementation of a hash table to store blocks under hash
331keys in the P2P network.
332@item @file{hostlist/}
333The hostlist service allows learning about
334other peers in the network by downloading HELLO messages from an HTTP
335server, can be configured to run such an HTTP server and also implements
336a P2P protocol to advertise and automatically learn about other peers
337that offer a public hostlist server.
338@item @file{topology/}
339The topology service is responsible for
340maintaining the mesh topology. It tries to maintain connections to friends
341(depending on the configuration) and also tries to ensure that the peer
342has a decent number of active connections at all times. If necessary, new
343connections are added. All peers should run the topology service,
344otherwise they may end up not being connected to any other peer (unless
345some other service ensures that core establishes the required
346connections). The topology service also tells the transport service which
347connections are permitted (for friend-to-friend networking)
348@item @file{fs/} --- file-sharing
349The file-sharing (FS) service implements GNUnet's
350file-sharing application. Both anonymous file-sharing (using gap) and
351non-anonymous file-sharing (using dht) are supported.
352@item @file{cadet/}
353The CADET service provides a general-purpose routing abstraction to create
354end-to-end encrypted tunnels in mesh networks. We wrote a paper
355documenting key aspects of the design.
356@item @file{tun/} --- libgnunettun
357Library for building IPv4, IPv6 packets and creating
358checksums for UDP, TCP and ICMP packets. The header
359defines C structs for common Internet packet formats and in particular
360structs for interacting with TUN (virtual network) interfaces.
361@item @file{mysql/} --- libgnunetmysql
362Library for creating and executing prepared MySQL
363statements and to manage the connection to the MySQL database.
364Essentially a lightweight wrapper for the interaction between GNUnet
365components and libmysqlclient.
366@item @file{dns/}
367Service that allows intercepting and modifying DNS requests of
368the local machine. Currently used for IPv4-IPv6 protocol translation
369(DNS-ALG) as implemented by "pt/" and for the GNUnet naming system. The
370service can also be configured to offer an exit service for DNS traffic.
371@item @file{vpn/}
372The virtual public network (VPN) service provides a virtual
373tunnel interface (VTUN) for IP routing over GNUnet.
374Needs some other peers to run an "exit" service to work.
375Can be activated using the "gnunet-vpn" tool or integrated with DNS using
376the "pt" daemon.
377@item @file{exit/}
378Daemon to allow traffic from the VPN to exit this
379peer to the Internet or to specific IP-based services of the local peer.
380Currently, an exit service can only be restricted to IPv4 or IPv6, not to
381specific ports and or IP address ranges. If this is not acceptable,
382additional firewall rules must be added manually. exit currently only
383works for normal UDP, TCP and ICMP traffic; DNS queries need to leave the
384system via a DNS service.
385@item @file{pt/}
386protocol translation daemon. This daemon enables 4-to-6,
3876-to-4, 4-over-6 or 6-over-4 transitions for the local system. It
388essentially uses "DNS" to intercept DNS replies and then maps results to
389those offered by the VPN, which then sends them using mesh to some daemon
390offering an appropriate exit service.
391@item @file{identity/}
392Management of egos (alter egos) of a user; identities are
393essentially named ECC private keys and used for zones in the GNU name
394system and for namespaces in file-sharing, but might find other uses later
395@item @file{revocation/}
396Key revocation service, can be used to revoke the
397private key of an identity if it has been compromised
398@item @file{namecache/}
399Cache for resolution results for the GNU name system;
400data is encrypted and can be shared among users,
401loss of the data should ideally only result in a
402performance degradation (persistence not required)
403@item @file{namestore/}
404Database for the GNU name system with per-user private information,
405persistence required
406@item @file{gns/}
407GNU name system, a GNU approach to DNS and PKI.
408@item @file{dv/}
409A plugin for distance-vector (DV)-based routing.
410DV consists of a service and a transport plugin to provide peers
411with the illusion of a direct P2P connection for connections
412that use multiple (typically up to 3) hops in the actual underlay network.
413@item @file{regex/}
414Service for the (distributed) evaluation of regular expressions.
415@item @file{scalarproduct/}
416The scalar product service offers an API to perform a secure multiparty
417computation which calculates a scalar product between two peers
418without exposing the private input vectors of the peers to each other.
419@item @file{consensus/}
420The consensus service will allow a set of peers to agree
421on a set of values via a distributed set union computation.
422@item @file{rest/}
423The rest API allows access to GNUnet services using RESTful interaction.
424The services provide plugins that can exposed by the rest server.
425@item @file{experimentation/}
426The experimentation daemon coordinates distributed
427experimentation to evaluate transport and ATS properties.
428@end table
429
430@c ***********************************************************************
431@node System Architecture
432@section System Architecture
433
434GNUnet developers like LEGOs. The blocks are indestructible, can be
435stacked together to construct complex buildings and it is generally easy
436to swap one block for a different one that has the same shape. GNUnet's
437architecture is based on LEGOs:
438
439@c images here
440
441This chapter documents the GNUnet LEGO system, also known as GNUnet's
442system architecture.
443
444The most common GNUnet component is a service. Services offer an API (or
445several, depending on what you count as "an API") which is implemented as
446a library. The library communicates with the main process of the service
447using a service-specific network protocol. The main process of the service
448typically doesn't fully provide everything that is needed --- it has holes
449to be filled by APIs to other services.
450
451A special kind of component in GNUnet are user interfaces and daemons.
452Like services, they have holes to be filled by APIs of other services.
453Unlike services, daemons do not implement their own network protocol and
454they have no API:
455
456The GNUnet system provides a range of services, daemons and user
457interfaces, which are then combined into a layered GNUnet instance (also
458known as a peer).
459
460Note that while it is generally possible to swap one service for another
461compatible service, there is often only one implementation. However,
462during development we often have a "new" version of a service in parallel
463with an "old" version. While the "new" version is not working, developers
464working on other parts of the service can continue their development by
465simply using the "old" service. Alternative design ideas can also be
466easily investigated by swapping out individual components. This is
467typically achieved by simply changing the name of the "BINARY" in the
468respective configuration section.
469
470Key properties of GNUnet services are that they must be separate
471processes and that they must protect themselves by applying tight error
472checking against the network protocol they implement (thereby achieving a
473certain degree of robustness).
474
475On the other hand, the APIs are implemented to tolerate failures of the
476service, isolating their host process from errors by the service. If the
477service process crashes, other services and daemons around it should not
478also fail, but instead wait for the service process to be restarted by
479ARM.
480
481
482@c ***********************************************************************
483@node Subsystem stability
484@section Subsystem stability
485
486This section documents the current stability of the various GNUnet
487subsystems. Stability here describes the expected degree of compatibility
488with future versions of GNUnet. For each subsystem we distinguish between
489compatibility on the P2P network level (communication protocol between
490peers), the IPC level (communication between the service and the service
491library) and the API level (stability of the API). P2P compatibility is
492relevant in terms of which applications are likely going to be able to
493communicate with future versions of the network. IPC communication is
494relevant for the implementation of language bindings that re-implement the
495IPC messages. Finally, API compatibility is relevant to developers that
496hope to be able to avoid changes to applications build on top of the APIs
497of the framework.
498
499The following table summarizes our current view of the stability of the
500respective protocols or APIs:
501
502@multitable @columnfractions .20 .20 .20 .20
503@headitem Subsystem @tab P2P @tab IPC @tab C API
504@item util @tab n/a @tab n/a @tab stable
505@item arm @tab n/a @tab stable @tab stable
506@item ats @tab n/a @tab unstable @tab testing
507@item block @tab n/a @tab n/a @tab stable
508@item cadet @tab testing @tab testing @tab testing
509@item consensus @tab experimental @tab experimental @tab experimental
510@item core @tab stable @tab stable @tab stable
511@item datacache @tab n/a @tab n/a @tab stable
512@item datastore @tab n/a @tab stable @tab stable
513@item dht @tab stable @tab stable @tab stable
514@item dns @tab stable @tab stable @tab stable
515@item dv @tab testing @tab testing @tab n/a
516@item exit @tab testing @tab n/a @tab n/a
517@item fragmentation @tab stable @tab n/a @tab stable
518@item fs @tab stable @tab stable @tab stable
519@item gns @tab stable @tab stable @tab stable
520@item hello @tab n/a @tab n/a @tab testing
521@item hostlist @tab stable @tab stable @tab n/a
522@item identity @tab stable @tab stable @tab n/a
523@item multicast @tab experimental @tab experimental @tab experimental
524@item mysql @tab stable @tab n/a @tab stable
525@item namestore @tab n/a @tab stable @tab stable
526@item nat @tab n/a @tab n/a @tab stable
527@item nse @tab stable @tab stable @tab stable
528@item peerinfo @tab n/a @tab stable @tab stable
529@item psyc @tab experimental @tab experimental @tab experimental
530@item pt @tab n/a @tab n/a @tab n/a
531@item regex @tab stable @tab stable @tab stable
532@item revocation @tab stable @tab stable @tab stable
533@item social @tab experimental @tab experimental @tab experimental
534@item statistics @tab n/a @tab stable @tab stable
535@item testbed @tab n/a @tab testing @tab testing
536@item testing @tab n/a @tab n/a @tab testing
537@item topology @tab n/a @tab n/a @tab n/a
538@item transport @tab stable @tab stable @tab stable
539@item tun @tab n/a @tab n/a @tab stable
540@item vpn @tab testing @tab n/a @tab n/a
541@end multitable
542
543Here is a rough explanation of the values:
544
545@table @samp
546@item stable
547No incompatible changes are planned at this time; for IPC/APIs, if
548there are incompatible changes, they will be minor and might only require
549minimal changes to existing code; for P2P, changes will be avoided if at
550all possible for the 0.10.x-series
551
552@item testing
553No incompatible changes are
554planned at this time, but the code is still known to be in flux; so while
555we have no concrete plans, our expectation is that there will still be
556minor modifications; for P2P, changes will likely be extensions that
557should not break existing code
558
559@item unstable
560Changes are planned and will happen; however, they
561will not be totally radical and the result should still resemble what is
562there now; nevertheless, anticipated changes will break protocol/API
563compatibility
564
565@item experimental
566Changes are planned and the result may look nothing like
567what the API/protocol looks like today
568
569@item unknown
570Someone should think about where this subsystem headed
571
572@item n/a
573This subsystem does not have an API/IPC-protocol/P2P-protocol
574@end table
575
576@c ***********************************************************************
577@node Naming conventions and coding style guide
578@section Naming conventions and coding style guide
579
580Here you can find some rules to help you write code for GNUnet.
581
582@c ***********************************************************************
583@menu
584* Naming conventions::
585* Coding style::
586@end menu
587
588@node Naming conventions
589@subsection Naming conventions
590
591
592@c ***********************************************************************
593@menu
594* include files::
595* binaries::
596* logging::
597* configuration::
598* exported symbols::
599* private (library-internal) symbols (including structs and macros)::
600* testcases::
601* performance tests::
602* src/ directories::
603@end menu
604
605@node include files
606@subsubsection include files
607
608@itemize @bullet
609@item _lib: library without need for a process
610@item _service: library that needs a service process
611@item _plugin: plugin definition
612@item _protocol: structs used in network protocol
613@item exceptions:
614@itemize @bullet
615@item gnunet_config.h --- generated
616@item platform.h --- first included
617@item plibc.h --- external library
618@item gnunet_common.h --- fundamental routines
619@item gnunet_directories.h --- generated
620@item gettext.h --- external library
621@end itemize
622@end itemize
623
624@c ***********************************************************************
625@node binaries
626@subsubsection binaries
627
628@itemize @bullet
629@item gnunet-service-xxx: service process (has listen socket)
630@item gnunet-daemon-xxx: daemon process (no listen socket)
631@item gnunet-helper-xxx[-yyy]: SUID helper for module xxx
632@item gnunet-yyy: command-line tool for end-users
633@item libgnunet_plugin_xxx_yyy.so: plugin for API xxx
634@item libgnunetxxx.so: library for API xxx
635@end itemize
636
637@c ***********************************************************************
638@node logging
639@subsubsection logging
640
641@itemize @bullet
642@item services and daemons use their directory name in
643@code{GNUNET_log_setup} (i.e. 'core') and log using
644plain 'GNUNET_log'.
645@item command-line tools use their full name in
646@code{GNUNET_log_setup} (i.e. 'gnunet-publish') and log using
647plain 'GNUNET_log'.
648@item service access libraries log using
649'@code{GNUNET_log_from}' and use '@code{DIRNAME-api}' for the
650component (i.e. 'core-api')
651@item pure libraries (without associated service) use
652'@code{GNUNET_log_from}' with the component set to their
653library name (without lib or '@file{.so}'),
654which should also be their directory name (i.e. '@file{nat}')
655@item plugins should use '@code{GNUNET_log_from}'
656with the directory name and the plugin name combined to produce
657the component name (i.e. 'transport-tcp').
658@item logging should be unified per-file by defining a
659@code{LOG} macro with the appropriate arguments,
660along these lines:
661
662@example
663#define LOG(kind,...)
664GNUNET_log_from (kind, "example-api",__VA_ARGS__)
665@end example
666
667@end itemize
668
669@c ***********************************************************************
670@node configuration
671@subsubsection configuration
672
673@itemize @bullet
674@item paths (that are substituted in all filenames) are in PATHS
675(have as few as possible)
676@item all options for a particular module (@file{src/MODULE})
677are under @code{[MODULE]}
678@item options for a plugin of a module
679are under @code{[MODULE-PLUGINNAME]}
680@end itemize
681
682@c ***********************************************************************
683@node exported symbols
684@subsubsection exported symbols
685
686@itemize @bullet
687@item must start with "@code{GNUNET_modulename_}" and be defined in
688"@file{modulename.c}"
689@item exceptions: those defined in @file{gnunet_common.h}
690@end itemize
691
692@c ***********************************************************************
693@node private (library-internal) symbols (including structs and macros)
694@subsubsection private (library-internal) symbols (including structs and macros)
695
696@itemize @bullet
697@item must NOT start with any prefix
698@item must not be exported in a way that linkers could use them or@ other
699libraries might see them via headers; they must be either
700declared/defined in C source files or in headers that are in the
701respective directory under @file{src/modulename/} and NEVER be declared
702in @file{src/include/}.
703@end itemize
704
705@node testcases
706@subsubsection testcases
707
708@itemize @bullet
709@item must be called "@file{test_module-under-test_case-description.c}"
710@item "case-description" maybe omitted if there is only one test
711@end itemize
712
713@c ***********************************************************************
714@node performance tests
715@subsubsection performance tests
716
717@itemize @bullet
718@item must be called "@file{perf_module-under-test_case-description.c}"
719@item "case-description" maybe omitted if there is only one performance
720test
721@item Must only be run if @code{HAVE_BENCHMARKS} is satisfied
722@end itemize
723
724@c ***********************************************************************
725@node src/ directories
726@subsubsection src/ directories
727
728@itemize @bullet
729@item gnunet-NAME: end-user applications (i.e., gnunet-search, gnunet-arm)
730@item gnunet-service-NAME: service processes with accessor library (i.e.,
731gnunet-service-arm)
732@item libgnunetNAME: accessor library (_service.h-header) or standalone
733library (_lib.h-header)
734@item gnunet-daemon-NAME: daemon process without accessor library (i.e.,
735gnunet-daemon-hostlist) and no GNUnet management port
736@item libgnunet_plugin_DIR_NAME: loadable plugins (i.e.,
737libgnunet_plugin_transport_tcp)
738@end itemize
739
740@cindex Coding style
741@node Coding style
742@subsection Coding style
743
744@itemize @bullet
745@item We follow the GNU Coding Standards (@pxref{Top, The GNU Coding Standards,, standards, The GNU Coding Standards});
746@item Indentation is done with spaces, two per level, no tabs;
747@item C99 struct initialization is fine;
748@item declare only one variable per line, for example:
749
750@noindent
751instead of
752
753@example
754int i,j;
755@end example
756
757@noindent
758write:
759
760@example
761int i;
762int j;
763@end example
764
765@c TODO: include actual example from a file in source
766
767@noindent
768This helps keep diffs small and forces developers to think precisely about
769the type of every variable.
770Note that @code{char *} is different from @code{const char*} and
771@code{int} is different from @code{unsigned int} or @code{uint32_t}.
772Each variable type should be chosen with care.
773
774@item While @code{goto} should generally be avoided, having a
775@code{goto} to the end of a function to a block of clean up
776statements (free, close, etc.) can be acceptable.
777
778@item Conditions should be written with constants on the left (to avoid
779accidental assignment) and with the 'true' target being either the
780'error' case or the significantly simpler continuation. For example:
781
782@example
783if (0 != stat ("filename," &sbuf)) @{
784 error();
785 @}
786 else @{
787 /* handle normal case here */
788 @}
789@end example
790
791@noindent
792instead of
793
794@example
795if (stat ("filename," &sbuf) == 0) @{
796 /* handle normal case here */
797 @} else @{
798 error();
799 @}
800@end example
801
802@noindent
803If possible, the error clause should be terminated with a 'return' (or
804'goto' to some cleanup routine) and in this case, the 'else' clause
805should be omitted:
806
807@example
808if (0 != stat ("filename," &sbuf)) @{
809 error();
810 return;
811 @}
812/* handle normal case here */
813@end example
814
815This serves to avoid deep nesting. The 'constants on the left' rule
816applies to all constants (including. @code{GNUNET_SCHEDULER_NO_TASK}),
817NULL, and enums). With the two above rules (constants on left, errors in
818'true' branch), there is only one way to write most branches correctly.
819
820@item Combined assignments and tests are allowed if they do not hinder
821code clarity. For example, one can write:
822
823@example
824if (NULL == (value = lookup_function())) @{
825 error();
826 return;
827 @}
828@end example
829
830@item Use @code{break} and @code{continue} wherever possible to avoid
831deep(er) nesting. Thus, we would write:
832
833@example
834next = head;
835while (NULL != (pos = next)) @{
836 next = pos->next;
837 if (! should_free (pos))
838 continue;
839 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
840 GNUNET_free (pos);
841 @}
842@end example
843
844instead of
845
846@example
847next = head; while (NULL != (pos = next)) @{
848 next = pos->next;
849 if (should_free (pos)) @{
850 /* unnecessary nesting! */
851 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
852 GNUNET_free (pos);
853 @}
854 @}
855@end example
856
857@item We primarily use @code{for} and @code{while} loops.
858A @code{while} loop is used if the method for advancing in the loop is
859not a straightforward increment operation. In particular, we use:
860
861@example
862next = head;
863while (NULL != (pos = next))
864@{
865 next = pos->next;
866 if (! should_free (pos))
867 continue;
868 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
869 GNUNET_free (pos);
870@}
871@end example
872
873to free entries in a list (as the iteration changes the structure of the
874list due to the free; the equivalent @code{for} loop does no longer
875follow the simple @code{for} paradigm of @code{for(INIT;TEST;INC)}).
876However, for loops that do follow the simple @code{for} paradigm we do
877use @code{for}, even if it involves linked lists:
878
879@example
880/* simple iteration over a linked list */
881for (pos = head;
882 NULL != pos;
883 pos = pos->next)
884@{
885 use (pos);
886@}
887@end example
888
889
890@item The first argument to all higher-order functions in GNUnet must be
891declared to be of type @code{void *} and is reserved for a closure. We do
892not use inner functions, as trampolines would conflict with setups that
893use non-executable stacks.
894The first statement in a higher-order function, which unusually should
895be part of the variable declarations, should assign the
896@code{cls} argument to the precise expected type. For example:
897
898@example
899int callback (void *cls, char *args) @{
900 struct Foo *foo = cls;
901 int other_variables;
902
903 /* rest of function */
904@}
905@end example
906
907
908@item It is good practice to write complex @code{if} expressions instead
909of using deeply nested @code{if} statements. However, except for addition
910and multiplication, all operators should use parens. This is fine:
911
912@example
913if ( (1 == foo) || ((0 == bar) && (x != y)) )
914 return x;
915@end example
916
917
918However, this is not:
919
920@example
921if (1 == foo)
922 return x;
923if (0 == bar && x != y)
924 return x;
925@end example
926
927@noindent
928Note that splitting the @code{if} statement above is debateable as the
929@code{return x} is a very trivial statement. However, once the logic after
930the branch becomes more complicated (and is still identical), the "or"
931formulation should be used for sure.
932
933@item There should be two empty lines between the end of the function and
934the comments describing the following function. There should be a single
935empty line after the initial variable declarations of a function. If a
936function has no local variables, there should be no initial empty line. If
937a long function consists of several complex steps, those steps might be
938separated by an empty line (possibly followed by a comment describing the
939following step). The code should not contain empty lines in arbitrary
940places; if in doubt, it is likely better to NOT have an empty line (this
941way, more code will fit on the screen).
942@end itemize
943
944@c ***********************************************************************
945@node Build-system
946@section Build-system
947
948If you have code that is likely not to compile or build rules you might
949want to not trigger for most developers, use @code{if HAVE_EXPERIMENTAL}
950in your @file{Makefile.am}.
951Then it is OK to (temporarily) add non-compiling (or known-to-not-port)
952code.
953
954If you want to compile all testcases but NOT run them, run configure with
955the @code{--enable-test-suppression} option.
956
957If you want to run all testcases, including those that take a while, run
958configure with the @code{--enable-expensive-testcases} option.
959
960If you want to compile and run benchmarks, run configure with the
961@code{--enable-benchmarks} option.
962
963If you want to obtain code coverage results, run configure with the
964@code{--enable-coverage} option and run the @file{coverage.sh} script in
965the @file{contrib/} directory.
966
967@cindex gnunet-ext
968@node Developing extensions for GNUnet using the gnunet-ext template
969@section Developing extensions for GNUnet using the gnunet-ext template
970
971For developers who want to write extensions for GNUnet we provide the
972gnunet-ext template to provide an easy to use skeleton.
973
974gnunet-ext contains the build environment and template files for the
975development of GNUnet services, command line tools, APIs and tests.
976
977First of all you have to obtain gnunet-ext from git:
978
979@example
980git clone https://gnunet.org/git/gnunet-ext.git
981@end example
982
983The next step is to bootstrap and configure it. For configure you have to
984provide the path containing GNUnet with
985@code{--with-gnunet=/path/to/gnunet} and the prefix where you want the
986install the extension using @code{--prefix=/path/to/install}:
987
988@example
989./bootstrap
990./configure --prefix=/path/to/install --with-gnunet=/path/to/gnunet
991@end example
992
993When your GNUnet installation is not included in the default linker search
994path, you have to add @code{/path/to/gnunet} to the file
995@file{/etc/ld.so.conf} and run @code{ldconfig} or your add it to the
996environmental variable @code{LD_LIBRARY_PATH} by using
997
998@example
999export LD_LIBRARY_PATH=/path/to/gnunet/lib
1000@end example
1001
1002@cindex writing testcases
1003@node Writing testcases
1004@section Writing testcases
1005
1006Ideally, any non-trivial GNUnet code should be covered by automated
1007testcases. Testcases should reside in the same place as the code that is
1008being tested. The name of source files implementing tests should begin
1009with "@code{test_}" followed by the name of the file
1010that contains the code that is being tested.
1011
1012Testcases in GNUnet should be integrated with the autotools build system.
1013This way, developers and anyone building binary packages will be able to
1014run all testcases simply by running @code{make check}. The final
1015testcases shipped with the distribution should output at most some brief
1016progress information and not display debug messages by default. The
1017success or failure of a testcase must be indicated by returning zero
1018(success) or non-zero (failure) from the main method of the testcase.
1019The integration with the autotools is relatively straightforward and only
1020requires modifications to the @file{Makefile.am} in the directory
1021containing the testcase. For a testcase testing the code in @file{foo.c}
1022the @file{Makefile.am} would contain the following lines:
1023
1024@example
1025check_PROGRAMS = test_foo
1026TESTS = $(check_PROGRAMS)
1027test_foo_SOURCES = test_foo.c
1028test_foo_LDADD = $(top_builddir)/src/util/libgnunetutil.la
1029@end example
1030
1031Naturally, other libraries used by the testcase may be specified in the
1032@code{LDADD} directive as necessary.
1033
1034Often testcases depend on additional input files, such as a configuration
1035file. These support files have to be listed using the @code{EXTRA_DIST}
1036directive in order to ensure that they are included in the distribution.
1037
1038Example:
1039
1040@example
1041EXTRA_DIST = test_foo_data.conf
1042@end example
1043
1044Executing @code{make check} will run all testcases in the current
1045directory and all subdirectories. Testcases can be compiled individually
1046by running @code{make test_foo} and then invoked directly using
1047@code{./test_foo}. Note that due to the use of plugins in GNUnet, it is
1048typically necessary to run @code{make install} before running any
1049testcases. Thus the canonical command @code{make check install} has to be
1050changed to @code{make install check} for GNUnet.
1051
1052@cindex TESTING library
1053@node GNUnet's TESTING library
1054@section GNUnet's TESTING library
1055
1056The TESTING library is used for writing testcases which involve starting a
1057single or multiple peers. While peers can also be started by testcases
1058using the ARM subsystem, using TESTING library provides an elegant way to
1059do this. The configurations of the peers are auto-generated from a given
1060template to have non-conflicting port numbers ensuring that peers'
1061services do not run into bind errors. This is achieved by testing ports'
1062availability by binding a listening socket to them before allocating them
1063to services in the generated configurations.
1064
1065An another advantage while using TESTING is that it shortens the testcase
1066startup time as the hostkeys for peers are copied from a pre-computed set
1067of hostkeys instead of generating them at peer startup which may take a
1068considerable amount of time when starting multiple peers or on an embedded
1069processor.
1070
1071TESTING also allows for certain services to be shared among peers. This
1072feature is invaluable when testing with multiple peers as it helps to
1073reduce the number of services run per each peer and hence the total
1074number of processes run per testcase.
1075
1076TESTING library only handles creating, starting and stopping peers.
1077Features useful for testcases such as connecting peers in a topology are
1078not available in TESTING but are available in the TESTBED subsystem.
1079Furthermore, TESTING only creates peers on the localhost, however by
1080using TESTBED testcases can benefit from creating peers across multiple
1081hosts.
1082
1083@menu
1084* API::
1085* Finer control over peer stop::
1086* Helper functions::
1087* Testing with multiple processes::
1088@end menu
1089
1090@cindex TESTING API
1091@node API
1092@subsection API
1093
1094TESTING abstracts a group of peers as a TESTING system. All peers in a
1095system have common hostname and no two services of these peers have a
1096same port or a UNIX domain socket path.
1097
1098TESTING system can be created with the function
1099@code{GNUNET_TESTING_system_create()} which returns a handle to the
1100system. This function takes a directory path which is used for generating
1101the configurations of peers, an IP address from which connections to the
1102peers' services should be allowed, the hostname to be used in peers'
1103configuration, and an array of shared service specifications of type
1104@code{struct GNUNET_TESTING_SharedService}.
1105
1106The shared service specification must specify the name of the service to
1107share, the configuration pertaining to that shared service and the
1108maximum number of peers that are allowed to share a single instance of
1109the shared service.
1110
1111TESTING system created with @code{GNUNET_TESTING_system_create()} chooses
1112ports from the default range @code{12000} - @code{56000} while
1113auto-generating configurations for peers.
1114This range can be customised with the function
1115@code{GNUNET_TESTING_system_create_with_portrange()}. This function is
1116similar to @code{GNUNET_TESTING_system_create()} except that it take 2
1117additional parameters --- the start and end of the port range to use.
1118
1119A TESTING system is destroyed with the funciton
1120@code{GNUNET_TESTING_system_destory()}. This function takes the handle of
1121the system and a flag to remove the files created in the directory used
1122to generate configurations.
1123
1124A peer is created with the function
1125@code{GNUNET_TESTING_peer_configure()}. This functions takes the system
1126handle, a configuration template from which the configuration for the peer
1127is auto-generated and the index from where the hostkey for the peer has to
1128be copied from. When successfull, this function returs a handle to the
1129peer which can be used to start and stop it and to obtain the identity of
1130the peer. If unsuccessful, a NULL pointer is returned with an error
1131message. This function handles the generated configuration to have
1132non-conflicting ports and paths.
1133
1134Peers can be started and stopped by calling the functions
1135@code{GNUNET_TESTING_peer_start()} and @code{GNUNET_TESTING_peer_stop()}
1136respectively. A peer can be destroyed by calling the function
1137@code{GNUNET_TESTING_peer_destroy}. When a peer is destroyed, the ports
1138and paths in allocated in its configuration are reclaimed for usage in new
1139peers.
1140
1141@c ***********************************************************************
1142@node Finer control over peer stop
1143@subsection Finer control over peer stop
1144
1145Using @code{GNUNET_TESTING_peer_stop()} is normally fine for testcases.
1146However, calling this function for each peer is inefficient when trying to
1147shutdown multiple peers as this function sends the termination signal to
1148the given peer process and waits for it to terminate. It would be faster
1149in this case to send the termination signals to the peers first and then
1150wait on them. This is accomplished by the functions
1151@code{GNUNET_TESTING_peer_kill()} which sends a termination signal to the
1152peer, and the function @code{GNUNET_TESTING_peer_wait()} which waits on
1153the peer.
1154
1155Further finer control can be achieved by choosing to stop a peer
1156asynchronously with the function @code{GNUNET_TESTING_peer_stop_async()}.
1157This function takes a callback parameter and a closure for it in addition
1158to the handle to the peer to stop. The callback function is called with
1159the given closure when the peer is stopped. Using this function
1160eliminates blocking while waiting for the peer to terminate.
1161
1162An asynchronous peer stop can be cancelled by calling the function
1163@code{GNUNET_TESTING_peer_stop_async_cancel()}. Note that calling this
1164function does not prevent the peer from terminating if the termination
1165signal has already been sent to it. It does, however, cancels the
1166callback to be called when the peer is stopped.
1167
1168@c ***********************************************************************
1169@node Helper functions
1170@subsection Helper functions
1171
1172Most of the testcases can benefit from an abstraction which configures a
1173peer and starts it. This is provided by the function
1174@code{GNUNET_TESTING_peer_run()}. This function takes the testing
1175directory pathname, a configuration template, a callback and its closure.
1176This function creates a peer in the given testing directory by using the
1177configuration template, starts the peer and calls the given callback with
1178the given closure.
1179
1180The function @code{GNUNET_TESTING_peer_run()} starts the ARM service of
1181the peer which starts the rest of the configured services. A similar
1182function @code{GNUNET_TESTING_service_run} can be used to just start a
1183single service of a peer. In this case, the peer's ARM service is not
1184started; instead, only the given service is run.
1185
1186@c ***********************************************************************
1187@node Testing with multiple processes
1188@subsection Testing with multiple processes
1189
1190When testing GNUnet, the splitting of the code into a services and clients
1191often complicates testing. The solution to this is to have the testcase
1192fork @code{gnunet-service-arm}, ask it to start the required server and
1193daemon processes and then execute appropriate client actions (to test the
1194client APIs or the core module or both). If necessary, multiple ARM
1195services can be forked using different ports (!) to simulate a network.
1196However, most of the time only one ARM process is needed. Note that on
1197exit, the testcase should shutdown ARM with a @code{TERM} signal (to give
1198it the chance to cleanly stop its child processes).
1199
1200The following code illustrates spawning and killing an ARM process from a
1201testcase:
1202
1203@example
1204static void run (void *cls,
1205 char *const *args,
1206 const char *cfgfile,
1207 const struct GNUNET_CONFIGURATION_Handle *cfg) @{
1208 struct GNUNET_OS_Process *arm_pid;
1209 arm_pid = GNUNET_OS_start_process (NULL,
1210 NULL,
1211 "gnunet-service-arm",
1212 "gnunet-service-arm",
1213 "-c",
1214 cfgname,
1215 NULL);
1216 /* do real test work here */
1217 if (0 != GNUNET_OS_process_kill (arm_pid, SIGTERM))
1218 GNUNET_log_strerror
1219 (GNUNET_ERROR_TYPE_WARNING, "kill");
1220 GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (arm_pid));
1221 GNUNET_OS_process_close (arm_pid); @}
1222
1223GNUNET_PROGRAM_run (argc, argv,
1224 "NAME-OF-TEST",
1225 "nohelp",
1226 options,
1227 &run,
1228 cls);
1229@end example
1230
1231
1232An alternative way that works well to test plugins is to implement a
1233mock-version of the environment that the plugin expects and then to
1234simply load the plugin directly.
1235
1236@c ***********************************************************************
1237@node Performance regression analysis with Gauger
1238@section Performance regression analysis with Gauger
1239
1240To help avoid performance regressions, GNUnet uses Gauger. Gauger is a
1241simple logging tool that allows remote hosts to send performance data to
1242a central server, where this data can be analyzed and visualized. Gauger
1243shows graphs of the repository revisions and the performace data recorded
1244for each revision, so sudden performance peaks or drops can be identified
1245and linked to a specific revision number.
1246
1247In the case of GNUnet, the buildbots log the performance data obtained
1248during the tests after each build. The data can be accesed on GNUnet's
1249Gauger page.
1250
1251The menu on the left allows to select either the results of just one
1252build bot (under "Hosts") or review the data from all hosts for a given
1253test result (under "Metrics"). In case of very different absolute value
1254of the results, for instance arm vs. amd64 machines, the option
1255"Normalize" on a metric view can help to get an idea about the
1256performance evolution across all hosts.
1257
1258Using Gauger in GNUnet and having the performance of a module tracked over
1259time is very easy. First of course, the testcase must generate some
1260consistent metric, which makes sense to have logged. Highly volatile or
1261random dependant metrics probably are not ideal candidates for meaningful
1262regression detection.
1263
1264To start logging any value, just include @code{gauger.h} in your testcase
1265code. Then, use the macro @code{GAUGER()} to make the Buildbots log
1266whatever value is of interest for you to @code{gnunet.org}'s Gauger
1267server. No setup is necessary as most Buildbots have already everything
1268in place and new metrics are created on demand. To delete a metric, you
1269need to contact a member of the GNUnet development team (a file will need
1270to be removed manually from the respective directory).
1271
1272The code in the test should look like this:
1273
1274@example
1275[other includes]
1276#include <gauger.h>
1277
1278int main (int argc, char *argv[]) @{
1279
1280 [run test, generate data]
1281 GAUGER("YOUR_MODULE",
1282 "METRIC_NAME",
1283 (float)value,
1284 "UNIT"); @}
1285@end example
1286
1287Where:
1288
1289@table @asis
1290
1291@item @strong{YOUR_MODULE} is a category in the gauger page and should be
1292the name of the module or subsystem like "Core" or "DHT"
1293@item @strong{METRIC} is
1294the name of the metric being collected and should be concise and
1295descriptive, like "PUT operations in sqlite-datastore".
1296@item @strong{value} is the value
1297of the metric that is logged for this run.
1298@item @strong{UNIT} is the unit in
1299which the value is measured, for instance "kb/s" or "kb of RAM/node".
1300@end table
1301
1302If you wish to use Gauger for your own project, you can grab a copy of the
1303latest stable release or check out Gauger's Subversion repository.
1304
1305@cindex TESTBED Subsystem
1306@node GNUnet's TESTBED Subsystem
1307@section GNUnet's TESTBED Subsystem
1308
1309The TESTBED subsystem facilitates testing and measuring of multi-peer
1310deployments on a single host or over multiple hosts.
1311
1312The architecture of the testbed module is divided into the following:
1313@itemize @bullet
1314
1315@item Testbed API: An API which is used by the testing driver programs. It
1316provides with functions for creating, destroying, starting, stopping
1317peers, etc.
1318
1319@item Testbed service (controller): A service which is started through the
1320Testbed API. This service handles operations to create, destroy, start,
1321stop peers, connect them, modify their configurations.
1322
1323@item Testbed helper: When a controller has to be started on a host, the
1324testbed API starts the testbed helper on that host which in turn starts
1325the controller. The testbed helper receives a configuration for the
1326controller through its stdin and changes it to ensure the controller
1327doesn't run into any port conflict on that host.
1328@end itemize
1329
1330
1331The testbed service (controller) is different from the other GNUnet
1332services in that it is not started by ARM and is not supposed to be run
1333as a daemon. It is started by the testbed API through a testbed helper.
1334In a typical scenario involving multiple hosts, a controller is started
1335on each host. Controllers take up the actual task of creating peers,
1336starting and stopping them on the hosts they run.
1337
1338While running deployments on a single localhost the testbed API starts the
1339testbed helper directly as a child process. When running deployments on
1340remote hosts the testbed API starts Testbed Helpers on each remote host
1341through remote shell. By default testbed API uses SSH as a remote shell.
1342This can be changed by setting the environmental variable
1343GNUNET_TESTBED_RSH_CMD to the required remote shell program. This
1344variable can also contain parameters which are to be passed to the remote
1345shell program. For e.g:
1346
1347@example
1348export GNUNET_TESTBED_RSH_CMD="ssh -o BatchMode=yes \
1349-o NoHostAuthenticationForLocalhost=yes %h"@
1350@end example
1351
1352Substitutions are allowed int the above command string also allows for
1353substitions. through placemarks which begin with a `%'. At present the
1354following substitutions are supported
1355
1356@itemize @bullet
1357@item
1358%h: hostname
1359@item
1360%u: username
1361@item
1362%p: port
1363@end itemize
1364
1365Note that the substitution placemark is replaced only when the
1366corresponding field is available and only once. Specifying
1367@example
1368%u@atchar{}%h
1369@end example
1370doesn't work either.
1371If you want to user username substitutions for SSH
1372use the argument @code{-l} before the username substitution.
1373For exmaple:
1374@example
1375ssh -l %u -p %p %h
1376@end example
1377
1378The testbed API and the helper communicate through the helpers stdin and
1379stdout. As the helper is started through a remote shell on remote hosts
1380any output messages from the remote shell interfere with the communication
1381and results in a failure while starting the helper. For this reason, it is
1382suggested to use flags to make the remote shells produce no output
1383messages and to have password-less logins. The default remote shell, SSH,
1384the default options are:
1385
1386@example
1387-o BatchMode=yes -o NoHostBasedAuthenticationForLocalhost=yes"
1388@end example
1389
1390Password-less logins should be ensured by using SSH keys.
1391
1392Since the testbed API executes the remote shell as a non-interactive
1393shell, certain scripts like .bashrc, .profiler may not be executed. If
1394this is the case testbed API can be forced to execute an interactive
1395shell by setting up the environmental variable
1396@code{GNUNET_TESTBED_RSH_CMD_SUFFIX} to a shell program.
1397
1398An example could be:
1399
1400@example
1401export GNUNET_TESTBED_RSH_CMD_SUFFIX="sh -lc"
1402@end example
1403
1404The testbed API will then execute the remote shell program as:
1405
1406@example
1407$GNUNET_TESTBED_RSH_CMD -p $port $dest $GNUNET_TESTBED_RSH_CMD_SUFFIX \
1408gnunet-helper-testbed
1409@end example
1410
1411On some systems, problems may arise while starting testbed helpers if
1412GNUnet is installed into a custom location since the helper may not be
1413found in the standard path. This can be addressed by setting the variable
1414`@code{HELPER_BINARY_PATH}' to the path of the testbed helper.
1415Testbed API will then use this path to start helper binaries both
1416locally and remotely.
1417
1418Testbed API can accessed by including the
1419"@file{gnunet_testbed_service.h}" file and linking with -lgnunettestbed.
1420
1421@c ***********************************************************************
1422@menu
1423* Supported Topologies::
1424* Hosts file format::
1425* Topology file format::
1426* Testbed Barriers::
1427* Automatic large-scale deployment in the PlanetLab testbed::
1428* TESTBED Caveats::
1429@end menu
1430
1431@node Supported Topologies
1432@subsection Supported Topologies
1433
1434While testing multi-peer deployments, it is often needed that the peers
1435are connected in some topology. This requirement is addressed by the
1436function @code{GNUNET_TESTBED_overlay_connect()} which connects any given
1437two peers in the testbed.
1438
1439The API also provides a helper function
1440@code{GNUNET_TESTBED_overlay_configure_topology()} to connect a given set
1441of peers in any of the following supported topologies:
1442
1443@itemize @bullet
1444
1445@item @code{GNUNET_TESTBED_TOPOLOGY_CLIQUE}: All peers are connected with
1446each other
1447
1448@item @code{GNUNET_TESTBED_TOPOLOGY_LINE}: Peers are connected to form a
1449line
1450
1451@item @code{GNUNET_TESTBED_TOPOLOGY_RING}: Peers are connected to form a
1452ring topology
1453
1454@item @code{GNUNET_TESTBED_TOPOLOGY_2D_TORUS}: Peers are connected to
1455form a 2 dimensional torus topology. The number of peers may not be a
1456perfect square, in that case the resulting torus may not have the uniform
1457poloidal and toroidal lengths
1458
1459@item @code{GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI}: Topology is generated
1460to form a random graph. The number of links to be present should be given
1461
1462@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD}: Peers are connected to
1463form a 2D Torus with some random links among them. The number of random
1464links are to be given
1465
1466@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING}: Peers are
1467connected to form a ring with some random links among them. The number of
1468random links are to be given
1469
1470@item @code{GNUNET_TESTBED_TOPOLOGY_SCALE_FREE}: Connects peers in a
1471topology where peer connectivity follows power law - new peers are
1472connected with high probabililty to well connected peers.
1473@footnote{See Emergence of Scaling in Random Networks. Science 286,
1474509-512, 1999
1475(@uref{https://gnunet.org/git/bibliography.git/plain/docs/emergence_of_scaling_in_random_networks__barabasi_albert_science_286__1999.pdf, pdf})}
1476
1477@item @code{GNUNET_TESTBED_TOPOLOGY_FROM_FILE}: The topology information
1478is loaded from a file. The path to the file has to be given.
1479@xref{Topology file format}, for the format of this file.
1480
1481@item @code{GNUNET_TESTBED_TOPOLOGY_NONE}: No topology
1482@end itemize
1483
1484
1485The above supported topologies can be specified respectively by setting
1486the variable @code{OVERLAY_TOPOLOGY} to the following values in the
1487configuration passed to Testbed API functions
1488@code{GNUNET_TESTBED_test_run()} and
1489@code{GNUNET_TESTBED_run()}:
1490
1491@itemize @bullet
1492@item @code{CLIQUE}
1493@item @code{RING}
1494@item @code{LINE}
1495@item @code{2D_TORUS}
1496@item @code{RANDOM}
1497@item @code{SMALL_WORLD}
1498@item @code{SMALL_WORLD_RING}
1499@item @code{SCALE_FREE}
1500@item @code{FROM_FILE}
1501@item @code{NONE}
1502@end itemize
1503
1504
1505Topologies @code{RANDOM}, @code{SMALL_WORLD} and @code{SMALL_WORLD_RING}
1506require the option @code{OVERLAY_RANDOM_LINKS} to be set to the number of
1507random links to be generated in the configuration. The option will be
1508ignored for the rest of the topologies.
1509
1510Topology @code{SCALE_FREE} requires the options
1511@code{SCALE_FREE_TOPOLOGY_CAP} to be set to the maximum number of peers
1512which can connect to a peer and @code{SCALE_FREE_TOPOLOGY_M} to be set to
1513how many peers a peer should be atleast connected to.
1514
1515Similarly, the topology @code{FROM_FILE} requires the option
1516@code{OVERLAY_TOPOLOGY_FILE} to contain the path of the file containing
1517the topology information. This option is ignored for the rest of the
1518topologies. @xref{Topology file format}, for the format of this file.
1519
1520@c ***********************************************************************
1521@node Hosts file format
1522@subsection Hosts file format
1523
1524The testbed API offers the function
1525@code{GNUNET_TESTBED_hosts_load_from_file()} to load from a given file
1526details about the hosts which testbed can use for deploying peers.
1527This function is useful to keep the data about hosts
1528separate instead of hard coding them in code.
1529
1530Another helper function from testbed API, @code{GNUNET_TESTBED_run()}
1531also takes a hosts file name as its parameter. It uses the above
1532function to populate the hosts data structures and start controllers to
1533deploy peers.
1534
1535These functions require the hosts file to be of the following format:
1536@itemize @bullet
1537@item Each line is interpreted to have details about a host
1538@item Host details should include the username to use for logging into the
1539host, the hostname of the host and the port number to use for the remote
1540shell program. All thee values should be given.
1541@item These details should be given in the following format:
1542@example
1543<username>@@<hostname>:<port>
1544@end example
1545@end itemize
1546
1547Note that having canonical hostnames may cause problems while resolving
1548the IP addresses (See this bug). Hence it is advised to provide the hosts'
1549IP numerical addresses as hostnames whenever possible.
1550
1551@c ***********************************************************************
1552@node Topology file format
1553@subsection Topology file format
1554
1555A topology file describes how peers are to be connected. It should adhere
1556to the following format for testbed to parse it correctly.
1557
1558Each line should begin with the target peer id. This should be followed by
1559a colon(`:') and origin peer ids seperated by `|'. All spaces except for
1560newline characters are ignored. The API will then try to connect each
1561origin peer to the target peer.
1562
1563For example, the following file will result in 5 overlay connections:
1564[2->1], [3->1],[4->3], [0->3], [2->0]@
1565@code{@ 1:2|3@ 3:4| 0@ 0: 2@ }
1566
1567@c ***********************************************************************
1568@node Testbed Barriers
1569@subsection Testbed Barriers
1570
1571The testbed subsystem's barriers API facilitates coordination among the
1572peers run by the testbed and the experiment driver. The concept is
1573similar to the barrier synchronisation mechanism found in parallel
1574programming or multi-threading paradigms - a peer waits at a barrier upon
1575reaching it until the barrier is reached by a predefined number of peers.
1576This predefined number of peers required to cross a barrier is also called
1577quorum. We say a peer has reached a barrier if the peer is waiting for the
1578barrier to be crossed. Similarly a barrier is said to be reached if the
1579required quorum of peers reach the barrier. A barrier which is reached is
1580deemed as crossed after all the peers waiting on it are notified.
1581
1582The barriers API provides the following functions:
1583@itemize @bullet
1584@item @strong{@code{GNUNET_TESTBED_barrier_init()}:} function to
1585initialse a barrier in the experiment
1586@item @strong{@code{GNUNET_TESTBED_barrier_cancel()}:} function to cancel
1587a barrier which has been initialised before
1588@item @strong{@code{GNUNET_TESTBED_barrier_wait()}:} function to signal
1589barrier service that the caller has reached a barrier and is waiting for
1590it to be crossed
1591@item @strong{@code{GNUNET_TESTBED_barrier_wait_cancel()}:} function to
1592stop waiting for a barrier to be crossed
1593@end itemize
1594
1595
1596Among the above functions, the first two, namely
1597@code{GNUNET_TESTBED_barrier_init()} and
1598@code{GNUNET_TESTBED_barrier_cancel()} are used by experiment drivers. All
1599barriers should be initialised by the experiment driver by calling
1600@code{GNUNET_TESTBED_barrier_init()}. This function takes a name to
1601identify the barrier, the quorum required for the barrier to be crossed
1602and a notification callback for notifying the experiment driver when the
1603barrier is crossed. @code{GNUNET_TESTBED_barrier_cancel()} cancels an
1604initialised barrier and frees the resources allocated for it. This
1605function can be called upon a initialised barrier before it is crossed.
1606
1607The remaining two functions @code{GNUNET_TESTBED_barrier_wait()} and
1608@code{GNUNET_TESTBED_barrier_wait_cancel()} are used in the peer's
1609processes. @code{GNUNET_TESTBED_barrier_wait()} connects to the local
1610barrier service running on the same host the peer is running on and
1611registers that the caller has reached the barrier and is waiting for the
1612barrier to be crossed. Note that this function can only be used by peers
1613which are started by testbed as this function tries to access the local
1614barrier service which is part of the testbed controller service. Calling
1615@code{GNUNET_TESTBED_barrier_wait()} on an uninitialised barrier results
1616in failure. @code{GNUNET_TESTBED_barrier_wait_cancel()} cancels the
1617notification registered by @code{GNUNET_TESTBED_barrier_wait()}.
1618
1619
1620@c ***********************************************************************
1621@menu
1622* Implementation::
1623@end menu
1624
1625@node Implementation
1626@subsubsection Implementation
1627
1628Since barriers involve coordination between experiment driver and peers,
1629the barrier service in the testbed controller is split into two
1630components. The first component responds to the message generated by the
1631barrier API used by the experiment driver (functions
1632@code{GNUNET_TESTBED_barrier_init()} and
1633@code{GNUNET_TESTBED_barrier_cancel()}) and the second component to the
1634messages generated by barrier API used by peers (functions
1635@code{GNUNET_TESTBED_barrier_wait()} and
1636@code{GNUNET_TESTBED_barrier_wait_cancel()}).
1637
1638Calling @code{GNUNET_TESTBED_barrier_init()} sends a
1639@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_INIT} message to the master
1640controller. The master controller then registers a barrier and calls
1641@code{GNUNET_TESTBED_barrier_init()} for each its subcontrollers. In this
1642way barrier initialisation is propagated to the controller hierarchy.
1643While propagating initialisation, any errors at a subcontroller such as
1644timeout during further propagation are reported up the hierarchy back to
1645the experiment driver.
1646
1647Similar to @code{GNUNET_TESTBED_barrier_init()},
1648@code{GNUNET_TESTBED_barrier_cancel()} propagates
1649@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_CANCEL} message which causes
1650controllers to remove an initialised barrier.
1651
1652The second component is implemented as a separate service in the binary
1653`gnunet-service-testbed' which already has the testbed controller service.
1654Although this deviates from the gnunet process architecture of having one
1655service per binary, it is needed in this case as this component needs
1656access to barrier data created by the first component. This component
1657responds to @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages from
1658local peers when they call @code{GNUNET_TESTBED_barrier_wait()}. Upon
1659receiving @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} message, the
1660service checks if the requested barrier has been initialised before and
1661if it was not initialised, an error status is sent through
1662@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to the local
1663peer and the connection from the peer is terminated. If the barrier is
1664initialised before, the barrier's counter for reached peers is incremented
1665and a notification is registered to notify the peer when the barrier is
1666reached. The connection from the peer is left open.
1667
1668When enough peers required to attain the quorum send
1669@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages, the controller
1670sends a @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to its
1671parent informing that the barrier is crossed. If the controller has
1672started further subcontrollers, it delays this message until it receives
1673a similar notification from each of those subcontrollers. Finally, the
1674barriers API at the experiment driver receives the
1675@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} when the barrier is
1676reached at all the controllers.
1677
1678The barriers API at the experiment driver responds to the
1679@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message by echoing it
1680back to the master controller and notifying the experiment controller
1681through the notification callback that a barrier has been crossed. The
1682echoed @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message is
1683propagated by the master controller to the controller hierarchy. This
1684propagation triggers the notifications registered by peers at each of the
1685controllers in the hierarchy. Note the difference between this downward
1686propagation of the @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS}
1687message from its upward propagation --- the upward propagation is needed
1688for ensuring that the barrier is reached by all the controllers and the
1689downward propagation is for triggering that the barrier is crossed.
1690
1691@cindex PlanetLab testbed
1692@node Automatic large-scale deployment in the PlanetLab testbed
1693@subsection Automatic large-scale deployment in the PlanetLab testbed
1694
1695PlanetLab is a testbed for computer networking and distributed systems
1696research. It was established in 2002 and as of June 2010 was composed of
16971090 nodes at 507 sites worldwide.
1698
1699To automate the GNUnet we created a set of automation tools to simplify
1700the large-scale deployment. We provide you a set of scripts you can use
1701to deploy GNUnet on a set of nodes and manage your installation.
1702
1703Please also check @uref{https://gnunet.org/installation-fedora8-svn} and
1704@uref{https://gnunet.org/installation-fedora12-svn} to find detailled
1705instructions how to install GNUnet on a PlanetLab node.
1706
1707
1708@c ***********************************************************************
1709@menu
1710* PlanetLab Automation for Fedora8 nodes::
1711* Install buildslave on PlanetLab nodes running fedora core 8::
1712* Setup a new PlanetLab testbed using GPLMT::
1713* Why do i get an ssh error when using the regex profiler?::
1714@end menu
1715
1716@node PlanetLab Automation for Fedora8 nodes
1717@subsubsection PlanetLab Automation for Fedora8 nodes
1718
1719@c ***********************************************************************
1720@node Install buildslave on PlanetLab nodes running fedora core 8
1721@subsubsection Install buildslave on PlanetLab nodes running fedora core 8
1722@c ** Actually this is a subsubsubsection, but must be fixed differently
1723@c ** as subsubsection is the lowest.
1724
1725Since most of the PlanetLab nodes are running the very old Fedora core 8
1726image, installing the buildslave software is quite some pain. For our
1727PlanetLab testbed we figured out how to install the buildslave software
1728best.
1729
1730@c This is a vvery terrible way to suggest installing software.
1731@c FIXME: Is there an official, safer way instead of blind-piping a
1732@c script?
1733@c FIXME: Use newer pypi URLs below.
1734Install Distribute for Python:
1735
1736@example
1737curl http://python-distribute.org/distribute_setup.py | sudo python
1738@end example
1739
1740Install Distribute for zope.interface <= 3.8.0 (4.0 and 4.0.1 will not
1741work):
1742
1743@example
1744export PYPI=@value{PYPI-URL}
1745wget $PYPI/z/zope.interface/zope.interface-3.8.0.tar.gz
1746tar zvfz zope.interface-3.8.0.tar.gz
1747cd zope.interface-3.8.0
1748sudo python setup.py install
1749@end example
1750
1751Install the buildslave software (0.8.6 was the latest version):
1752
1753@example
1754export GCODE="http://buildbot.googlecode.com/files"
1755wget $GCODE/buildbot-slave-0.8.6p1.tar.gz
1756tar xvfz buildbot-slave-0.8.6p1.tar.gz
1757cd buildslave-0.8.6p1
1758sudo python setup.py install
1759@end example
1760
1761The setup will download the matching twisted package and install it.
1762It will also try to install the latest version of zope.interface which
1763will fail to install. Buildslave will work anyway since version 3.8.0
1764was installed before!
1765
1766@c ***********************************************************************
1767@node Setup a new PlanetLab testbed using GPLMT
1768@subsubsection Setup a new PlanetLab testbed using GPLMT
1769
1770@itemize @bullet
1771@item Get a new slice and assign nodes
1772Ask your PlanetLab PI to give you a new slice and assign the nodes you
1773need
1774@item Install a buildmaster
1775You can stick to the buildbot documentation:@
1776@uref{http://buildbot.net/buildbot/docs/current/manual/installation.html}
1777@item Install the buildslave software on all nodes
1778To install the buildslave on all nodes assigned to your slice you can use
1779the tasklist @code{install_buildslave_fc8.xml} provided with GPLMT:
1780
1781@example
1782./gplmt.py -c contrib/tumple_gnunet.conf -t \
1783contrib/tasklists/install_buildslave_fc8.xml -a -p <planetlab password>
1784@end example
1785
1786@item Create the buildmaster configuration and the slave setup commands
1787
1788The master and the and the slaves have need to have credentials and the
1789master has to have all nodes configured. This can be done with the
1790@file{create_buildbot_configuration.py} script in the @file{scripts}
1791directory.
1792
1793This scripts takes a list of nodes retrieved directly from PlanetLab or
1794read from a file and a configuration template and creates:
1795
1796@itemize @bullet
1797@item a tasklist which can be executed with gplmt to setup the slaves
1798@item a master.cfg file containing a PlanetLab nodes
1799@end itemize
1800
1801A configuration template is included in the <contrib>, most important is
1802that the script replaces the following tags in the template:
1803
1804%GPLMT_BUILDER_DEFINITION :@ GPLMT_BUILDER_SUMMARY@ GPLMT_SLAVES@
1805%GPLMT_SCHEDULER_BUILDERS
1806
1807Create configuration for all nodes assigned to a slice:
1808
1809@example
1810./create_buildbot_configuration.py -u <planetlab username> \
1811-p <planetlab password> -s <slice> -m <buildmaster+port> \
1812-t <template>
1813@end example
1814
1815Create configuration for some nodes in a file:
1816
1817@example
1818./create_buildbot_configuration.p -f <node_file> \
1819-m <buildmaster+port> -t <template>
1820@end example
1821
1822@item Copy the @file{master.cfg} to the buildmaster and start it
1823Use @code{buildbot start <basedir>} to start the server
1824@item Setup the buildslaves
1825@end itemize
1826
1827@c ***********************************************************************
1828@node Why do i get an ssh error when using the regex profiler?
1829@subsubsection Why do i get an ssh error when using the regex profiler?
1830
1831Why do i get an ssh error "Permission denied (publickey,password)." when
1832using the regex profiler although passwordless ssh to localhost works
1833using publickey and ssh-agent?
1834
1835You have to generate a public/private-key pair with no password:@
1836@code{ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_localhost}@
1837and then add the following to your ~/.ssh/config file:
1838
1839@code{Host 127.0.0.1@ IdentityFile ~/.ssh/id_localhost}
1840
1841now make sure your hostsfile looks like
1842
1843@example
1844[USERNAME]@@127.0.0.1:22@
1845[USERNAME]@@127.0.0.1:22
1846@end example
1847
1848You can test your setup by running @code{ssh 127.0.0.1} in a
1849terminal and then in the opened session run it again.
1850If you were not asked for a password on either login,
1851then you should be good to go.
1852
1853@cindex TESTBED Caveats
1854@node TESTBED Caveats
1855@subsection TESTBED Caveats
1856
1857This section documents a few caveats when using the GNUnet testbed
1858subsystem.
1859
1860@c ***********************************************************************
1861@menu
1862* CORE must be started::
1863* ATS must want the connections::
1864@end menu
1865
1866@node CORE must be started
1867@subsubsection CORE must be started
1868
1869A simple issue is #3993: Your configuration MUST somehow ensure that for
1870each peer the CORE service is started when the peer is setup, otherwise
1871TESTBED may fail to connect peers when the topology is initialized, as
1872TESTBED will start some CORE services but not necessarily all (but it
1873relies on all of them running). The easiest way is to set
1874'FORCESTART = YES' in the '[core]' section of the configuration file.
1875Alternatively, having any service that directly or indirectly depends on
1876CORE being started with FORCESTART will also do. This issue largely arises
1877if users try to over-optimize by not starting any services with
1878FORCESTART.
1879
1880@c ***********************************************************************
1881@node ATS must want the connections
1882@subsubsection ATS must want the connections
1883
1884When TESTBED sets up connections, it only offers the respective HELLO
1885information to the TRANSPORT service. It is then up to the ATS service to
1886@strong{decide} to use the connection. The ATS service will typically
1887eagerly establish any connection if the number of total connections is
1888low (relative to bandwidth). Details may further depend on the
1889specific ATS backend that was configured. If ATS decides to NOT establish
1890a connection (even though TESTBED provided the required information), then
1891that connection will count as failed for TESTBED. Note that you can
1892configure TESTBED to tolerate a certain number of connection failures
1893(see '-e' option of gnunet-testbed-profiler). This issue largely arises
1894for dense overlay topologies, especially if you try to create cliques
1895with more than 20 peers.
1896
1897@cindex libgnunetutil
1898@node libgnunetutil
1899@section libgnunetutil
1900
1901libgnunetutil is the fundamental library that all GNUnet code builds upon.
1902Ideally, this library should contain most of the platform dependent code
1903(except for user interfaces and really special needs that only few
1904applications have). It is also supposed to offer basic services that most
1905if not all GNUnet binaries require. The code of libgnunetutil is in the
1906@file{src/util/} directory. The public interface to the library is in the
1907gnunet_util.h header. The functions provided by libgnunetutil fall
1908roughly into the following categories (in roughly the order of importance
1909for new developers):
1910
1911@itemize @bullet
1912@item logging (common_logging.c)
1913@item memory allocation (common_allocation.c)
1914@item endianess conversion (common_endian.c)
1915@item internationalization (common_gettext.c)
1916@item String manipulation (string.c)
1917@item file access (disk.c)
1918@item buffered disk IO (bio.c)
1919@item time manipulation (time.c)
1920@item configuration parsing (configuration.c)
1921@item command-line handling (getopt*.c)
1922@item cryptography (crypto_*.c)
1923@item data structures (container_*.c)
1924@item CPS-style scheduling (scheduler.c)
1925@item Program initialization (program.c)
1926@item Networking (network.c, client.c, server*.c, service.c)
1927@item message queueing (mq.c)
1928@item bandwidth calculations (bandwidth.c)
1929@item Other OS-related (os*.c, plugin.c, signal.c)
1930@item Pseudonym management (pseudonym.c)
1931@end itemize
1932
1933It should be noted that only developers that fully understand this entire
1934API will be able to write good GNUnet code.
1935
1936Ideally, porting GNUnet should only require porting the gnunetutil
1937library. More testcases for the gnunetutil APIs are therefore a great
1938way to make porting of GNUnet easier.
1939
1940@menu
1941* Logging::
1942* Interprocess communication API (IPC)::
1943* Cryptography API::
1944* Message Queue API::
1945* Service API::
1946* Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps::
1947* The CONTAINER_MDLL API::
1948@end menu
1949
1950@cindex Logging
1951@cindex log levels
1952@node Logging
1953@subsection Logging
1954
1955GNUnet is able to log its activity, mostly for the purposes of debugging
1956the program at various levels.
1957
1958@file{gnunet_common.h} defines several @strong{log levels}:
1959@table @asis
1960
1961@item ERROR for errors (really problematic situations, often leading to
1962crashes)
1963@item WARNING for warnings (troubling situations that might have
1964negative consequences, although not fatal)
1965@item INFO for various information.
1966Used somewhat rarely, as GNUnet statistics is used to hold and display
1967most of the information that users might find interesting.
1968@item DEBUG for debugging.
1969Does not produce much output on normal builds, but when extra logging is
1970enabled at compile time, a staggering amount of data is outputted under
1971this log level.
1972@end table
1973
1974
1975Normal builds of GNUnet (configured with @code{--enable-logging[=yes]})
1976are supposed to log nothing under DEBUG level. The
1977@code{--enable-logging=verbose} configure option can be used to create a
1978build with all logging enabled. However, such build will produce large
1979amounts of log data, which is inconvenient when one tries to hunt down a
1980specific problem.
1981
1982To mitigate this problem, GNUnet provides facilities to apply a filter to
1983reduce the logs:
1984@table @asis
1985
1986@item Logging by default When no log levels are configured in any other
1987way (see below), GNUnet will default to the WARNING log level. This
1988mostly applies to GNUnet command line utilities, services and daemons;
1989tests will always set log level to WARNING or, if
1990@code{--enable-logging=verbose} was passed to configure, to DEBUG. The
1991default level is suggested for normal operation.
1992@item The -L option Most GNUnet executables accept an "-L loglevel" or
1993"--log=loglevel" option. If used, it makes the process set a global log
1994level to "loglevel". Thus it is possible to run some processes
1995with -L DEBUG, for example, and others with -L ERROR to enable specific
1996settings to diagnose problems with a particular process.
1997@item Configuration files. Because GNUnet
1998service and deamon processes are usually launched by gnunet-arm, it is not
1999possible to pass different custom command line options directly to every
2000one of them. The options passed to @code{gnunet-arm} only affect
2001gnunet-arm and not the rest of GNUnet. However, one can specify a
2002configuration key "OPTIONS" in the section that corresponds to a service
2003or a daemon, and put a value of "-L loglevel" there. This will make the
2004respective service or daemon set its log level to "loglevel" (as the
2005value of OPTIONS will be passed as a command-line argument).
2006
2007To specify the same log level for all services without creating separate
2008"OPTIONS" entries in the configuration for each one, the user can specify
2009a config key "GLOBAL_POSTFIX" in the [arm] section of the configuration
2010file. The value of GLOBAL_POSTFIX will be appended to all command lines
2011used by the ARM service to run other services. It can contain any option
2012valid for all GNUnet commands, thus in particular the "-L loglevel"
2013option. The ARM service itself is, however, unaffected by GLOBAL_POSTFIX;
2014to set log level for it, one has to specify "OPTIONS" key in the [arm]
2015section.
2016@item Environment variables.
2017Setting global per-process log levels with "-L loglevel" does not offer
2018sufficient log filtering granularity, as one service will call interface
2019libraries and supporting libraries of other GNUnet services, potentially
2020producing lots of debug log messages from these libraries. Also, changing
2021the config file is not always convenient (especially when running the
2022GNUnet test suite).@ To fix that, and to allow GNUnet to use different
2023log filtering at runtime without re-compiling the whole source tree, the
2024log calls were changed to be configurable at run time. To configure them
2025one has to define environment variables "GNUNET_FORCE_LOGFILE",
2026"GNUNET_LOG" and/or "GNUNET_FORCE_LOG":
2027@itemize @bullet
2028
2029@item "GNUNET_LOG" only affects the logging when no global log level is
2030configured by any other means (that is, the process does not explicitly
2031set its own log level, there are no "-L loglevel" options on command line
2032or in configuration files), and can be used to override the default
2033WARNING log level.
2034
2035@item "GNUNET_FORCE_LOG" will completely override any other log
2036configuration options given.
2037
2038@item "GNUNET_FORCE_LOGFILE" will completely override the location of the
2039file to log messages to. It should contain a relative or absolute file
2040name. Setting GNUNET_FORCE_LOGFILE is equivalent to passing
2041"--log-file=logfile" or "-l logfile" option (see below). It supports "[]"
2042format in file names, but not "@{@}" (see below).
2043@end itemize
2044
2045
2046Because environment variables are inherited by child processes when they
2047are launched, starting or re-starting the ARM service with these
2048variables will propagate them to all other services.
2049
2050"GNUNET_LOG" and "GNUNET_FORCE_LOG" variables must contain a specially
2051formatted @strong{logging definition} string, which looks like this:@
2052
2053@c FIXME: Can we close this with [/component] instead?
2054@example
2055[component];[file];[function];[from_line[-to_line]];loglevel[/component...]
2056@end example
2057
2058That is, a logging definition consists of definition entries, separated by
2059slashes ('/'). If only one entry is present, there is no need to add a
2060slash to its end (although it is not forbidden either).@ All definition
2061fields (component, file, function, lines and loglevel) are mandatory, but
2062(except for the loglevel) they can be empty. An empty field means
2063"match anything". Note that even if fields are empty, the semicolon (';')
2064separators must be present.@ The loglevel field is mandatory, and must
2065contain one of the log level names (ERROR, WARNING, INFO or DEBUG).@
2066The lines field might contain one non-negative number, in which case it
2067matches only one line, or a range "from_line-to_line", in which case it
2068matches any line in the interval [from_line;to_line] (that is, including
2069both start and end line).@ GNUnet mostly defaults component name to the
2070name of the service that is implemented in a process ('transport',
2071'core', 'peerinfo', etc), but logging calls can specify custom component
2072names using @code{GNUNET_log_from}.@ File name and function name are
2073provided by the compiler (__FILE__ and __FUNCTION__ built-ins).
2074
2075Component, file and function fields are interpreted as non-extended
2076regular expressions (GNU libc regex functions are used). Matching is
2077case-sensitive, "^" and "$" will match the beginning and the end of the
2078text. If a field is empty, its contents are automatically replaced with
2079a ".*" regular expression, which matches anything. Matching is done in
2080the default way, which means that the expression matches as long as it's
2081contained anywhere in the string. Thus "GNUNET_" will match both
2082"GNUNET_foo" and "BAR_GNUNET_BAZ". Use '^' and/or '$' to make sure that
2083the expression matches at the start and/or at the end of the string.
2084The semicolon (';') can't be escaped, and GNUnet will not use it in
2085component names (it can't be used in function names and file names
2086anyway).
2087
2088@end table
2089
2090
2091Every logging call in GNUnet code will be (at run time) matched against
2092the log definitions passed to the process. If a log definition fields are
2093matching the call arguments, then the call log level is compared the the
2094log level of that definition. If the call log level is less or equal to
2095the definition log level, the call is allowed to proceed. Otherwise the
2096logging call is forbidden, and nothing is logged. If no definitions
2097matched at all, GNUnet will use the global log level or (if a global log
2098level is not specified) will default to WARNING (that is, it will allow
2099the call to proceed, if its level is less or equal to the global log
2100level or to WARNING).
2101
2102That is, definitions are evaluated from left to right, and the first
2103matching definition is used to allow or deny the logging call. Thus it is
2104advised to place narrow definitions at the beginning of the logdef
2105string, and generic definitions - at the end.
2106
2107Whether a call is allowed or not is only decided the first time this
2108particular call is made. The evaluation result is then cached, so that
2109any attempts to make the same call later will be allowed or disallowed
2110right away. Because of that runtime log level evaluation should not
2111significantly affect the process performance.
2112Log definition parsing is only done once, at the first call to
2113GNUNET_log_setup () made by the process (which is usually done soon after
2114it starts).
2115
2116At the moment of writing there is no way to specify logging definitions
2117from configuration files, only via environment variables.
2118
2119At the moment GNUnet will stop processing a log definition when it
2120encounters an error in definition formatting or an error in regular
2121expression syntax, and will not report the failure in any way.
2122
2123
2124@c ***********************************************************************
2125@menu
2126* Examples::
2127* Log files::
2128* Updated behavior of GNUNET_log::
2129@end menu
2130
2131@node Examples
2132@subsubsection Examples
2133
2134@table @asis
2135
2136@item @code{GNUNET_FORCE_LOG=";;;;DEBUG" gnunet-arm -s} Start GNUnet
2137process tree, running all processes with DEBUG level (one should be
2138careful with it, as log files will grow at alarming rate!)
2139@item @code{GNUNET_FORCE_LOG="core;;;;DEBUG" gnunet-arm -s} Start GNUnet
2140process tree, running the core service under DEBUG level (everything else
2141will use configured or default level).
2142
2143@item Start GNUnet process tree, allowing any logging calls from
2144gnunet-service-transport_validation.c (everything else will use
2145configured or default level).
2146
2147@example
2148GNUNET_FORCE_LOG=";gnunet-service-transport_validation.c;;; DEBUG" \
2149gnunet-arm -s
2150@end example
2151
2152@item Start GNUnet process tree, allowing any logging calls from
2153gnunet-gnunet-service-fs_push.c (everything else will use configured or
2154default level).
2155
2156@example
2157GNUNET_FORCE_LOG="fs;gnunet-service-fs_push.c;;;DEBUG" gnunet-arm -s
2158@end example
2159
2160@item Start GNUnet process tree, allowing any logging calls from the
2161GNUNET_NETWORK_socket_select function (everything else will use
2162configured or default level).
2163
2164@example
2165GNUNET_FORCE_LOG=";;GNUNET_NETWORK_socket_select;;DEBUG" gnunet-arm -s
2166@end example
2167
2168@item Start GNUnet process tree, allowing any logging calls from the
2169components that have "transport" in their names, and are made from
2170function that have "send" in their names. Everything else will be allowed
2171to be logged only if it has WARNING level.
2172
2173@example
2174GNUNET_FORCE_LOG="transport.*;;.*send.*;;DEBUG/;;;;WARNING" gnunet-arm -s
2175@end example
2176
2177@end table
2178
2179
2180On Windows, one can use batch files to run GNUnet processes with special
2181environment variables, without affecting the whole system. Such batch
2182file will look like this:
2183
2184@example
2185set GNUNET_FORCE_LOG=;;do_transmit;;DEBUG@ gnunet-arm -s
2186@end example
2187
2188(note the absence of double quotes in the environment variable definition,
2189as opposed to earlier examples, which use the shell).
2190Another limitation, on Windows, GNUNET_FORCE_LOGFILE @strong{MUST} be set
2191in order to GNUNET_FORCE_LOG to work.
2192
2193
2194@cindex Log files
2195@node Log files
2196@subsubsection Log files
2197
2198GNUnet can be told to log everything into a file instead of stderr (which
2199is the default) using the "--log-file=logfile" or "-l logfile" option.
2200This option can also be passed via command line, or from the "OPTION" and
2201"GLOBAL_POSTFIX" configuration keys (see above). The file name passed
2202with this option is subject to GNUnet filename expansion. If specified in
2203"GLOBAL_POSTFIX", it is also subject to ARM service filename expansion,
2204in particular, it may contain "@{@}" (left and right curly brace)
2205sequence, which will be replaced by ARM with the name of the service.
2206This is used to keep logs from more than one service separate, while only
2207specifying one template containing "@{@}" in GLOBAL_POSTFIX.
2208
2209As part of a secondary file name expansion, the first occurrence of "[]"
2210sequence ("left square brace" followed by "right square brace") in the
2211file name will be replaced with a process identifier or the process when
2212it initializes its logging subsystem. As a result, all processes will log
2213into different files. This is convenient for isolating messages of a
2214particular process, and prevents I/O races when multiple processes try to
2215write into the file at the same time. This expansion is done
2216independently of "@{@}" expansion that ARM service does (see above).
2217
2218The log file name that is specified via "-l" can contain format characters
2219from the 'strftime' function family. For example, "%Y" will be replaced
2220with the current year. Using "basename-%Y-%m-%d.log" would include the
2221current year, month and day in the log file. If a GNUnet process runs for
2222long enough to need more than one log file, it will eventually clean up
2223old log files. Currently, only the last three log files (plus the current
2224log file) are preserved. So once the fifth log file goes into use (so
2225after 4 days if you use "%Y-%m-%d" as above), the first log file will be
2226automatically deleted. Note that if your log file name only contains "%Y",
2227then log files would be kept for 4 years and the logs from the first year
2228would be deleted once year 5 begins. If you do not use any date-related
2229string format codes, logs would never be automatically deleted by GNUnet.
2230
2231
2232@c ***********************************************************************
2233
2234@node Updated behavior of GNUNET_log
2235@subsubsection Updated behavior of GNUNET_log
2236
2237It's currently quite common to see constructions like this all over the
2238code:
2239
2240@example
2241#if MESH_DEBUG
2242GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MESH: client disconnected\n");
2243#endif
2244@end example
2245
2246The reason for the #if is not to avoid displaying the message when
2247disabled (GNUNET_ERROR_TYPE takes care of that), but to avoid the
2248compiler including it in the binary at all, when compiling GNUnet for
2249platforms with restricted storage space / memory (MIPS routers,
2250ARM plug computers / dev boards, etc).
2251
2252This presents several problems: the code gets ugly, hard to write and it
2253is very easy to forget to include the #if guards, creating non-consistent
2254code. A new change in GNUNET_log aims to solve these problems.
2255
2256@strong{This change requires to @file{./configure} with at least
2257@code{--enable-logging=verbose} to see debug messages.}
2258
2259Here is an example of code with dense debug statements:
2260
2261@example
2262switch (restrict_topology) @{
2263case GNUNET_TESTING_TOPOLOGY_CLIQUE:#if VERBOSE_TESTING
2264GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but clique
2265topology\n")); #endif unblacklisted_connections = create_clique (pg,
2266&remove_connections, BLACKLIST, GNUNET_NO); break; case
2267GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING: #if VERBOSE_TESTING GNUNET_log
2268(GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but small world (ring)
2269topology\n")); #endif unblacklisted_connections = create_small_world_ring
2270(pg,&remove_connections, BLACKLIST); break;
2271@end example
2272
2273
2274Pretty hard to follow, huh?
2275
2276From now on, it is not necessary to include the #if / #endif statements to
2277achieve the same behavior. The GNUNET_log and GNUNET_log_from macros take
2278care of it for you, depending on the configure option:
2279
2280@itemize @bullet
2281@item If @code{--enable-logging} is set to @code{no}, the binary will
2282contain no log messages at all.
2283@item If @code{--enable-logging} is set to @code{yes}, the binary will
2284contain no DEBUG messages, and therefore running with -L DEBUG will have
2285no effect. Other messages (ERROR, WARNING, INFO, etc) will be included.
2286@item If @code{--enable-logging} is set to @code{verbose}, or
2287@code{veryverbose} the binary will contain DEBUG messages (still, it will
2288be neccessary to run with -L DEBUG or set the DEBUG config option to show
2289them).
2290@end itemize
2291
2292
2293If you are a developer:
2294@itemize @bullet
2295@item please make sure that you @code{./configure
2296--enable-logging=@{verbose,veryverbose@}}, so you can see DEBUG messages.
2297@item please remove the @code{#if} statements around @code{GNUNET_log
2298(GNUNET_ERROR_TYPE_DEBUG, ...)} lines, to improve the readibility of your
2299code.
2300@end itemize
2301
2302Since now activating DEBUG automatically makes it VERBOSE and activates
2303@strong{all} debug messages by default, you probably want to use the
2304https://gnunet.org/logging functionality to filter only relevant messages.
2305A suitable configuration could be:
2306
2307@example
2308$ export GNUNET_FORCE_LOG="^YOUR_SUBSYSTEM$;;;;DEBUG/;;;;WARNING"
2309@end example
2310
2311Which will behave almost like enabling DEBUG in that subsytem before the
2312change. Of course you can adapt it to your particular needs, this is only
2313a quick example.
2314
2315@cindex Interprocess communication API
2316@cindex ICP
2317@node Interprocess communication API (IPC)
2318@subsection Interprocess communication API (IPC)
2319
2320In GNUnet a variety of new message types might be defined and used in
2321interprocess communication, in this tutorial we use the
2322@code{struct AddressLookupMessage} as a example to introduce how to
2323construct our own message type in GNUnet and how to implement the message
2324communication between service and client.
2325(Here, a client uses the @code{struct AddressLookupMessage} as a request
2326to ask the server to return the address of any other peer connecting to
2327the service.)
2328
2329
2330@c ***********************************************************************
2331@menu
2332* Define new message types::
2333* Define message struct::
2334* Client - Establish connection::
2335* Client - Initialize request message::
2336* Client - Send request and receive response::
2337* Server - Startup service::
2338* Server - Add new handles for specified messages::
2339* Server - Process request message::
2340* Server - Response to client::
2341* Server - Notification of clients::
2342* Conversion between Network Byte Order (Big Endian) and Host Byte Order::
2343@end menu
2344
2345@node Define new message types
2346@subsubsection Define new message types
2347
2348First of all, you should define the new message type in
2349@file{gnunet_protocols.h}:
2350
2351@example
2352 // Request to look addresses of peers in server.
2353#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP 29
2354 // Response to the address lookup request.
2355#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY 30
2356@end example
2357
2358@c ***********************************************************************
2359@node Define message struct
2360@subsubsection Define message struct
2361
2362After the type definition, the specified message structure should also be
2363described in the header file, e.g. transport.h in our case.
2364
2365@example
2366struct AddressLookupMessage @{
2367 struct GNUNET_MessageHeader header;
2368 int32_t numeric_only GNUNET_PACKED;
2369 struct GNUNET_TIME_AbsoluteNBO timeout;
2370 uint32_t addrlen GNUNET_PACKED;
2371 /* followed by 'addrlen' bytes of the actual address, then
2372 followed by the 0-terminated name of the transport */ @};
2373GNUNET_NETWORK_STRUCT_END
2374@end example
2375
2376
2377Please note @code{GNUNET_NETWORK_STRUCT_BEGIN} and @code{GNUNET_PACKED}
2378which both ensure correct alignment when sending structs over the network.
2379
2380@menu
2381@end menu
2382
2383@c ***********************************************************************
2384@node Client - Establish connection
2385@subsubsection Client - Establish connection
2386@c %**end of header
2387
2388
2389At first, on the client side, the underlying API is employed to create a
2390new connection to a service, in our example the transport service would be
2391connected.
2392
2393@example
2394struct GNUNET_CLIENT_Connection *client;
2395client = GNUNET_CLIENT_connect ("transport", cfg);
2396@end example
2397
2398@c ***********************************************************************
2399@node Client - Initialize request message
2400@subsubsection Client - Initialize request message
2401@c %**end of header
2402
2403When the connection is ready, we initialize the message. In this step,
2404all the fields of the message should be properly initialized, namely the
2405size, type, and some extra user-defined data, such as timeout, name of
2406transport, address and name of transport.
2407
2408@example
2409struct AddressLookupMessage *msg;
2410size_t len = sizeof (struct AddressLookupMessage)
2411 + addressLen
2412 + strlen (nameTrans)
2413 + 1;
2414msg->header->size = htons (len);
2415msg->header->type = htons
2416(GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP);
2417msg->timeout = GNUNET_TIME_absolute_hton (abs_timeout);
2418msg->addrlen = htonl (addressLen);
2419char *addrbuf = (char *) &msg[1];
2420memcpy (addrbuf, address, addressLen);
2421char *tbuf = &addrbuf[addressLen];
2422memcpy (tbuf, nameTrans, strlen (nameTrans) + 1);
2423@end example
2424
2425Note that, here the functions @code{htonl}, @code{htons} and
2426@code{GNUNET_TIME_absolute_hton} are applied to convert little endian
2427into big endian, about the usage of the big/small edian order and the
2428corresponding conversion function please refer to Introduction of
2429Big Endian and Little Endian.
2430
2431@c ***********************************************************************
2432@node Client - Send request and receive response
2433@subsubsection Client - Send request and receive response
2434@c %**end of header
2435
2436@b{FIXME: This is very outdated, see the tutorial for the current API!}
2437
2438Next, the client would send the constructed message as a request to the
2439service and wait for the response from the service. To accomplish this
2440goal, there are a number of API calls that can be used. In this example,
2441@code{GNUNET_CLIENT_transmit_and_get_response} is chosen as the most
2442appropriate function to use.
2443
2444@example
2445GNUNET_CLIENT_transmit_and_get_response
2446(client, msg->header, timeout, GNUNET_YES, &address_response_processor,
2447arp_ctx);
2448@end example
2449
2450the argument @code{address_response_processor} is a function with
2451@code{GNUNET_CLIENT_MessageHandler} type, which is used to process the
2452reply message from the service.
2453
2454@node Server - Startup service
2455@subsubsection Server - Startup service
2456
2457After receiving the request message, we run a standard GNUnet service
2458startup sequence using @code{GNUNET_SERVICE_run}, as follows,
2459
2460@example
2461int main(int argc, char**argv) @{
2462 GNUNET_SERVICE_run(argc, argv, "transport"
2463 GNUNET_SERVICE_OPTION_NONE, &run, NULL)); @}
2464@end example
2465
2466@c ***********************************************************************
2467@node Server - Add new handles for specified messages
2468@subsubsection Server - Add new handles for specified messages
2469@c %**end of header
2470
2471in the function above the argument @code{run} is used to initiate
2472transport service,and defined like this:
2473
2474@example
2475static void run (void *cls,
2476struct GNUNET_SERVER_Handle *serv,
2477const struct GNUNET_CONFIGURATION_Handle *cfg) @{
2478 GNUNET_SERVER_add_handlers (serv, handlers); @}
2479@end example
2480
2481
2482Here, @code{GNUNET_SERVER_add_handlers} must be called in the run
2483function to add new handlers in the service. The parameter
2484@code{handlers} is a list of @code{struct GNUNET_SERVER_MessageHandler}
2485to tell the service which function should be called when a particular
2486type of message is received, and should be defined in this way:
2487
2488@example
2489static struct GNUNET_SERVER_MessageHandler handlers[] = @{
2490 @{&handle_start,
2491 NULL,
2492 GNUNET_MESSAGE_TYPE_TRANSPORT_START,
2493 0@},
2494 @{&handle_send,
2495 NULL,
2496 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND,
2497 0@},
2498 @{&handle_try_connect,
2499 NULL,
2500 GNUNET_MESSAGE_TYPE_TRANSPORT_TRY_CONNECT,
2501 sizeof (struct TryConnectMessage)
2502 @},
2503 @{&handle_address_lookup,
2504 NULL,
2505 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP,
2506 0@},
2507 @{NULL,
2508 NULL,
2509 0,
2510 0@}
2511@};
2512@end example
2513
2514
2515As shown, the first member of the struct in the first area is a callback
2516function, which is called to process the specified message types, given
2517as the third member. The second parameter is the closure for the callback
2518function, which is set to @code{NULL} in most cases, and the last
2519parameter is the expected size of the message of this type, usually we
2520set it to 0 to accept variable size, for special cases the exact size of
2521the specified message also can be set. In addition, the terminator sign
2522depicted as @code{@{NULL, NULL, 0, 0@}} is set in the last aera.
2523
2524@c ***********************************************************************
2525@node Server - Process request message
2526@subsubsection Server - Process request message
2527@c %**end of header
2528
2529After the initialization of transport service, the request message would
2530be processed. Before handling the main message data, the validity of this
2531message should be checked out, e.g., to check whether the size of message
2532is correct.
2533
2534@example
2535size = ntohs (message->size);
2536if (size < sizeof (struct AddressLookupMessage)) @{
2537 GNUNET_break_op (0);
2538 GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
2539 return; @}
2540@end example
2541
2542
2543Note that, opposite to the construction method of the request message in
2544the client, in the server the function @code{nothl} and @code{ntohs}
2545should be employed during the extraction of the data from the message, so
2546that the data in big endian order can be converted back into little
2547endian order. See more in detail please refer to Introduction of
2548Big Endian and Little Endian.
2549
2550Moreover in this example, the name of the transport stored in the message
2551is a 0-terminated string, so we should also check whether the name of the
2552transport in the received message is 0-terminated:
2553
2554@example
2555nameTransport = (const char *) &address[addressLen];
2556if (nameTransport[size - sizeof
2557 (struct AddressLookupMessage)
2558 - addressLen - 1] != '\0') @{
2559 GNUNET_break_op (0);
2560 GNUNET_SERVER_receive_done (client,
2561 GNUNET_SYSERR);
2562 return; @}
2563@end example
2564
2565Here, @code{GNUNET_SERVER_receive_done} should be called to tell the
2566service that the request is done and can receive the next message. The
2567argument @code{GNUNET_SYSERR} here indicates that the service didn't
2568understand the request message, and the processing of this request would
2569be terminated.
2570
2571In comparison to the aforementioned situation, when the argument is equal
2572to @code{GNUNET_OK}, the service would continue to process the requst
2573message.
2574
2575@c ***********************************************************************
2576@node Server - Response to client
2577@subsubsection Server - Response to client
2578@c %**end of header
2579
2580Once the processing of current request is done, the server should give the
2581response to the client. A new @code{struct AddressLookupMessage} would be
2582produced by the server in a similar way as the client did and sent to the
2583client, but here the type should be
2584@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY} rather than
2585@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP} in client.
2586@example
2587struct AddressLookupMessage *msg;
2588size_t len = sizeof (struct AddressLookupMessage)
2589 + addressLen
2590 + strlen (nameTrans) + 1;
2591msg->header->size = htons (len);
2592msg->header->type = htons
2593 (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2594
2595// ...
2596
2597struct GNUNET_SERVER_TransmitContext *tc;
2598tc = GNUNET_SERVER_transmit_context_create (client);
2599GNUNET_SERVER_transmit_context_append_data
2600(tc,
2601 NULL,
2602 0,
2603 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2604GNUNET_SERVER_transmit_context_run (tc, rtimeout);
2605@end example
2606
2607
2608Note that, there are also a number of other APIs provided to the service
2609to send the message.
2610
2611@c ***********************************************************************
2612@node Server - Notification of clients
2613@subsubsection Server - Notification of clients
2614@c %**end of header
2615
2616Often a service needs to (repeatedly) transmit notifications to a client
2617or a group of clients. In these cases, the client typically has once
2618registered for a set of events and then needs to receive a message
2619whenever such an event happens (until the client disconnects). The use of
2620a notification context can help manage message queues to clients and
2621handle disconnects. Notification contexts can be used to send
2622individualized messages to a particular client or to broadcast messages
2623to a group of clients. An individualized notification might look like
2624this:
2625
2626@example
2627GNUNET_SERVER_notification_context_unicast(nc,
2628 client,
2629 msg,
2630 GNUNET_YES);
2631@end example
2632
2633
2634Note that after processing the original registration message for
2635notifications, the server code still typically needs to call
2636@code{GNUNET_SERVER_receive_done} so that the client can transmit further
2637messages to the server.
2638
2639@c ***********************************************************************
2640@node Conversion between Network Byte Order (Big Endian) and Host Byte Order
2641@subsubsection Conversion between Network Byte Order (Big Endian) and Host Byte Order
2642@c %** subsub? it's a referenced page on the ipc document.
2643@c %**end of header
2644
2645Here we can simply comprehend big endian and little endian as Network Byte
2646Order and Host Byte Order respectively. What is the difference between
2647both two?
2648
2649Usually in our host computer we store the data byte as Host Byte Order,
2650for example, we store a integer in the RAM which might occupies 4 Byte,
2651as Host Byte Order the higher Byte would be stored at the lower address
2652of RAM, and the lower Byte would be stored at the higher address of RAM.
2653However, contrast to this, Network Byte Order just take the totally
2654opposite way to store the data, says, it will store the lower Byte at the
2655lower address, and the higher Byte will stay at higher address.
2656
2657For the current communication of network, we normally exchange the
2658information by surveying the data package, every two host wants to
2659communicate with each other must send and receive data package through
2660network. In order to maintain the identity of data through the
2661transmission in the network, the order of the Byte storage must changed
2662before sending and after receiving the data.
2663
2664There ten convenient functions to realize the conversion of Byte Order in
2665GNUnet, as following:
2666
2667@table @asis
2668
2669@item uint16_t htons(uint16_t hostshort) Convert host byte order to net
2670byte order with short int
2671@item uint32_t htonl(uint32_t hostlong) Convert host byte
2672order to net byte order with long int
2673@item uint16_t ntohs(uint16_t netshort)
2674Convert net byte order to host byte order with short int
2675@item uint32_t
2676ntohl(uint32_t netlong) Convert net byte order to host byte order with
2677long int
2678@item unsigned long long GNUNET_ntohll (unsigned long long netlonglong)
2679Convert net byte order to host byte order with long long int
2680@item unsigned long long GNUNET_htonll (unsigned long long hostlonglong)
2681Convert host byte order to net byte order with long long int
2682@item struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton
2683(struct GNUNET_TIME_Relative a) Convert relative time to network byte
2684order.
2685@item struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh
2686(struct GNUNET_TIME_RelativeNBO a) Convert relative time from network
2687byte order.
2688@item struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton
2689(struct GNUNET_TIME_Absolute a) Convert relative time to network byte
2690order.
2691@item struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh
2692(struct GNUNET_TIME_AbsoluteNBO a) Convert relative time from network
2693byte order.
2694@end table
2695
2696@cindex Cryptography API
2697@node Cryptography API
2698@subsection Cryptography API
2699@c %**end of header
2700
2701The gnunetutil APIs provides the cryptographic primitives used in GNUnet.
2702GNUnet uses 2048 bit RSA keys for the session key exchange and for signing
2703messages by peers and most other public-key operations. Most researchers
2704in cryptography consider 2048 bit RSA keys as secure and practically
2705unbreakable for a long time. The API provides functions to create a fresh
2706key pair, read a private key from a file (or create a new file if the
2707file does not exist), encrypt, decrypt, sign, verify and extraction of
2708the public key into a format suitable for network transmission.
2709
2710For the encryption of files and the actual data exchanged between peers
2711GNUnet uses 256-bit AES encryption. Fresh, session keys are negotiated
2712for every new connection.@ Again, there is no published technique to
2713break this cipher in any realistic amount of time. The API provides
2714functions for generation of keys, validation of keys (important for
2715checking that decryptions using RSA succeeded), encryption and decryption.
2716
2717GNUnet uses SHA-512 for computing one-way hash codes. The API provides
2718functions to compute a hash over a block in memory or over a file on disk.
2719
2720The crypto API also provides functions for randomizing a block of memory,
2721obtaining a single random number and for generating a permuation of the
2722numbers 0 to n-1. Random number generation distinguishes between WEAK and
2723STRONG random number quality; WEAK random numbers are pseudo-random
2724whereas STRONG random numbers use entropy gathered from the operating
2725system.
2726
2727Finally, the crypto API provides a means to deterministically generate a
27281024-bit RSA key from a hash code. These functions should most likely not
2729be used by most applications; most importantly,
2730GNUNET_CRYPTO_rsa_key_create_from_hash does not create an RSA-key that
2731should be considered secure for traditional applications of RSA.
2732
2733@cindex Message Queue API
2734@node Message Queue API
2735@subsection Message Queue API
2736@c %**end of header
2737
2738@strong{ Introduction }@
2739Often, applications need to queue messages that
2740are to be sent to other GNUnet peers, clients or services. As all of
2741GNUnet's message-based communication APIs, by design, do not allow
2742messages to be queued, it is common to implement custom message queues
2743manually when they are needed. However, writing very similar code in
2744multiple places is tedious and leads to code duplication.
2745
2746MQ (for Message Queue) is an API that provides the functionality to
2747implement and use message queues. We intend to eventually replace all of
2748the custom message queue implementations in GNUnet with MQ.
2749
2750@strong{ Basic Concepts }@
2751The two most important entities in MQ are queues and envelopes.
2752
2753Every queue is backed by a specific implementation (e.g. for mesh, stream,
2754connection, server client, etc.) that will actually deliver the queued
2755messages. For convenience,@ some queues also allow to specify a list of
2756message handlers. The message queue will then also wait for incoming
2757messages and dispatch them appropriately.
2758
2759An envelope holds the the memory for a message, as well as metadata
2760(Where is the envelope queued? What should happen after it has been
2761sent?). Any envelope can only be queued in one message queue.
2762
2763@strong{ Creating Queues }@
2764The following is a list of currently available message queues. Note that
2765to avoid layering issues, message queues for higher level APIs are not
2766part of @code{libgnunetutil}, but@ the respective API itself provides the
2767queue implementation.
2768
2769@table @asis
2770
2771@item @code{GNUNET_MQ_queue_for_connection_client}
2772Transmits queued messages over a @code{GNUNET_CLIENT_Connection} handle.
2773Also supports receiving with message handlers.
2774
2775@item @code{GNUNET_MQ_queue_for_server_client}
2776Transmits queued messages over a @code{GNUNET_SERVER_Client} handle. Does
2777not support incoming message handlers.
2778
2779@item @code{GNUNET_MESH_mq_create} Transmits queued messages over a
2780@code{GNUNET_MESH_Tunnel} handle. Does not support incoming message
2781handlers.
2782
2783@item @code{GNUNET_MQ_queue_for_callbacks} This is the most general
2784implementation. Instead of delivering and receiving messages with one of
2785GNUnet's communication APIs, implementation callbacks are called. Refer to
2786"Implementing Queues" for a more detailed explanation.
2787@end table
2788
2789
2790@strong{ Allocating Envelopes }@
2791A GNUnet message (as defined by the GNUNET_MessageHeader) has three
2792parts: The size, the type, and the body.
2793
2794MQ provides macros to allocate an envelope containing a message
2795conveniently, automatically setting the size and type fields of the
2796message.
2797
2798Consider the following simple message, with the body consisting of a
2799single number value.
2800@c why the empy code function?
2801@code{}
2802
2803@example
2804struct NumberMessage @{
2805 /** Type: GNUNET_MESSAGE_TYPE_EXAMPLE_1 */
2806 struct GNUNET_MessageHeader header;
2807 uint32_t number GNUNET_PACKED;
2808@};
2809@end example
2810
2811An envelope containing an instance of the NumberMessage can be
2812constructed like this:
2813
2814@example
2815struct GNUNET_MQ_Envelope *ev;
2816struct NumberMessage *msg;
2817ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_EXAMPLE_1);
2818msg->number = htonl (42);
2819@end example
2820
2821In the above code, @code{GNUNET_MQ_msg} is a macro. The return value is
2822the newly allocated envelope. The first argument must be a pointer to some
2823@code{struct} containing a @code{struct GNUNET_MessageHeader header}
2824field, while the second argument is the desired message type, in host
2825byte order.
2826
2827The @code{msg} pointer now points to an allocated message, where the
2828message type and the message size are already set. The message's size is
2829inferred from the type of the @code{msg} pointer: It will be set to
2830'sizeof(*msg)', properly converted to network byte order.
2831
2832If the message body's size is dynamic, the the macro
2833@code{GNUNET_MQ_msg_extra} can be used to allocate an envelope whose
2834message has additional space allocated after the @code{msg} structure.
2835
2836If no structure has been defined for the message,
2837@code{GNUNET_MQ_msg_header_extra} can be used to allocate additional space
2838after the message header. The first argument then must be a pointer to a
2839@code{GNUNET_MessageHeader}.
2840
2841@strong{Envelope Properties}@
2842A few functions in MQ allow to set additional properties on envelopes:
2843
2844@table @asis
2845
2846@item @code{GNUNET_MQ_notify_sent} Allows to specify a function that will
2847be called once the envelope's message has been sent irrevocably.
2848An envelope can be canceled precisely up to the@ point where the notify
2849sent callback has been called.
2850
2851@item @code{GNUNET_MQ_disable_corking} No corking will be used when
2852sending the message. Not every@ queue supports this flag, per default,
2853envelopes are sent with corking.@
2854
2855@end table
2856
2857
2858@strong{Sending Envelopes}@
2859Once an envelope has been constructed, it can be queued for sending with
2860@code{GNUNET_MQ_send}.
2861
2862Note that in order to avoid memory leaks, an envelope must either be sent
2863(the queue will free it) or destroyed explicitly with
2864@code{GNUNET_MQ_discard}.
2865
2866@strong{Canceling Envelopes}@
2867An envelope queued with @code{GNUNET_MQ_send} can be canceled with
2868@code{GNUNET_MQ_cancel}. Note that after the notify sent callback has
2869been called, canceling a message results in undefined behavior.
2870Thus it is unsafe to cancel an envelope that does not have a notify sent
2871callback. When canceling an envelope, it is not necessary@ to call
2872@code{GNUNET_MQ_discard}, and the envelope can't be sent again.
2873
2874@strong{ Implementing Queues }@
2875@code{TODO}
2876
2877@cindex Service API
2878@node Service API
2879@subsection Service API
2880@c %**end of header
2881
2882Most GNUnet code lives in the form of services. Services are processes
2883that offer an API for other components of the system to build on. Those
2884other components can be command-line tools for users, graphical user
2885interfaces or other services. Services provide their API using an IPC
2886protocol. For this, each service must listen on either a TCP port or a
2887UNIX domain socket; for this, the service implementation uses the server
2888API. This use of server is exposed directly to the users of the service
2889API. Thus, when using the service API, one is usually also often using
2890large parts of the server API. The service API provides various
2891convenience functions, such as parsing command-line arguments and the
2892configuration file, which are not found in the server API.
2893The dual to the service/server API is the client API, which can be used to
2894access services.
2895
2896The most common way to start a service is to use the
2897@code{GNUNET_SERVICE_run} function from the program's main function.
2898@code{GNUNET_SERVICE_run} will then parse the command line and
2899configuration files and, based on the options found there,
2900start the server. It will then give back control to the main
2901program, passing the server and the configuration to the
2902@code{GNUNET_SERVICE_Main} callback. @code{GNUNET_SERVICE_run}
2903will also take care of starting the scheduler loop.
2904If this is inappropriate (for example, because the scheduler loop
2905is already running), @code{GNUNET_SERVICE_start} and
2906related functions provide an alternative to @code{GNUNET_SERVICE_run}.
2907
2908When starting a service, the service_name option is used to determine
2909which sections in the configuration file should be used to configure the
2910service. A typical value here is the name of the @file{src/}
2911sub-directory, for example "@file{statistics}".
2912The same string would also be given to
2913@code{GNUNET_CLIENT_connect} to access the service.
2914
2915Once a service has been initialized, the program should use the
2916@code{GNUNET_SERVICE_Main} callback to register message handlers
2917using @code{GNUNET_SERVER_add_handlers}.
2918The service will already have registered a handler for the
2919"TEST" message.
2920
2921@fnindex GNUNET_SERVICE_Options
2922The option bitfield (@code{enum GNUNET_SERVICE_Options})
2923determines how a service should behave during shutdown.
2924There are three key strategies:
2925
2926@table @asis
2927
2928@item instant (@code{GNUNET_SERVICE_OPTION_NONE})
2929Upon receiving the shutdown
2930signal from the scheduler, the service immediately terminates the server,
2931closing all existing connections with clients.
2932@item manual (@code{GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN})
2933The service does nothing by itself
2934during shutdown. The main program will need to take the appropriate
2935action by calling GNUNET_SERVER_destroy or GNUNET_SERVICE_stop (depending
2936on how the service was initialized) to terminate the service. This method
2937is used by gnunet-service-arm and rather uncommon.
2938@item soft (@code{GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN})
2939Upon receiving the shutdown signal from the scheduler,
2940the service immediately tells the server to stop
2941listening for incoming clients. Requests from normal existing clients are
2942still processed and the server/service terminates once all normal clients
2943have disconnected. Clients that are not expected to ever disconnect (such
2944as clients that monitor performance values) can be marked as 'monitor'
2945clients using GNUNET_SERVER_client_mark_monitor. Those clients will
2946continue to be processed until all 'normal' clients have disconnected.
2947Then, the server will terminate, closing the monitor connections.
2948This mode is for example used by 'statistics', allowing existing 'normal'
2949clients to set (possibly persistent) statistic values before terminating.
2950
2951@end table
2952
2953@c ***********************************************************************
2954@node Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2955@subsection Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2956@c %**end of header
2957
2958A commonly used data structure in GNUnet is a (multi-)hash map. It is most
2959often used to map a peer identity to some data structure, but also to map
2960arbitrary keys to values (for example to track requests in the distributed
2961hash table or in file-sharing). As it is commonly used, the DHT is
2962actually sometimes responsible for a large share of GNUnet's overall
2963memory consumption (for some processes, 30% is not uncommon). The
2964following text documents some API quirks (and their implications for
2965applications) that were recently introduced to minimize the footprint of
2966the hash map.
2967
2968
2969@c ***********************************************************************
2970@menu
2971* Analysis::
2972* Solution::
2973* Migration::
2974* Conclusion::
2975* Availability::
2976@end menu
2977
2978@node Analysis
2979@subsubsection Analysis
2980@c %**end of header
2981
2982The main reason for the "excessive" memory consumption by the hash map is
2983that GNUnet uses 512-bit cryptographic hash codes --- and the
2984(multi-)hash map also uses the same 512-bit 'struct GNUNET_HashCode'. As
2985a result, storing just the keys requires 64 bytes of memory for each key.
2986As some applications like to keep a large number of entries in the hash
2987map (after all, that's what maps are good for), 64 bytes per hash is
2988significant: keeping a pointer to the value and having a linked list for
2989collisions consume between 8 and 16 bytes, and 'malloc' may add about the
2990same overhead per allocation, putting us in the 16 to 32 byte per entry
2991ballpark. Adding a 64-byte key then triples the overall memory
2992requirement for the hash map.
2993
2994To make things "worse", most of the time storing the key in the hash map
2995is not required: it is typically already in memory elsewhere! In most
2996cases, the values stored in the hash map are some application-specific
2997struct that _also_ contains the hash. Here is a simplified example:
2998
2999@example
3000struct MyValue @{
3001struct GNUNET_HashCode key;
3002unsigned int my_data; @};
3003
3004// ...
3005val = GNUNET_malloc (sizeof (struct MyValue));
3006val->key = key;
3007val->my_data = 42;
3008GNUNET_CONTAINER_multihashmap_put (map, &key, val, ...);
3009@end example
3010
3011This is a common pattern as later the entries might need to be removed,
3012and at that time it is convenient to have the key immediately at hand:
3013
3014@example
3015GNUNET_CONTAINER_multihashmap_remove (map, &val->key, val);
3016@end example
3017
3018
3019Note that here we end up with two times 64 bytes for the key, plus maybe
302064 bytes total for the rest of the 'struct MyValue' and the map entry in
3021the hash map. The resulting redundant storage of the key increases
3022overall memory consumption per entry from the "optimal" 128 bytes to 192
3023bytes. This is not just an extreme example: overheads in practice are
3024actually sometimes close to those highlighted in this example. This is
3025especially true for maps with a significant number of entries, as there
3026we tend to really try to keep the entries small.
3027
3028@c ***********************************************************************
3029@node Solution
3030@subsubsection Solution
3031@c %**end of header
3032
3033The solution that has now been implemented is to @strong{optionally}
3034allow the hash map to not make a (deep) copy of the hash but instead have
3035a pointer to the hash/key in the entry. This reduces the memory
3036consumption for the key from 64 bytes to 4 to 8 bytes. However, it can
3037also only work if the key is actually stored in the entry (which is the
3038case most of the time) and if the entry does not modify the key (which in
3039all of the code I'm aware of has been always the case if there key is
3040stored in the entry). Finally, when the client stores an entry in the
3041hash map, it @strong{must} provide a pointer to the key within the entry,
3042not just a pointer to a transient location of the key. If
3043the client code does not meet these requirements, the result is a dangling
3044pointer and undefined behavior of the (multi-)hash map API.
3045
3046@c ***********************************************************************
3047@node Migration
3048@subsubsection Migration
3049@c %**end of header
3050
3051To use the new feature, first check that the values contain the respective
3052key (and never modify it). Then, all calls to
3053@code{GNUNET_CONTAINER_multihashmap_put} on the respective map must be
3054audited and most likely changed to pass a pointer into the value's struct.
3055For the initial example, the new code would look like this:
3056
3057@example
3058struct MyValue @{
3059struct GNUNET_HashCode key;
3060unsigned int my_data; @};
3061
3062// ...
3063val = GNUNET_malloc (sizeof (struct MyValue));
3064val->key = key; val->my_data = 42;
3065GNUNET_CONTAINER_multihashmap_put (map, &val->key, val, ...);
3066@end example
3067
3068
3069Note that @code{&val} was changed to @code{&val->key} in the argument to
3070the @code{put} call. This is critical as often @code{key} is on the stack
3071or in some other transient data structure and thus having the hash map
3072keep a pointer to @code{key} would not work. Only the key inside of
3073@code{val} has the same lifetime as the entry in the map (this must of
3074course be checked as well). Naturally, @code{val->key} must be
3075intiialized before the @code{put} call. Once all @code{put} calls have
3076been converted and double-checked, you can change the call to create the
3077hash map from
3078
3079@example
3080map =
3081GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_NO);
3082@end example
3083
3084to
3085
3086@example
3087map = GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_YES);
3088@end example
3089
3090If everything was done correctly, you now use about 60 bytes less memory
3091per entry in @code{map}. However, if now (or in the future) any call to
3092@code{put} does not ensure that the given key is valid until the entry is
3093removed from the map, undefined behavior is likely to be observed.
3094
3095@c ***********************************************************************
3096@node Conclusion
3097@subsubsection Conclusion
3098@c %**end of header
3099
3100The new optimization can is often applicable and can result in a
3101reduction in memory consumption of up to 30% in practice. However, it
3102makes the code less robust as additional invariants are imposed on the
3103multi hash map client. Thus applications should refrain from enabling the
3104new mode unless the resulting performance increase is deemed significant
3105enough. In particular, it should generally not be used in new code (wait
3106at least until benchmarks exist).
3107
3108@c ***********************************************************************
3109@node Availability
3110@subsubsection Availability
3111@c %**end of header
3112
3113The new multi hash map code was committed in SVN 24319 (will be in GNUnet
31140.9.4). Various subsystems (transport, core, dht, file-sharing) were
3115previously audited and modified to take advantage of the new capability.
3116In particular, memory consumption of the file-sharing service is expected
3117to drop by 20-30% due to this change.
3118
3119
3120@cindex CONTAINER_MDLL API
3121@node The CONTAINER_MDLL API
3122@subsection The CONTAINER_MDLL API
3123@c %**end of header
3124
3125This text documents the GNUNET_CONTAINER_MDLL API. The
3126GNUNET_CONTAINER_MDLL API is similar to the GNUNET_CONTAINER_DLL API in
3127that it provides operations for the construction and manipulation of
3128doubly-linked lists. The key difference to the (simpler) DLL-API is that
3129the MDLL-version allows a single element (instance of a "struct") to be
3130in multiple linked lists at the same time.
3131
3132Like the DLL API, the MDLL API stores (most of) the data structures for
3133the doubly-linked list with the respective elements; only the 'head' and
3134'tail' pointers are stored "elsewhere" --- and the application needs to
3135provide the locations of head and tail to each of the calls in the
3136MDLL API. The key difference for the MDLL API is that the "next" and
3137"previous" pointers in the struct can no longer be simply called "next"
3138and "prev" --- after all, the element may be in multiple doubly-linked
3139lists, so we cannot just have one "next" and one "prev" pointer!
3140
3141The solution is to have multiple fields that must have a name of the
3142format "next_XX" and "prev_XX" where "XX" is the name of one of the
3143doubly-linked lists. Here is a simple example:
3144
3145@example
3146struct MyMultiListElement @{
3147 struct MyMultiListElement *next_ALIST;
3148 struct MyMultiListElement *prev_ALIST;
3149 struct MyMultiListElement *next_BLIST;
3150 struct MyMultiListElement *prev_BLIST;
3151 void
3152 *data;
3153@};
3154@end example
3155
3156
3157Note that by convention, we use all-uppercase letters for the list names.
3158In addition, the program needs to have a location for the head and tail
3159pointers for both lists, for example:
3160
3161@example
3162static struct MyMultiListElement *head_ALIST;
3163static struct MyMultiListElement *tail_ALIST;
3164static struct MyMultiListElement *head_BLIST;
3165static struct MyMultiListElement *tail_BLIST;
3166@end example
3167
3168
3169Using the MDLL-macros, we can now insert an element into the ALIST:
3170
3171@example
3172GNUNET_CONTAINER_MDLL_insert (ALIST, head_ALIST, tail_ALIST, element);
3173@end example
3174
3175
3176Passing "ALIST" as the first argument to MDLL specifies which of the
3177next/prev fields in the 'struct MyMultiListElement' should be used. The
3178extra "ALIST" argument and the "_ALIST" in the names of the
3179next/prev-members are the only differences between the MDDL and DLL-API.
3180Like the DLL-API, the MDLL-API offers functions for inserting (at head,
3181at tail, after a given element) and removing elements from the list.
3182Iterating over the list should be done by directly accessing the
3183"next_XX" and/or "prev_XX" members.
3184
3185@cindex Automatic Restart Manager
3186@cindex ARM
3187@node The Automatic Restart Manager (ARM)
3188@section The Automatic Restart Manager (ARM)
3189@c %**end of header
3190
3191GNUnet's Automated Restart Manager (ARM) is the GNUnet service responsible
3192for system initialization and service babysitting. ARM starts and halts
3193services, detects configuration changes and restarts services impacted by
3194the changes as needed. It's also responsible for restarting services in
3195case of crashes and is planned to incorporate automatic debugging for
3196diagnosing service crashes providing developers insights about crash
3197reasons. The purpose of this document is to give GNUnet developer an idea
3198about how ARM works and how to interact with it.
3199
3200@menu
3201* Basic functionality::
3202* Key configuration options::
3203* ARM - Availability::
3204* Reliability::
3205@end menu
3206
3207@c ***********************************************************************
3208@node Basic functionality
3209@subsection Basic functionality
3210@c %**end of header
3211
3212@itemize @bullet
3213@item ARM source code can be found under "src/arm".@ Service processes are
3214managed by the functions in "gnunet-service-arm.c" which is controlled
3215with "gnunet-arm.c" (main function in that file is ARM's entry point).
3216
3217@item The functions responsible for communicating with ARM , starting and
3218stopping services -including ARM service itself- are provided by the
3219ARM API "arm_api.c".@ Function: GNUNET_ARM_connect() returns to the caller
3220an ARM handle after setting it to the caller's context (configuration and
3221scheduler in use). This handle can be used afterwards by the caller to
3222communicate with ARM. Functions GNUNET_ARM_start_service() and
3223GNUNET_ARM_stop_service() are used for starting and stopping services
3224respectively.
3225
3226@item A typical example of using these basic ARM services can be found in
3227file test_arm_api.c. The test case connects to ARM, starts it, then uses
3228it to start a service "resolver", stops the "resolver" then stops "ARM".
3229@end itemize
3230
3231@c ***********************************************************************
3232@node Key configuration options
3233@subsection Key configuration options
3234@c %**end of header
3235
3236Configurations for ARM and services should be available in a .conf file
3237(As an example, see test_arm_api_data.conf). When running ARM, the
3238configuration file to use should be passed to the command:
3239
3240@example
3241$ gnunet-arm -s -c configuration_to_use.conf
3242@end example
3243
3244If no configuration is passed, the default configuration file will be used
3245(see GNUNET_PREFIX/share/gnunet/defaults.conf which is created from
3246contrib/defaults.conf).@ Each of the services is having a section starting
3247by the service name between square brackets, for example: "[arm]".
3248The following options configure how ARM configures or interacts with the
3249various services:
3250
3251@table @asis
3252
3253@item PORT Port number on which the service is listening for incoming TCP
3254connections. ARM will start the services should it notice a request at
3255this port.
3256
3257@item HOSTNAME Specifies on which host the service is deployed. Note
3258that ARM can only start services that are running on the local system
3259(but will not check that the hostname matches the local machine name).
3260This option is used by the @code{gnunet_client_lib.h} implementation to
3261determine which system to connect to. The default is "localhost".
3262
3263@item BINARY The name of the service binary file.
3264
3265@item OPTIONS To be passed to the service.
3266
3267@item PREFIX A command to pre-pend to the actual command, for example,
3268running a service with "valgrind" or "gdb"
3269
3270@item DEBUG Run in debug mode (much verbosity).
3271
3272@item AUTOSTART ARM will listen to UNIX domain socket and/or TCP port of
3273the service and start the service on-demand.
3274
3275@item FORCESTART ARM will always start this service when the peer
3276is started.
3277
3278@item ACCEPT_FROM IPv4 addresses the service accepts connections from.
3279
3280@item ACCEPT_FROM6 IPv6 addresses the service accepts connections from.
3281
3282@end table
3283
3284
3285Options that impact the operation of ARM overall are in the "[arm]"
3286section. ARM is a normal service and has (except for AUTOSTART) all of the
3287options that other services do. In addition, ARM has the
3288following options:
3289
3290@table @asis
3291
3292@item GLOBAL_PREFIX Command to be pre-pended to all services that are
3293going to run.
3294
3295@item GLOBAL_POSTFIX Global option that will be supplied to all the
3296services that are going to run.
3297
3298@end table
3299
3300@c ***********************************************************************
3301@node ARM - Availability
3302@subsection ARM - Availability
3303@c %**end of header
3304
3305As mentioned before, one of the features provided by ARM is starting
3306services on demand. Consider the example of one service "client" that
3307wants to connect to another service a "server". The "client" will ask ARM
3308to run the "server". ARM starts the "server". The "server" starts
3309listening to incoming connections. The "client" will establish a
3310connection with the "server". And then, they will start to communicate
3311together.@ One problem with that scheme is that it's slow!@
3312The "client" service wants to communicate with the "server" service at
3313once and is not willing wait for it to be started and listening to
3314incoming connections before serving its request.@ One solution for that
3315problem will be that ARM starts all services as default services. That
3316solution will solve the problem, yet, it's not quite practical, for some
3317services that are going to be started can never be used or are going to
3318be used after a relatively long time.@
3319The approach followed by ARM to solve this problem is as follows:
3320
3321@itemize @bullet
3322
3323@item For each service having a PORT field in the configuration file and
3324that is not one of the default services ( a service that accepts incoming
3325connections from clients), ARM creates listening sockets for all addresses
3326associated with that service.
3327
3328@item The "client" will immediately establish a connection with
3329the "server".
3330
3331@item ARM --- pretending to be the "server" --- will listen on the
3332respective port and notice the incoming connection from the "client"
3333(but not accept it), instead
3334
3335@item Once there is an incoming connection, ARM will start the "server",
3336passing on the listen sockets (now, the service is started and can do its
3337work).
3338
3339@item Other client services now can directly connect directly to the
3340"server".
3341
3342@end itemize
3343
3344@c ***********************************************************************
3345@node Reliability
3346@subsection Reliability
3347
3348One of the features provided by ARM, is the automatic restart of crashed
3349services.@ ARM needs to know which of the running services died. Function
3350"gnunet-service-arm.c/maint_child_death()" is responsible for that. The
3351function is scheduled to run upon receiving a SIGCHLD signal. The
3352function, then, iterates ARM's list of services running and monitors
3353which service has died (crashed). For all crashing services, ARM restarts
3354them.@
3355Now, considering the case of a service having a serious problem causing it
3356to crash each time it's started by ARM. If ARM keeps blindly restarting
3357such a service, we are going to have the pattern:
3358start-crash-restart-crash-restart-crash and so forth!! Which is of course
3359not practical.@
3360For that reason, ARM schedules the service to be restarted after waiting
3361for some delay that grows exponentially with each crash/restart of that
3362service.@ To clarify the idea, considering the following example:
3363
3364@itemize @bullet
3365
3366@item Service S crashed.
3367
3368@item ARM receives the SIGCHLD and inspects its list of services to find
3369the dead one(s).
3370
3371@item ARM finds S dead and schedules it for restarting after "backoff"
3372time which is initially set to 1ms. ARM will double the backoff time
3373correspondent to S (now backoff(S) = 2ms)
3374
3375@item Because there is a severe problem with S, it crashed again.
3376
3377@item Again ARM receives the SIGCHLD and detects that it's S again that's
3378crashed. ARM schedules it for restarting but after its new backoff time
3379(which became 2ms), and doubles its backoff time (now backoff(S) = 4).
3380
3381@item and so on, until backoff(S) reaches a certain threshold
3382(@code{EXPONENTIAL_BACKOFF_THRESHOLD} is set to half an hour),
3383after reaching it, backoff(S) will remain half an hour,
3384hence ARM won't be busy for a lot of time trying to restart a
3385problematic service.
3386@end itemize
3387
3388@cindex TRANSPORT Subsystem
3389@node GNUnet's TRANSPORT Subsystem
3390@section GNUnet's TRANSPORT Subsystem
3391@c %**end of header
3392
3393This chapter documents how the GNUnet transport subsystem works. The
3394GNUnet transport subsystem consists of three main components: the
3395transport API (the interface used by the rest of the system to access the
3396transport service), the transport service itself (most of the interesting
3397functions, such as choosing transports, happens here) and the transport
3398plugins. A transport plugin is a concrete implementation for how two
3399GNUnet peers communicate; many plugins exist, for example for
3400communication via TCP, UDP, HTTP, HTTPS and others. Finally, the
3401transport subsystem uses supporting code, especially the NAT/UPnP
3402library to help with tasks such as NAT traversal.
3403
3404Key tasks of the transport service include:
3405
3406@itemize @bullet
3407
3408@item Create our HELLO message, notify clients and neighbours if our HELLO
3409changes (using NAT library as necessary)
3410
3411@item Validate HELLOs from other peers (send PING), allow other peers to
3412validate our HELLO's addresses (send PONG)
3413
3414@item Upon request, establish connections to other peers (using address
3415selection from ATS subsystem) and maintain them (again using PINGs and
3416PONGs) as long as desired
3417
3418@item Accept incoming connections, give ATS service the opportunity to
3419switch communication channels
3420
3421@item Notify clients about peers that have connected to us or that have
3422been disconnected from us
3423
3424@item If a (stateful) connection goes down unexpectedly (without explicit
3425DISCONNECT), quickly attempt to recover (without notifying clients) but do
3426notify clients quickly if reconnecting fails
3427
3428@item Send (payload) messages arriving from clients to other peers via
3429transport plugins and receive messages from other peers, forwarding
3430those to clients
3431
3432@item Enforce inbound traffic limits (using flow-control if it is
3433applicable); outbound traffic limits are enforced by CORE, not by us (!)
3434
3435@item Enforce restrictions on P2P connection as specified by the blacklist
3436configuration and blacklisting clients
3437@end itemize
3438
3439Note that the term "clients" in the list above really refers to the
3440GNUnet-CORE service, as CORE is typically the only client of the
3441transport service.
3442
3443@menu
3444* Address validation protocol::
3445@end menu
3446
3447@node Address validation protocol
3448@subsection Address validation protocol
3449@c %**end of header
3450
3451This section documents how the GNUnet transport service validates
3452connections with other peers. It is a high-level description of the
3453protocol necessary to understand the details of the implementation. It
3454should be noted that when we talk about PING and PONG messages in this
3455section, we refer to transport-level PING and PONG messages, which are
3456different from core-level PING and PONG messages (both in implementation
3457and function).
3458
3459The goal of transport-level address validation is to minimize the chances
3460of a successful man-in-the-middle attack against GNUnet peers on the
3461transport level. Such an attack would not allow the adversary to decrypt
3462the P2P transmissions, but a successful attacker could at least measure
3463traffic volumes and latencies (raising the adversaries capablities by
3464those of a global passive adversary in the worst case). The scenarios we
3465are concerned about is an attacker, Mallory, giving a HELLO to Alice that
3466claims to be for Bob, but contains Mallory's IP address instead of Bobs
3467(for some transport). Mallory would then forward the traffic to Bob (by
3468initiating a connection to Bob and claiming to be Alice). As a further
3469complication, the scheme has to work even if say Alice is behind a NAT
3470without traversal support and hence has no address of their own (and thus
3471Alice must always initiate the connection to Bob).
3472
3473An additional constraint is that HELLO messages do not contain a
3474cryptographic signature since other peers must be able to edit
3475(i.e. remove) addresses from the HELLO at any time (this was not true in
3476GNUnet 0.8.x). A basic @strong{assumption} is that each peer knows the
3477set of possible network addresses that it @strong{might} be reachable
3478under (so for example, the external IP address of the NAT plus the LAN
3479address(es) with the respective ports).
3480
3481The solution is the following. If Alice wants to validate that a given
3482address for Bob is valid (i.e. is actually established @strong{directly}
3483with the intended target), it sends a PING message over that connection
3484to Bob. Note that in this case, Alice initiated the connection so only
3485Alice knows which address was used for sure (Alice maybe behind NAT, so
3486whatever address Bob sees may not be an address Alice knows they have).
3487Bob
3488checks that the address given in the PING is actually one of Bob's
3489addresses
3490(does not belong to Mallory), and if it is, sends back a PONG (with a
3491signature that says that Bob owns/uses the address from the PING). Alice
3492checks the signature and is happy if it is valid and the address in the
3493PONG is the address Alice used.
3494This is similar to the 0.8.x protocol where the HELLO contained a
3495signature from Bob for each address used by Bob.
3496Here, the purpose code for the signature is
3497@code{GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN}. After this, Alice will
3498remember Bob's address and consider the address valid for a while (12h in
3499the current implementation). Note that after this exchange, Alice only
3500considers Bob's address to be valid, the connection itself is not
3501considered 'established'. In particular, Alice may have many addresses
3502for Bob that Alice considers valid.
3503
3504The PONG message is protected with a nonce/challenge against replay
3505attacks and uses an expiration time for the signature (but those are
3506almost implementation details).
3507
3508@cindex NAT library
3509@node NAT library
3510@section NAT library
3511@c %**end of header
3512
3513The goal of the GNUnet NAT library is to provide a general-purpose API for
3514NAT traversal @strong{without} third-party support. So protocols that
3515involve contacting a third peer to help establish a connection between
3516two peers are outside of the scope of this API. That does not mean that
3517GNUnet doesn't support involving a third peer (we can do this with the
3518distance-vector transport or using application-level protocols), it just
3519means that the NAT API is not concerned with this possibility. The API is
3520written so that it will work for IPv6-NAT in the future as well as
3521current IPv4-NAT. Furthermore, the NAT API is always used, even for peers
3522that are not behind NAT --- in that case, the mapping provided is simply
3523the identity.
3524
3525NAT traversal is initiated by calling @code{GNUNET_NAT_register}. Given a
3526set of addresses that the peer has locally bound to (TCP or UDP), the NAT
3527library will return (via callback) a (possibly longer) list of addresses
3528the peer @strong{might} be reachable under. Internally, depending on the
3529configuration, the NAT library will try to punch a hole (using UPnP) or
3530just "know" that the NAT was manually punched and generate the respective
3531external IP address (the one that should be globally visible) based on
3532the given information.
3533
3534The NAT library also supports ICMP-based NAT traversal. Here, the other
3535peer can request connection-reversal by this peer (in this special case,
3536the peer is even allowed to configure a port number of zero). If the NAT
3537library detects a connection-reversal request, it returns the respective
3538target address to the client as well. It should be noted that
3539connection-reversal is currently only intended for TCP, so other plugins
3540@strong{must} pass @code{NULL} for the reversal callback. Naturally, the
3541NAT library also supports requesting connection reversal from a remote
3542peer (@code{GNUNET_NAT_run_client}).
3543
3544Once initialized, the NAT handle can be used to test if a given address is
3545possibly a valid address for this peer (@code{GNUNET_NAT_test_address}).
3546This is used for validating our addresses when generating PONGs.
3547
3548Finally, the NAT library contains an API to test if our NAT configuration
3549is correct. Using @code{GNUNET_NAT_test_start} @strong{before} binding to
3550the respective port, the NAT library can be used to test if the
3551configuration works. The test function act as a local client, initialize
3552the NAT traversal and then contact a @code{gnunet-nat-server} (running by
3553default on @code{gnunet.org}) and ask for a connection to be established.
3554This way, it is easy to test if the current NAT configuration is valid.
3555
3556@node Distance-Vector plugin
3557@section Distance-Vector plugin
3558@c %**end of header
3559
3560The Distance Vector (DV) transport is a transport mechanism that allows
3561peers to act as relays for each other, thereby connecting peers that would
3562otherwise be unable to connect. This gives a larger connection set to
3563applications that may work better with more peers to choose from (for
3564example, File Sharing and/or DHT).
3565
3566The Distance Vector transport essentially has two functions. The first is
3567"gossiping" connection information about more distant peers to directly
3568connected peers. The second is taking messages intended for non-directly
3569connected peers and encapsulating them in a DV wrapper that contains the
3570required information for routing the message through forwarding peers. Via
3571gossiping, optimal routes through the known DV neighborhood are discovered
3572and utilized and the message encapsulation provides some benefits in
3573addition to simply getting the message from the correct source to the
3574proper destination.
3575
3576The gossiping function of DV provides an up to date routing table of
3577peers that are available up to some number of hops. We call this a
3578fisheye view of the network (like a fish, nearby objects are known while
3579more distant ones unknown). Gossip messages are sent only to directly
3580connected peers, but they are sent about other knowns peers within the
3581"fisheye distance". Whenever two peers connect, they immediately gossip
3582to each other about their appropriate other neighbors. They also gossip
3583about the newly connected peer to previously
3584connected neighbors. In order to keep the routing tables up to date,
3585disconnect notifications are propogated as gossip as well (because
3586disconnects may not be sent/received, timeouts are also used remove
3587stagnant routing table entries).
3588
3589Routing of messages via DV is straightforward. When the DV transport is
3590notified of a message destined for a non-direct neighbor, the appropriate
3591forwarding peer is selected, and the base message is encapsulated in a DV
3592message which contains information about the initial peer and the intended
3593recipient. At each forwarding hop, the initial peer is validated (the
3594forwarding peer ensures that it has the initial peer in its neighborhood,
3595otherwise the message is dropped). Next the base message is
3596re-encapsulated in a new DV message for the next hop in the forwarding
3597chain (or delivered to the current peer, if it has arrived at the
3598destination).
3599
3600Assume a three peer network with peers Alice, Bob and Carol. Assume that
3601Alice <-> Bob and Bob <-> Carol are direct (e.g. over TCP or UDP
3602transports) connections, but that Alice cannot directly connect to Carol.
3603This may be the case due to NAT or firewall restrictions, or perhaps
3604based on one of the peers respective configurations. If the Distance
3605Vector transport is enabled on all three peers, it will automatically
3606discover (from the gossip protocol) that Alice and Carol can connect via
3607Bob and provide a "virtual" Alice <-> Carol connection. Routing between
3608Alice and Carol happens as follows; Alice creates a message destined for
3609Carol and notifies the DV transport about it. The DV transport at Alice
3610looks up Carol in the routing table and finds that the message must be
3611sent through Bob for Carol. The message is encapsulated setting Alice as
3612the initiator and Carol as the destination and sent to Bob. Bob receives
3613the messages, verifies both Alice and Carol are known to Bob, and re-wraps
3614the message in a new DV message for Carol. The DV transport at Carol
3615receives this message, unwraps the original message, and delivers it to
3616Carol as though it came directly from Alice.
3617
3618@cindex SMTP plugin
3619@node SMTP plugin
3620@section SMTP plugin
3621@c %**end of header
3622
3623This section describes the new SMTP transport plugin for GNUnet as it
3624exists in the 0.7.x and 0.8.x branch. SMTP support is currently not
3625available in GNUnet 0.9.x. This page also describes the transport layer
3626abstraction (as it existed in 0.7.x and 0.8.x) in more detail and gives
3627some benchmarking results. The performance results presented are quite
3628old and maybe outdated at this point.
3629
3630@itemize @bullet
3631@item Why use SMTP for a peer-to-peer transport?
3632@item SMTPHow does it work?
3633@item How do I configure my peer?
3634@item How do I test if it works?
3635@item How fast is it?
3636@item Is there any additional documentation?
3637@end itemize
3638
3639
3640@menu
3641* Why use SMTP for a peer-to-peer transport?::
3642* How does it work?::
3643* How do I configure my peer?::
3644* How do I test if it works?::
3645* How fast is it?::
3646@end menu
3647
3648@node Why use SMTP for a peer-to-peer transport?
3649@subsection Why use SMTP for a peer-to-peer transport?
3650@c %**end of header
3651
3652There are many reasons why one would not want to use SMTP:
3653
3654@itemize @bullet
3655@item SMTP is using more bandwidth than TCP, UDP or HTTP
3656@item SMTP has a much higher latency.
3657@item SMTP requires significantly more computation (encoding and decoding
3658time) for the peers.
3659@item SMTP is significantly more complicated to configure.
3660@item SMTP may be abused by tricking GNUnet into sending mail to@
3661non-participating third parties.
3662@end itemize
3663
3664So why would anybody want to use SMTP?
3665@itemize @bullet
3666@item SMTP can be used to contact peers behind NAT boxes (in virtual
3667private networks).
3668@item SMTP can be used to circumvent policies that limit or prohibit
3669peer-to-peer traffic by masking as "legitimate" traffic.
3670@item SMTP uses E-mail addresses which are independent of a specific IP,
3671which can be useful to address peers that use dynamic IP addresses.
3672@item SMTP can be used to initiate a connection (e.g. initial address
3673exchange) and peers can then negotiate the use of a more efficient
3674protocol (e.g. TCP) for the actual communication.
3675@end itemize
3676
3677In summary, SMTP can for example be used to send a message to a peer
3678behind a NAT box that has a dynamic IP to tell the peer to establish a
3679TCP connection to a peer outside of the private network. Even an
3680extraordinary overhead for this first message would be irrelevant in this
3681type of situation.
3682
3683@node How does it work?
3684@subsection How does it work?
3685@c %**end of header
3686
3687When a GNUnet peer needs to send a message to another GNUnet peer that has
3688advertised (only) an SMTP transport address, GNUnet base64-encodes the
3689message and sends it in an E-mail to the advertised address. The
3690advertisement contains a filter which is placed in the E-mail header,
3691such that the receiving host can filter the tagged E-mails and forward it
3692to the GNUnet peer process. The filter can be specified individually by
3693each peer and be changed over time. This makes it impossible to censor
3694GNUnet E-mail messages by searching for a generic filter.
3695
3696@node How do I configure my peer?
3697@subsection How do I configure my peer?
3698@c %**end of header
3699
3700First, you need to configure @code{procmail} to filter your inbound E-mail
3701for GNUnet traffic. The GNUnet messages must be delivered into a pipe, for
3702example @code{/tmp/gnunet.smtp}. You also need to define a filter that is
3703used by @command{procmail} to detect GNUnet messages. You are free to
3704choose whichever filter you like, but you should make sure that it does
3705not occur in your other E-mail. In our example, we will use
3706@code{X-mailer: GNUnet}. The @code{~/.procmailrc} configuration file then
3707looks like this:
3708
3709@example
3710:0:
3711* ^X-mailer: GNUnet
3712/tmp/gnunet.smtp
3713# where do you want your other e-mail delivered to
3714# (default: /var/spool/mail/)
3715:0: /var/spool/mail/
3716@end example
3717
3718After adding this file, first make sure that your regular E-mail still
3719works (e.g. by sending an E-mail to yourself). Then edit the GNUnet
3720configuration. In the section @code{SMTP} you need to specify your E-mail
3721address under @code{EMAIL}, your mail server (for outgoing mail) under
3722@code{SERVER}, the filter (X-mailer: GNUnet in the example) under
3723@code{FILTER} and the name of the pipe under @code{PIPE}.@ The completed
3724section could then look like this:
3725
3726@example
3727EMAIL = me@@mail.gnu.org MTU = 65000 SERVER = mail.gnu.org:25 FILTER =
3728"X-mailer: GNUnet" PIPE = /tmp/gnunet.smtp
3729@end example
3730
3731Finally, you need to add @code{smtp} to the list of @code{TRANSPORTS} in
3732the @code{GNUNETD} section. GNUnet peers will use the E-mail address that
3733you specified to contact your peer until the advertisement times out.
3734Thus, if you are not sure if everything works properly or if you are not
3735planning to be online for a long time, you may want to configure this
3736timeout to be short, e.g. just one hour. For this, set
3737@code{HELLOEXPIRES} to @code{1} in the @code{GNUNETD} section.
3738
3739This should be it, but you may probably want to test it first.
3740
3741@node How do I test if it works?
3742@subsection How do I test if it works?
3743@c %**end of header
3744
3745Any transport can be subjected to some rudimentary tests using the
3746@code{gnunet-transport-check} tool. The tool sends a message to the local
3747node via the transport and checks that a valid message is received. While
3748this test does not involve other peers and can not check if firewalls or
3749other network obstacles prohibit proper operation, this is a great
3750testcase for the SMTP transport since it tests pretty much nearly all of
3751the functionality.
3752
3753@code{gnunet-transport-check} should only be used without running
3754@code{gnunetd} at the same time. By default, @code{gnunet-transport-check}
3755tests all transports that are specified in the configuration file. But
3756you can specifically test SMTP by giving the option
3757@code{--transport=smtp}.
3758
3759Note that this test always checks if a transport can receive and send.
3760While you can configure most transports to only receive or only send
3761messages, this test will only work if you have configured the transport
3762to send and receive messages.
3763
3764@node How fast is it?
3765@subsection How fast is it?
3766@c %**end of header
3767
3768We have measured the performance of the UDP, TCP and SMTP transport layer
3769directly and when used from an application using the GNUnet core.
3770Measureing just the transport layer gives the better view of the actual
3771overhead of the protocol, whereas evaluating the transport from the
3772application puts the overhead into perspective from a practical point of
3773view.
3774
3775The loopback measurements of the SMTP transport were performed on three
3776different machines spanning a range of modern SMTP configurations. We
3777used a PIII-800 running RedHat 7.3 with the Purdue Computer Science
3778configuration which includes filters for spam. We also used a Xenon 2 GHZ
3779with a vanilla RedHat 8.0 sendmail configuration. Furthermore, we used
3780qmail on a PIII-1000 running Sorcerer GNU Linux (SGL). The numbers for
3781UDP and TCP are provided using the SGL configuration. The qmail benchmark
3782uses qmail's internal filtering whereas the sendmail benchmarks relies on
3783procmail to filter and deliver the mail. We used the transport layer to
3784send a message of b bytes (excluding transport protocol headers) directly
3785to the local machine. This way, network latency and packet loss on the
3786wire have no impact on the timings. n messages were sent sequentially over
3787the transport layer, sending message i+1 after the i-th message was
3788received. All messages were sent over the same connection and the time to
3789establish the connection was not taken into account since this overhead is
3790miniscule in practice --- as long as a connection is used for a
3791significant number of messages.
3792
3793@multitable @columnfractions .20 .15 .15 .15 .15 .15
3794@headitem Transport @tab UDP @tab TCP @tab SMTP (Purdue sendmail)
3795@tab SMTP (RH 8.0) @tab SMTP (SGL qmail)
3796@item 11 bytes @tab 31 ms @tab 55 ms @tab 781 s @tab 77 s @tab 24 s
3797@item 407 bytes @tab 37 ms @tab 62 ms @tab 789 s @tab 78 s @tab 25 s
3798@item 1,221 bytes @tab 46 ms @tab 73 ms @tab 804 s @tab 78 s @tab 25 s
3799@end multitable
3800
3801The benchmarks show that UDP and TCP are, as expected, both significantly
3802faster compared with any of the SMTP services. Among the SMTP
3803implementations, there can be significant differences depending on the
3804SMTP configuration. Filtering with an external tool like procmail that
3805needs to re-parse its configuration for each mail can be very expensive.
3806Applying spam filters can also significantly impact the performance of
3807the underlying SMTP implementation. The microbenchmark shows that SMTP
3808can be a viable solution for initiating peer-to-peer sessions: a couple of
3809seconds to connect to a peer are probably not even going to be noticed by
3810users. The next benchmark measures the possible throughput for a
3811transport. Throughput can be measured by sending multiple messages in
3812parallel and measuring packet loss. Note that not only UDP but also the
3813TCP transport can actually loose messages since the TCP implementation
3814drops messages if the @code{write} to the socket would block. While the
3815SMTP protocol never drops messages itself, it is often so
3816slow that only a fraction of the messages can be sent and received in the
3817given time-bounds. For this benchmark we report the message loss after
3818allowing t time for sending m messages. If messages were not sent (or
3819received) after an overall timeout of t, they were considered lost. The
3820benchmark was performed using two Xeon 2 GHZ machines running RedHat 8.0
3821with sendmail. The machines were connected with a direct 100 MBit ethernet
3822connection.@ Figures udp1200, tcp1200 and smtp-MTUs show that the
3823throughput for messages of size 1,200 octects is 2,343 kbps, 3,310 kbps
3824and 6 kbps for UDP, TCP and SMTP respectively. The high per-message
3825overhead of SMTP can be improved by increasing the MTU, for example, an
3826MTU of 12,000 octets improves the throughput to 13 kbps as figure
3827smtp-MTUs shows. Our research paper) has some more details on the
3828benchmarking results.
3829
3830@cindex Bluetooth plugin
3831@node Bluetooth plugin
3832@section Bluetooth plugin
3833@c %**end of header
3834
3835This page describes the new Bluetooth transport plugin for GNUnet. The
3836plugin is still in the testing stage so don't expect it to work
3837perfectly. If you have any questions or problems just post them here or
3838ask on the IRC channel.
3839
3840@itemize @bullet
3841@item What do I need to use the Bluetooth plugin transport?
3842@item BluetoothHow does it work?
3843@item What possible errors should I be aware of?
3844@item How do I configure my peer?
3845@item How can I test it?
3846@end itemize
3847
3848@menu
3849* What do I need to use the Bluetooth plugin transport?::
3850* How does it work2?::
3851* What possible errors should I be aware of?::
3852* How do I configure my peer2?::
3853* How can I test it?::
3854* The implementation of the Bluetooth transport plugin::
3855@end menu
3856
3857@node What do I need to use the Bluetooth plugin transport?
3858@subsection What do I need to use the Bluetooth plugin transport?
3859@c %**end of header
3860
3861If you are a Linux user and you want to use the Bluetooth transport plugin
3862you should install the BlueZ development libraries (if they aren't already
3863installed). For instructions about how to install the libraries you should
3864check out the BlueZ site
3865(@uref{http://www.bluez.org/, http://www.bluez.org}). If you don't know if
3866you have the necesarry libraries, don't worry, just run the GNUnet
3867configure script and you will be able to see a notification at the end
3868which will warn you if you don't have the necessary libraries.
3869
3870If you are a Windows user you should have installed the
3871@emph{MinGW}/@emph{MSys2} with the latest updates (especially the
3872@emph{ws2bth} header). If this is your first build of GNUnet on Windows
3873you should check out the SBuild repository. It will semi-automatically
3874assembles a @emph{MinGW}/@emph{MSys2} installation with a lot of extra
3875packages which are needed for the GNUnet build. So this will ease your
3876work!@ Finally you just have to be sure that you have the correct drivers
3877for your Bluetooth device installed and that your device is on and in a
3878discoverable mode. The Windows Bluetooth Stack supports only the RFCOMM
3879protocol so we cannot turn on your device programatically!
3880
3881@c FIXME: Change to unique title
3882@node How does it work2?
3883@subsection How does it work2?
3884@c %**end of header
3885
3886The Bluetooth transport plugin uses virtually the same code as the WLAN
3887plugin and only the helper binary is different. The helper takes a single
3888argument, which represents the interface name and is specified in the
3889configuration file. Here are the basic steps that are followed by the
3890helper binary used on Linux:
3891
3892@itemize @bullet
3893@item it verifies if the name corresponds to a Bluetooth interface name
3894@item it verifies if the iterface is up (if it is not, it tries to bring
3895it up)
3896@item it tries to enable the page and inquiry scan in order to make the
3897device discoverable and to accept incoming connection requests
3898@emph{The above operations require root access so you should start the
3899transport plugin with root privileges.}
3900@item it finds an available port number and registers a SDP service which
3901will be used to find out on which port number is the server listening on
3902and switch the socket in listening mode
3903@item it sends a HELLO message with its address
3904@item finally it forwards traffic from the reading sockets to the STDOUT
3905and from the STDIN to the writing socket
3906@end itemize
3907
3908Once in a while the device will make an inquiry scan to discover the
3909nearby devices and it will send them randomly HELLO messages for peer
3910discovery.
3911
3912@node What possible errors should I be aware of?
3913@subsection What possible errors should I be aware of?
3914@c %**end of header
3915
3916@emph{This section is dedicated for Linux users}
3917
3918Well there are many ways in which things could go wrong but I will try to
3919present some tools that you could use to debug and some scenarios.
3920
3921@itemize @bullet
3922
3923@item @code{bluetoothd -n -d} : use this command to enable logging in the
3924foreground and to print the logging messages
3925
3926@item @code{hciconfig}: can be used to configure the Bluetooth devices.
3927If you run it without any arguments it will print information about the
3928state of the interfaces. So if you receive an error that the device
3929couldn't be brought up you should try to bring it manually and to see if
3930it works (use @code{hciconfig -a hciX up}). If you can't and the
3931Bluetooth address has the form 00:00:00:00:00:00 it means that there is
3932something wrong with the D-Bus daemon or with the Bluetooth daemon. Use
3933@code{bluetoothd} tool to see the logs
3934
3935@item @code{sdptool} can be used to control and interogate SDP servers.
3936If you encounter problems regarding the SDP server (like the SDP server is
3937down) you should check out if the D-Bus daemon is running correctly and to
3938see if the Bluetooth daemon started correctly(use @code{bluetoothd} tool).
3939Also, sometimes the SDP service could work but somehow the device couldn't
3940register his service. Use @code{sdptool browse [dev-address]} to see if
3941the service is registered. There should be a service with the name of the
3942interface and GNUnet as provider.
3943
3944@item @code{hcitool} : another useful tool which can be used to configure
3945the device and to send some particular commands to it.
3946
3947@item @code{hcidump} : could be used for low level debugging
3948@end itemize
3949
3950@c FIXME: A more unique name
3951@node How do I configure my peer2?
3952@subsection How do I configure my peer2?
3953@c %**end of header
3954
3955On Linux, you just have to be sure that the interface name corresponds to
3956the one that you want to use. Use the @code{hciconfig} tool to check that.
3957By default it is set to hci0 but you can change it.
3958
3959A basic configuration looks like this:
3960
3961@example
3962[transport-bluetooth]
3963# Name of the interface (typically hciX)
3964INTERFACE = hci0
3965# Real hardware, no testing
3966TESTMODE = 0 TESTING_IGNORE_KEYS = ACCEPT_FROM;
3967@end example
3968
3969In order to use the Bluetooth transport plugin when the transport service
3970is started, you must add the plugin name to the default transport service
3971plugins list. For example:
3972
3973@example
3974[transport] ... PLUGINS = dns bluetooth ...
3975@end example
3976
3977If you want to use only the Bluetooth plugin set
3978@emph{PLUGINS = bluetooth}
3979
3980On Windows, you cannot specify which device to use. The only thing that
3981you should do is to add @emph{bluetooth} on the plugins list of the
3982transport service.
3983
3984@node How can I test it?
3985@subsection How can I test it?
3986@c %**end of header
3987
3988If you have two Bluetooth devices on the same machine which use Linux you
3989must:
3990
3991@itemize @bullet
3992
3993@item create two different file configuration (one which will use the
3994first interface (@emph{hci0}) and the other which will use the second
3995interface (@emph{hci1})). Let's name them @emph{peer1.conf} and
3996@emph{peer2.conf}.
3997
3998@item run @emph{gnunet-peerinfo -c peerX.conf -s} in order to generate the
3999peers private keys. The @strong{X} must be replace with 1 or 2.
4000
4001@item run @emph{gnunet-arm -c peerX.conf -s -i=transport} in order to
4002start the transport service. (Make sure that you have "bluetooth" on the
4003transport plugins list if the Bluetooth transport service doesn't start.)
4004
4005@item run @emph{gnunet-peerinfo -c peer1.conf -s} to get the first peer's
4006ID. If you already know your peer ID (you saved it from the first
4007command), this can be skipped.
4008
4009@item run @emph{gnunet-transport -c peer2.conf -p=PEER1_ID -s} to start
4010sending data for benchmarking to the other peer.
4011
4012@end itemize
4013
4014
4015This scenario will try to connect the second peer to the first one and
4016then start sending data for benchmarking.
4017
4018On Windows you cannot test the plugin functionality using two Bluetooth
4019devices from the same machine because after you install the drivers there
4020will occur some conflicts between the Bluetooth stacks. (At least that is
4021what happend on my machine : I wasn't able to use the Bluesoleil stack and
4022the WINDCOMM one in the same time).
4023
4024If you have two different machines and your configuration files are good
4025you can use the same scenario presented on the begining of this section.
4026
4027Another way to test the plugin functionality is to create your own
4028application which will use the GNUnet framework with the Bluetooth
4029transport service.
4030
4031@node The implementation of the Bluetooth transport plugin
4032@subsection The implementation of the Bluetooth transport plugin
4033@c %**end of header
4034
4035This page describes the implementation of the Bluetooth transport plugin.
4036
4037First I want to remind you that the Bluetooth transport plugin uses
4038virtually the same code as the WLAN plugin and only the helper binary is
4039different. Also the scope of the helper binary from the Bluetooth
4040transport plugin is the same as the one used for the wlan transport
4041plugin: it acceses the interface and then it forwards traffic in both
4042directions between the Bluetooth interface and stdin/stdout of the
4043process involved.
4044
4045The Bluetooth plugin transport could be used both on Linux and Windows
4046platforms.
4047
4048@itemize @bullet
4049@item Linux functionality
4050@item Windows functionality
4051@item Pending Features
4052@end itemize
4053
4054
4055
4056@menu
4057* Linux functionality::
4058* THE INITIALIZATION::
4059* THE LOOP::
4060* Details about the broadcast implementation::
4061* Windows functionality::
4062* Pending features::
4063@end menu
4064
4065@node Linux functionality
4066@subsubsection Linux functionality
4067@c %**end of header
4068
4069In order to implement the plugin functionality on Linux I used the BlueZ
4070stack. For the communication with the other devices I used the RFCOMM
4071protocol. Also I used the HCI protocol to gain some control over the
4072device. The helper binary takes a single argument (the name of the
4073Bluetooth interface) and is separated in two stages:
4074
4075@c %** 'THE INITIALIZATION' should be in bigger letters or stand out, not
4076@c %** starting a new section?
4077@node THE INITIALIZATION
4078@subsubsection THE INITIALIZATION
4079
4080@itemize @bullet
4081@item first, it checks if we have root privilegies
4082(@emph{Remember that we need to have root privilegies in order to be able
4083to bring the interface up if it is down or to change its state.}).
4084
4085@item second, it verifies if the interface with the given name exists.
4086
4087@strong{If the interface with that name exists and it is a Bluetooth
4088interface:}
4089
4090@item it creates a RFCOMM socket which will be used for listening and call
4091the @emph{open_device} method
4092
4093On the @emph{open_device} method:
4094@itemize @bullet
4095@item creates a HCI socket used to send control events to the the device
4096@item searches for the device ID using the interface name
4097@item saves the device MAC address
4098@item checks if the interface is down and tries to bring it UP
4099@item checks if the interface is in discoverable mode and tries to make it
4100discoverable
4101@item closes the HCI socket and binds the RFCOMM one
4102@item switches the RFCOMM socket in listening mode
4103@item registers the SDP service (the service will be used by the other
4104devices to get the port on which this device is listening on)
4105@end itemize
4106
4107@item drops the root privilegies
4108
4109@strong{If the interface is not a Bluetooth interface the helper exits
4110with a suitable error}
4111@end itemize
4112
4113@c %** Same as for @node entry above
4114@node THE LOOP
4115@subsubsection THE LOOP
4116
4117The helper binary uses a list where it saves all the connected neighbour
4118devices (@emph{neighbours.devices}) and two buffers (@emph{write_pout} and
4119@emph{write_std}). The first message which is send is a control message
4120with the device's MAC address in order to announce the peer presence to
4121the neighbours. Here are a short description of what happens in the main
4122loop:
4123
4124@itemize @bullet
4125@item Every time when it receives something from the STDIN it processes
4126the data and saves the message in the first buffer (@emph{write_pout}).
4127When it has something in the buffer, it gets the destination address from
4128the buffer, searches the destination address in the list (if there is no
4129connection with that device, it creates a new one and saves it to the
4130list) and sends the message.
4131@item Every time when it receives something on the listening socket it
4132accepts the connection and saves the socket on a list with the reading
4133sockets. @item Every time when it receives something from a reading
4134socket it parses the message, verifies the CRC and saves it in the
4135@emph{write_std} buffer in order to be sent later to the STDOUT.
4136@end itemize
4137
4138So in the main loop we use the select function to wait until one of the
4139file descriptor saved in one of the two file descriptors sets used is
4140ready to use. The first set (@emph{rfds}) represents the reading set and
4141it could contain the list with the reading sockets, the STDIN file
4142descriptor or the listening socket. The second set (@emph{wfds}) is the
4143writing set and it could contain the sending socket or the STDOUT file
4144descriptor. After the select function returns, we check which file
4145descriptor is ready to use and we do what is supposed to do on that kind
4146of event. @emph{For example:} if it is the listening socket then we
4147accept a new connection and save the socket in the reading list; if it is
4148the STDOUT file descriptor, then we write to STDOUT the message from the
4149@emph{write_std} buffer.
4150
4151To find out on which port a device is listening on we connect to the local
4152SDP server and searche the registered service for that device.
4153
4154@emph{You should be aware of the fact that if the device fails to connect
4155to another one when trying to send a message it will attempt one more
4156time. If it fails again, then it skips the message.}
4157@emph{Also you should know that the transport Bluetooth plugin has
4158support for @strong{broadcast messages}.}
4159
4160@node Details about the broadcast implementation
4161@subsubsection Details about the broadcast implementation
4162@c %**end of header
4163
4164First I want to point out that the broadcast functionality for the CONTROL
4165messages is not implemented in a conventional way. Since the inquiry scan
4166time is too big and it will take some time to send a message to all the
4167discoverable devices I decided to tackle the problem in a different way.
4168Here is how I did it:
4169
4170@itemize @bullet
4171@item If it is the first time when I have to broadcast a message I make an
4172inquiry scan and save all the devices' addresses to a vector.
4173@item After the inquiry scan ends I take the first address from the list
4174and I try to connect to it. If it fails, I try to connect to the next one.
4175If it succeeds, I save the socket to a list and send the message to the
4176device.
4177@item When I have to broadcast another message, first I search on the list
4178for a new device which I'm not connected to. If there is no new device on
4179the list I go to the beginning of the list and send the message to the
4180old devices. After 5 cycles I make a new inquiry scan to check out if
4181there are new discoverable devices and save them to the list. If there
4182are no new discoverable devices I reset the cycling counter and go again
4183through the old list and send messages to the devices saved in it.
4184@end itemize
4185
4186@strong{Therefore}:
4187
4188@itemize @bullet
4189@item every time when I have a broadcast message I look up on the list
4190for a new device and send the message to it
4191@item if I reached the end of the list for 5 times and I'm connected to
4192all the devices from the list I make a new inquiry scan.
4193@emph{The number of the list's cycles after an inquiry scan could be
4194increased by redefining the MAX_LOOPS variable}
4195@item when there are no new devices I send messages to the old ones.
4196@end itemize
4197
4198Doing so, the broadcast control messages will reach the devices but with
4199delay.
4200
4201@emph{NOTICE:} When I have to send a message to a certain device first I
4202check on the broadcast list to see if we are connected to that device. If
4203not we try to connect to it and in case of success we save the address and
4204the socket on the list. If we are already connected to that device we
4205simply use the socket.
4206
4207@node Windows functionality
4208@subsubsection Windows functionality
4209@c %**end of header
4210
4211For Windows I decided to use the Microsoft Bluetooth stack which has the
4212advantage of coming standard from Windows XP SP2. The main disadvantage is
4213that it only supports the RFCOMM protocol so we will not be able to have
4214a low level control over the Bluetooth device. Therefore it is the user
4215responsability to check if the device is up and in the discoverable mode.
4216Also there are no tools which could be used for debugging in order to read
4217the data coming from and going to a Bluetooth device, which obviously
4218hindered my work. Another thing that slowed down the implementation of the
4219plugin (besides that I wasn't too accomodated with the win32 API) was that
4220there were some bugs on MinGW regarding the Bluetooth. Now they are solved
4221but you should keep in mind that you should have the latest updates
4222(especially the @emph{ws2bth} header).
4223
4224Besides the fact that it uses the Windows Sockets, the Windows
4225implemenation follows the same principles as the Linux one:
4226
4227@itemize @bullet
4228@item It has a initalization part where it initializes the
4229Windows Sockets, creates a RFCOMM socket which will be binded and switched
4230to the listening mode and registers a SDP service. In the Microsoft
4231Bluetooth API there are two ways to work with the SDP:
4232@itemize @bullet
4233@item an easy way which works with very simple service records
4234@item a hard way which is useful when you need to update or to delete the
4235record
4236@end itemize
4237@end itemize
4238
4239Since I only needed the SDP service to find out on which port the device
4240is listening on and that did not change, I decided to use the easy way.
4241In order to register the service I used the @emph{WSASetService} function
4242and I generated the @emph{Universally Unique Identifier} with the
4243@emph{guidgen.exe} Windows's tool.
4244
4245In the loop section the only difference from the Linux implementation is
4246that I used the GNUNET_NETWORK library for functions like @emph{accept},
4247@emph{bind}, @emph{connect} or @emph{select}. I decided to use the
4248GNUNET_NETWORK library because I also needed to interact with the STDIN
4249and STDOUT handles and on Windows the select function is only defined for
4250sockets, and it will not work for arbitrary file handles.
4251
4252Another difference between Linux and Windows implementation is that in
4253Linux, the Bluetooth address is represented in 48 bits while in Windows is
4254represented in 64 bits. Therefore I had to do some changes on
4255@emph{plugin_transport_wlan} header.
4256
4257Also, currently on Windows the Bluetooth plugin doesn't have support for
4258broadcast messages. When it receives a broadcast message it will skip it.
4259
4260@node Pending features
4261@subsubsection Pending features
4262@c %**end of header
4263
4264@itemize @bullet
4265@item Implement the broadcast functionality on Windows @emph{(currently
4266working on)}
4267@item Implement a testcase for the helper :@ @emph{The testcase
4268consists of a program which emaluates the plugin and uses the helper. It
4269will simulate connections, disconnections and data transfers.}
4270@end itemize
4271
4272If you have a new idea about a feature of the plugin or suggestions about
4273how I could improve the implementation you are welcome to comment or to
4274contact me.
4275
4276@node WLAN plugin
4277@section WLAN plugin
4278@c %**end of header
4279
4280This section documents how the wlan transport plugin works. Parts which
4281are not implemented yet or could be better implemented are described at
4282the end.
4283
4284@cindex ats subsystem
4285@node The ATS Subsystem
4286@section The ATS Subsystem
4287@c %**end of header
4288
4289ATS stands for "automatic transport selection", and the function of ATS in
4290GNUnet is to decide on which address (and thus transport plugin) should
4291be used for two peers to communicate, and what bandwidth limits should be
4292imposed on such an individual connection. To help ATS make an informed
4293decision, higher-level services inform the ATS service about their
4294requirements and the quality of the service rendered. The ATS service
4295also interacts with the transport service to be appraised of working
4296addresses and to communicate its resource allocation decisions. Finally,
4297the ATS service's operation can be observed using a monitoring API.
4298
4299The main logic of the ATS service only collects the available addresses,
4300their performance characteristics and the applications requirements, but
4301does not make the actual allocation decision. This last critical step is
4302left to an ATS plugin, as we have implemented (currently three) different
4303allocation strategies which differ significantly in their performance and
4304maturity, and it is still unclear if any particular plugin is generally
4305superior.
4306
4307@cindex core subsystem
4308@cindex CORE subsystem
4309@node GNUnet's CORE Subsystem
4310@section GNUnet's CORE Subsystem
4311@c %**end of header
4312
4313The CORE subsystem in GNUnet is responsible for securing link-layer
4314communications between nodes in the GNUnet overlay network. CORE builds
4315on the TRANSPORT subsystem which provides for the actual, insecure,
4316unreliable link-layer communication (for example, via UDP or WLAN), and
4317then adds fundamental security to the connections:
4318
4319@itemize @bullet
4320@item confidentiality with so-called perfect forward secrecy; we use
4321ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
4322powered by Curve25519
4323@footnote{@uref{http://cr.yp.to/ecdh.html, Curve25519}} for the key
4324exchange and then use symmetric encryption, encrypting with both AES-256
4325@footnote{@uref{http://en.wikipedia.org/wiki/Rijndael, AES-256}} and
4326Twofish @footnote{@uref{http://en.wikipedia.org/wiki/Twofish, Twofish}}
4327@item @uref{http://en.wikipedia.org/wiki/Authentication, authentication}
4328is achieved by signing the ephemeral keys using Ed25519
4329@footnote{@uref{http://ed25519.cr.yp.to/, Ed25519}}, a deterministic
4330variant of ECDSA
4331@footnote{@uref{http://en.wikipedia.org/wiki/ECDSA, ECDSA}}
4332@item integrity protection (using SHA-512
4333@footnote{@uref{http://en.wikipedia.org/wiki/SHA-2, SHA-512}} to do
4334encrypt-then-MAC
4335@footnote{@uref{http://en.wikipedia.org/wiki/Authenticated_encryption, encrypt-then-MAC}})
4336@item Replay
4337@footnote{@uref{http://en.wikipedia.org/wiki/Replay_attack, replay}}
4338protection (using nonces, timestamps, challenge-response,
4339message counters and ephemeral keys)
4340@item liveness (keep-alive messages, timeout)
4341@end itemize
4342
4343@menu
4344* Limitations::
4345* When is a peer "connected"?::
4346* libgnunetcore::
4347* The CORE Client-Service Protocol::
4348* The CORE Peer-to-Peer Protocol::
4349@end menu
4350
4351@cindex core subsystem limitations
4352@node Limitations
4353@subsection Limitations
4354@c %**end of header
4355
4356CORE does not perform
4357@uref{http://en.wikipedia.org/wiki/Routing, routing}; using CORE it is
4358only possible to communicate with peers that happen to already be
4359"directly" connected with each other. CORE also does not have an
4360API to allow applications to establish such "direct" connections --- for
4361this, applications can ask TRANSPORT, but TRANSPORT might not be able to
4362establish a "direct" connection. The TOPOLOGY subsystem is responsible for
4363trying to keep a few "direct" connections open at all times. Applications
4364that need to talk to particular peers should use the CADET subsystem, as
4365it can establish arbitrary "indirect" connections.
4366
4367Because CORE does not perform routing, CORE must only be used directly by
4368applications that either perform their own routing logic (such as
4369anonymous file-sharing) or that do not require routing, for example
4370because they are based on flooding the network. CORE communication is
4371unreliable and delivery is possibly out-of-order. Applications that
4372require reliable communication should use the CADET service. Each
4373application can only queue one message per target peer with the CORE
4374service at any time; messages cannot be larger than approximately
437563 kilobytes. If messages are small, CORE may group multiple messages
4376(possibly from different applications) prior to encryption. If permitted
4377by the application (using the @uref{http://baus.net/on-tcp_cork/, cork}
4378option), CORE may delay transmissions to facilitate grouping of multiple
4379small messages. If cork is not enabled, CORE will transmit the message as
4380soon as TRANSPORT allows it (TRANSPORT is responsible for limiting
4381bandwidth and congestion control). CORE does not allow flow control;
4382applications are expected to process messages at line-speed. If flow
4383control is needed, applications should use the CADET service.
4384
4385@cindex when is a peer connected
4386@node When is a peer "connected"?
4387@subsection When is a peer "connected"?
4388@c %**end of header
4389
4390In addition to the security features mentioned above, CORE also provides
4391one additional key feature to applications using it, and that is a
4392limited form of protocol-compatibility checking. CORE distinguishes
4393between TRANSPORT-level connections (which enable communication with other
4394peers) and application-level connections. Applications using the CORE API
4395will (typically) learn about application-level connections from CORE, and
4396not about TRANSPORT-level connections. When a typical application uses
4397CORE, it will specify a set of message types
4398(from @code{gnunet_protocols.h}) that it understands. CORE will then
4399notify the application about connections it has with other peers if and
4400only if those applications registered an intersecting set of message
4401types with their CORE service. Thus, it is quite possible that CORE only
4402exposes a subset of the established direct connections to a particular
4403application --- and different applications running above CORE might see
4404different sets of connections at the same time.
4405
4406A special case are applications that do not register a handler for any
4407message type.
4408CORE assumes that these applications merely want to monitor connections
4409(or "all" messages via other callbacks) and will notify those applications
4410about all connections. This is used, for example, by the
4411@code{gnunet-core} command-line tool to display the active connections.
4412Note that it is also possible that the TRANSPORT service has more active
4413connections than the CORE service, as the CORE service first has to
4414perform a key exchange with connecting peers before exchanging information
4415about supported message types and notifying applications about the new
4416connection.
4417
4418@cindex libgnunetcore
4419@node libgnunetcore
4420@subsection libgnunetcore
4421@c %**end of header
4422
4423The CORE API (defined in @file{gnunet_core_service.h}) is the basic
4424messaging API used by P2P applications built using GNUnet. It provides
4425applications the ability to send and receive encrypted messages to the
4426peer's "directly" connected neighbours.
4427
4428As CORE connections are generally "direct" connections,@ applications must
4429not assume that they can connect to arbitrary peers this way, as "direct"
4430connections may not always be possible. Applications using CORE are
4431notified about which peers are connected. Creating new "direct"
4432connections must be done using the TRANSPORT API.
4433
4434The CORE API provides unreliable, out-of-order delivery. While the
4435implementation tries to ensure timely, in-order delivery, both message
4436losses and reordering are not detected and must be tolerated by the
4437application. Most important, the core will NOT perform retransmission if
4438messages could not be delivered.
4439
4440Note that CORE allows applications to queue one message per connected
4441peer. The rate at which each connection operates is influenced by the
4442preferences expressed by local application as well as restrictions
4443imposed by the other peer. Local applications can express their
4444preferences for particular connections using the "performance" API of the
4445ATS service.
4446
4447Applications that require more sophisticated transmission capabilities
4448such as TCP-like behavior, or if you intend to send messages to arbitrary
4449remote peers, should use the CADET API.
4450
4451The typical use of the CORE API is to connect to the CORE service using
4452@code{GNUNET_CORE_connect}, process events from the CORE service (such as
4453peers connecting, peers disconnecting and incoming messages) and send
4454messages to connected peers using
4455@code{GNUNET_CORE_notify_transmit_ready}. Note that applications must
4456cancel pending transmission requests if they receive a disconnect event
4457for a peer that had a transmission pending; furthermore, queueing more
4458than one transmission request per peer per application using the
4459service is not permitted.
4460
4461The CORE API also allows applications to monitor all communications of the
4462peer prior to encryption (for outgoing messages) or after decryption (for
4463incoming messages). This can be useful for debugging, diagnostics or to
4464establish the presence of cover traffic (for anonymity). As monitoring
4465applications are often not interested in the payload, the monitoring
4466callbacks can be configured to only provide the message headers (including
4467the message type and size) instead of copying the full data stream to the
4468monitoring client.
4469
4470The init callback of the @code{GNUNET_CORE_connect} function is called
4471with the hash of the public key of the peer. This public key is used to
4472identify the peer globally in the GNUnet network. Applications are
4473encouraged to check that the provided hash matches the hash that they are
4474using (as theoretically the application may be using a different
4475configuration file with a different private key, which would result in
4476hard to find bugs).
4477
4478As with most service APIs, the CORE API isolates applications from crashes
4479of the CORE service. If the CORE service crashes, the application will see
4480disconnect events for all existing connections. Once the connections are
4481re-established, the applications will be receive matching connect events.
4482
4483@cindex core clinet-service protocol
4484@node The CORE Client-Service Protocol
4485@subsection The CORE Client-Service Protocol
4486@c %**end of header
4487
4488This section describes the protocol between an application using the CORE
4489service (the client) and the CORE service process itself.
4490
4491
4492@menu
4493* Setup2::
4494* Notifications::
4495* Sending::
4496@end menu
4497
4498@node Setup2
4499@subsubsection Setup2
4500@c %**end of header
4501
4502When a client connects to the CORE service, it first sends a
4503@code{InitMessage} which specifies options for the connection and a set of
4504message type values which are supported by the application. The options
4505bitmask specifies which events the client would like to be notified about.
4506The options include:
4507
4508@table @asis
4509@item GNUNET_CORE_OPTION_NOTHING No notifications
4510@item GNUNET_CORE_OPTION_STATUS_CHANGE Peers connecting and disconnecting
4511@item GNUNET_CORE_OPTION_FULL_INBOUND All inbound messages (after
4512decryption) with full payload
4513@item GNUNET_CORE_OPTION_HDR_INBOUND Just the @code{MessageHeader}
4514of all inbound messages
4515@item GNUNET_CORE_OPTION_FULL_OUTBOUND All outbound
4516messages (prior to encryption) with full payload
4517@item GNUNET_CORE_OPTION_HDR_OUTBOUND Just the @code{MessageHeader} of all
4518outbound messages
4519@end table
4520
4521Typical applications will only monitor for connection status changes.
4522
4523The CORE service responds to the @code{InitMessage} with an
4524@code{InitReplyMessage} which contains the peer's identity. Afterwards,
4525both CORE and the client can send messages.
4526
4527@node Notifications
4528@subsubsection Notifications
4529@c %**end of header
4530
4531The CORE will send @code{ConnectNotifyMessage}s and
4532@code{DisconnectNotifyMessage}s whenever peers connect or disconnect from
4533the CORE (assuming their type maps overlap with the message types
4534registered by the client). When the CORE receives a message that matches
4535the set of message types specified during the @code{InitMessage} (or if
4536monitoring is enabled in for inbound messages in the options), it sends a
4537@code{NotifyTrafficMessage} with the peer identity of the sender and the
4538decrypted payload. The same message format (except with
4539@code{GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND} for the message type) is
4540used to notify clients monitoring outbound messages; here, the peer
4541identity given is that of the receiver.
4542
4543@node Sending
4544@subsubsection Sending
4545@c %**end of header
4546
4547When a client wants to transmit a message, it first requests a
4548transmission slot by sending a @code{SendMessageRequest} which specifies
4549the priority, deadline and size of the message. Note that these values
4550may be ignored by CORE. When CORE is ready for the message, it answers
4551with a @code{SendMessageReady} response. The client can then transmit the
4552payload with a @code{SendMessage} message. Note that the actual message
4553size in the @code{SendMessage} is allowed to be smaller than the size in
4554the original request. A client may at any time send a fresh
4555@code{SendMessageRequest}, which then superceeds the previous
4556@code{SendMessageRequest}, which is then no longer valid. The client can
4557tell which @code{SendMessageRequest} the CORE service's
4558@code{SendMessageReady} message is for as all of these messages contain a
4559"unique" request ID (based on a counter incremented by the client
4560for each request).
4561
4562@cindex CORE Peer-to-Peer Protocol
4563@node The CORE Peer-to-Peer Protocol
4564@subsection The CORE Peer-to-Peer Protocol
4565@c %**end of header
4566
4567
4568@menu
4569* Creating the EphemeralKeyMessage::
4570* Establishing a connection::
4571* Encryption and Decryption::
4572* Type maps::
4573@end menu
4574
4575@cindex EphemeralKeyMessage creation
4576@node Creating the EphemeralKeyMessage
4577@subsubsection Creating the EphemeralKeyMessage
4578@c %**end of header
4579
4580When the CORE service starts, each peer creates a fresh ephemeral (ECC)
4581public-private key pair and signs the corresponding
4582@code{EphemeralKeyMessage} with its long-term key (which we usually call
4583the peer's identity; the hash of the public long term key is what results
4584in a @code{struct GNUNET_PeerIdentity} in all GNUnet APIs. The ephemeral
4585key is ONLY used for an ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
4586exchange by the CORE service to establish symmetric session keys. A peer
4587will use the same @code{EphemeralKeyMessage} for all peers for
4588@code{REKEY_FREQUENCY}, which is usually 12 hours. After that time, it
4589will create a fresh ephemeral key (forgetting the old one) and broadcast
4590the new @code{EphemeralKeyMessage} to all connected peers, resulting in
4591fresh symmetric session keys. Note that peers independently decide on
4592when to discard ephemeral keys; it is not a protocol violation to discard
4593keys more often. Ephemeral keys are also never stored to disk; restarting
4594a peer will thus always create a fresh ephemeral key. The use of ephemeral
4595keys is what provides @uref{http://en.wikipedia.org/wiki/Forward_secrecy, forward secrecy}.
4596
4597Just before transmission, the @code{EphemeralKeyMessage} is patched to
4598reflect the current sender_status, which specifies the current state of
4599the connection from the point of view of the sender. The possible values
4600are:
4601
4602@itemize @bullet
4603@item @code{KX_STATE_DOWN} Initial value, never used on the network
4604@item @code{KX_STATE_KEY_SENT} We sent our ephemeral key, do not know the
4605key of the other peer
4606@item @code{KX_STATE_KEY_RECEIVED} This peer has received a valid
4607ephemeral key of the other peer, but we are waiting for the other peer to
4608confirm it's authenticity (ability to decode) via challenge-response.
4609@item @code{KX_STATE_UP} The connection is fully up from the point of
4610view of the sender (now performing keep-alives)
4611@item @code{KX_STATE_REKEY_SENT} The sender has initiated a rekeying
4612operation; the other peer has so far failed to confirm a working
4613connection using the new ephemeral key
4614@end itemize
4615
4616@node Establishing a connection
4617@subsubsection Establishing a connection
4618@c %**end of header
4619
4620Peers begin their interaction by sending a @code{EphemeralKeyMessage} to
4621the other peer once the TRANSPORT service notifies the CORE service about
4622the connection.
4623A peer receiving an @code{EphemeralKeyMessage} with a status
4624indicating that the sender does not have the receiver's ephemeral key, the
4625receiver's @code{EphemeralKeyMessage} is sent in response.
4626Additionally, if the receiver has not yet confirmed the authenticity of
4627the sender, it also sends an (encrypted)@code{PingMessage} with a
4628challenge (and the identity of the target) to the other peer. Peers
4629receiving a @code{PingMessage} respond with an (encrypted)
4630@code{PongMessage} which includes the challenge. Peers receiving a
4631@code{PongMessage} check the challenge, and if it matches set the
4632connection to @code{KX_STATE_UP}.
4633
4634@node Encryption and Decryption
4635@subsubsection Encryption and Decryption
4636@c %**end of header
4637
4638All functions related to the key exchange and encryption/decryption of
4639messages can be found in @file{gnunet-service-core_kx.c} (except for the
4640cryptographic primitives, which are in @file{util/crypto*.c}).
4641Given the key material from ECDHE, a Key derivation function
4642@footnote{@uref{https://en.wikipedia.org/wiki/Key_derivation_function, Key derivation function}}
4643is used to derive two pairs of encryption and decryption keys for AES-256
4644and TwoFish, as well as initialization vectors and authentication keys
4645(for HMAC@footnote{@uref{https://en.wikipedia.org/wiki/HMAC, HMAC}}).
4646The HMAC is computed over the encrypted payload.
4647Encrypted messages include an iv_seed and the HMAC in the header.
4648
4649Each encrypted message in the CORE service includes a sequence number and
4650a timestamp in the encrypted payload. The CORE service remembers the
4651largest observed sequence number and a bit-mask which represents which of
4652the previous 32 sequence numbers were already used.
4653Messages with sequence numbers lower than the largest observed sequence
4654number minus 32 are discarded. Messages with a timestamp that is less
4655than @code{REKEY_TOLERANCE} off (5 minutes) are also discarded. This of
4656course means that system clocks need to be reasonably synchronized for
4657peers to be able to communicate. Additionally, as the ephemeral key
4658changes every 12 hours, a peer would not even be able to decrypt messages
4659older than 12 hours.
4660
4661@node Type maps
4662@subsubsection Type maps
4663@c %**end of header
4664
4665Once an encrypted connection has been established, peers begin to exchange
4666type maps. Type maps are used to allow the CORE service to determine which
4667(encrypted) connections should be shown to which applications. A type map
4668is an array of 65536 bits representing the different types of messages
4669understood by applications using the CORE service. Each CORE service
4670maintains this map, simply by setting the respective bit for each message
4671type supported by any of the applications using the CORE service. Note
4672that bits for message types embedded in higher-level protocols (such as
4673MESH) will not be included in these type maps.
4674
4675Typically, the type map of a peer will be sparse. Thus, the CORE service
4676attempts to compress its type map using @code{gzip}-style compression
4677("deflate") prior to transmission. However, if the compression fails to
4678compact the map, the map may also be transmitted without compression
4679(resulting in @code{GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP} or
4680@code{GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP} messages respectively).
4681Upon receiving a type map, the respective CORE service notifies
4682applications about the connection to the other peer if they support any
4683message type indicated in the type map (or no message type at all).
4684If the CORE service experience a connect or disconnect event from an
4685application, it updates its type map (setting or unsetting the respective
4686bits) and notifies its neighbours about the change.
4687The CORE services of the neighbours then in turn generate connect and
4688disconnect events for the peer that sent the type map for their respective
4689applications. As CORE messages may be lost, the CORE service confirms
4690receiving a type map by sending back a
4691@code{GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP}. If such a confirmation
4692(with the correct hash of the type map) is not received, the sender will
4693retransmit the type map (with exponential back-off).
4694
4695@cindex cadet subsystem
4696@cindex CADET
4697@node GNUnet's CADET subsystem
4698@section GNUnet's CADET subsystem
4699
4700The CADET subsystem in GNUnet is responsible for secure end-to-end
4701communications between nodes in the GNUnet overlay network. CADET builds
4702on the CORE subsystem which provides for the link-layer communication and
4703then adds routing, forwarding and additional security to the connections.
4704CADET offers the same cryptographic services as CORE, but on an
4705end-to-end level. This is done so peers retransmitting traffic on behalf
4706of other peers cannot access the payload data.
4707
4708@itemize @bullet
4709@item CADET provides confidentiality with so-called perfect forward
4710secrecy; we use ECDHE powered by Curve25519 for the key exchange and then
4711use symmetric encryption, encrypting with both AES-256 and Twofish
4712@item authentication is achieved by signing the ephemeral keys using
4713Ed25519, a deterministic variant of ECDSA
4714@item integrity protection (using SHA-512 to do encrypt-then-MAC, although
4715only 256 bits are sent to reduce overhead)
4716@item replay protection (using nonces, timestamps, challenge-response,
4717message counters and ephemeral keys)
4718@item liveness (keep-alive messages, timeout)
4719@end itemize
4720
4721Additional to the CORE-like security benefits, CADET offers other
4722properties that make it a more universal service than CORE.
4723
4724@itemize @bullet
4725@item CADET can establish channels to arbitrary peers in GNUnet. If a
4726peer is not immediately reachable, CADET will find a path through the
4727network and ask other peers to retransmit the traffic on its behalf.
4728@item CADET offers (optional) reliability mechanisms. In a reliable
4729channel traffic is guaranteed to arrive complete, unchanged and in-order.
4730@item CADET takes care of flow and congestion control mechanisms, not
4731allowing the sender to send more traffic than the receiver or the network
4732are able to process.
4733@end itemize
4734
4735@menu
4736* libgnunetcadet::
4737@end menu
4738
4739@cindex libgnunetcadet
4740@node libgnunetcadet
4741@subsection libgnunetcadet
4742
4743
4744The CADET API (defined in @file{gnunet_cadet_service.h}) is the
4745messaging API used by P2P applications built using GNUnet.
4746It provides applications the ability to send and receive encrypted
4747messages to any peer participating in GNUnet.
4748The API is heavily base on the CORE API.
4749
4750CADET delivers messages to other peers in "channels".
4751A channel is a permanent connection defined by a destination peer
4752(identified by its public key) and a port number.
4753Internally, CADET tunnels all channels towards a destiantion peer
4754using one session key and relays the data on multiple "connections",
4755independent from the channels.
4756
4757Each channel has optional paramenters, the most important being the
4758reliability flag.
4759Should a message get lost on TRANSPORT/CORE level, if a channel is
4760created with as reliable, CADET will retransmit the lost message and
4761deliver it in order to the destination application.
4762
4763To communicate with other peers using CADET, it is necessary to first
4764connect to the service using @code{GNUNET_CADET_connect}.
4765This function takes several parameters in form of callbacks, to allow the
4766client to react to various events, like incoming channels or channels that
4767terminate, as well as specify a list of ports the client wishes to listen
4768to (at the moment it is not possible to start listening on further ports
4769once connected, but nothing prevents a client to connect several times to
4770CADET, even do one connection per listening port).
4771The function returns a handle which has to be used for any further
4772interaction with the service.
4773
4774To connect to a remote peer a client has to call the
4775@code{GNUNET_CADET_channel_create} function. The most important parameters
4776given are the remote peer's identity (it public key) and a port, which
4777specifies which application on the remote peer to connect to, similar to
4778TCP/UDP ports. CADET will then find the peer in the GNUnet network and
4779establish the proper low-level connections and do the necessary key
4780exchanges to assure and authenticated, secure and verified communication.
4781Similar to @code{GNUNET_CADET_connect},@code{GNUNET_CADET_create_channel}
4782returns a handle to interact with the created channel.
4783
4784For every message the client wants to send to the remote application,
4785@code{GNUNET_CADET_notify_transmit_ready} must be called, indicating the
4786channel on which the message should be sent and the size of the message
4787(but not the message itself!). Once CADET is ready to send the message,
4788the provided callback will fire, and the message contents are provided to
4789this callback.
4790
4791Please note the CADET does not provide an explicit notification of when a
4792channel is connected. In loosely connected networks, like big wireless
4793mesh networks, this can take several seconds, even minutes in the worst
4794case. To be alerted when a channel is online, a client can call
4795@code{GNUNET_CADET_notify_transmit_ready} immediately after
4796@code{GNUNET_CADET_create_channel}. When the callback is activated, it
4797means that the channel is online. The callback can give 0 bytes to CADET
4798if no message is to be sent, this is ok.
4799
4800If a transmission was requested but before the callback fires it is no
4801longer needed, it can be cancelled with
4802@code{GNUNET_CADET_notify_transmit_ready_cancel}, which uses the handle
4803given back by @code{GNUNET_CADET_notify_transmit_ready}.
4804As in the case of CORE, only one message can be requested at a time: a
4805client must not call @code{GNUNET_CADET_notify_transmit_ready} again until
4806the callback is called or the request is cancelled.
4807
4808When a channel is no longer needed, a client can call
4809@code{GNUNET_CADET_channel_destroy} to get rid of it.
4810Note that CADET will try to transmit all pending traffic before notifying
4811the remote peer of the destruction of the channel, including
4812retransmitting lost messages if the channel was reliable.
4813
4814Incoming channels, channels being closed by the remote peer, and traffic
4815on any incoming or outgoing channels are given to the client when CADET
4816executes the callbacks given to it at the time of
4817@code{GNUNET_CADET_connect}.
4818
4819Finally, when an application no longer wants to use CADET, it should call
4820@code{GNUNET_CADET_disconnect}, but first all channels and pending
4821transmissions must be closed (otherwise CADET will complain).
4822
4823@cindex nse subsystem
4824@cindex NSE
4825@node GNUnet's NSE subsystem
4826@section GNUnet's NSE subsystem
4827
4828
4829NSE stands for @dfn{Network Size Estimation}. The NSE subsystem provides
4830other subsystems and users with a rough estimate of the number of peers
4831currently participating in the GNUnet overlay.
4832The computed value is not a precise number as producing a precise number
4833in a decentralized, efficient and secure way is impossible.
4834While NSE's estimate is inherently imprecise, NSE also gives the expected
4835range. For a peer that has been running in a stable network for a
4836while, the real network size will typically (99.7% of the time) be in the
4837range of [2/3 estimate, 3/2 estimate]. We will now give an overview of the
4838algorithm used to calculate the estimate;
4839all of the details can be found in this technical report.
4840
4841@c FIXME: link to the report.
4842
4843@menu
4844* Motivation::
4845* Principle::
4846* libgnunetnse::
4847* The NSE Client-Service Protocol::
4848* The NSE Peer-to-Peer Protocol::
4849@end menu
4850
4851@node Motivation
4852@subsection Motivation
4853
4854
4855Some subsytems, like DHT, need to know the size of the GNUnet network to
4856optimize some parameters of their own protocol. The decentralized nature
4857of GNUnet makes efficient and securely counting the exact number of peers
4858infeasable. Although there are several decentralized algorithms to count
4859the number of peers in a system, so far there is none to do so securely.
4860Other protocols may allow any malicious peer to manipulate the final
4861result or to take advantage of the system to perform
4862@dfn{Denial of Service} (DoS) attacks against the network.
4863GNUnet's NSE protocol avoids these drawbacks.
4864
4865
4866
4867@menu
4868* Security::
4869@end menu
4870
4871@cindex NSE security
4872@cindex nse security
4873@node Security
4874@subsubsection Security
4875
4876
4877The NSE subsystem is designed to be resilient against these attacks.
4878It uses @uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proofs of work}
4879to prevent one peer from impersonating a large number of participants,
4880which would otherwise allow an adversary to artifically inflate the
4881estimate.
4882The DoS protection comes from the time-based nature of the protocol:
4883the estimates are calculated periodically and out-of-time traffic is
4884either ignored or stored for later retransmission by benign peers.
4885In particular, peers cannot trigger global network communication at will.
4886
4887@cindex NSE principle
4888@cindex nse principle
4889@node Principle
4890@subsection Principle
4891
4892
4893The algorithm calculates the estimate by finding the globally closest
4894peer ID to a random, time-based value.
4895
4896The idea is that the closer the ID is to the random value, the more
4897"densely packed" the ID space is, and therefore, more peers are in the
4898network.
4899
4900
4901
4902@menu
4903* Example::
4904* Algorithm::
4905* Target value::
4906* Timing::
4907* Controlled Flooding::
4908* Calculating the estimate::
4909@end menu
4910
4911@node Example
4912@subsubsection Example
4913
4914
4915Suppose all peers have IDs between 0 and 100 (our ID space), and the
4916random value is 42.
4917If the closest peer has the ID 70 we can imagine that the average
4918"distance" between peers is around 30 and therefore the are around 3
4919peers in the whole ID space. On the other hand, if the closest peer has
4920the ID 44, we can imagine that the space is rather packed with peers,
4921maybe as much as 50 of them.
4922Naturally, we could have been rather unlucky, and there is only one peer
4923and happens to have the ID 44. Thus, the current estimate is calculated
4924as the average over multiple rounds, and not just a single sample.
4925
4926@node Algorithm
4927@subsubsection Algorithm
4928
4929
4930Given that example, one can imagine that the job of the subsystem is to
4931efficiently communicate the ID of the closest peer to the target value
4932to all the other peers, who will calculate the estimate from it.
4933
4934@node Target value
4935@subsubsection Target value
4936
4937@c %**end of header
4938
4939The target value itself is generated by hashing the current time, rounded
4940down to an agreed value. If the rounding amount is 1h (default) and the
4941time is 12:34:56, the time to hash would be 12:00:00. The process is
4942repeated each rouning amount (in this example would be every hour).
4943Every repetition is called a round.
4944
4945@node Timing
4946@subsubsection Timing
4947@c %**end of header
4948
4949The NSE subsystem has some timing control to avoid everybody broadcasting
4950its ID all at one. Once each peer has the target random value, it
4951compares its own ID to the target and calculates the hypothetical size of
4952the network if that peer were to be the closest.
4953Then it compares the hypothetical size with the estimate from the previous
4954rounds. For each value there is an assiciated point in the period,
4955let's call it "broadcast time". If its own hypothetical estimate
4956is the same as the previous global estimate, its "broadcast time" will be
4957in the middle of the round. If its bigger it will be earlier and if its
4958smaller (the most likely case) it will be later. This ensures that the
4959peers closests to the target value start broadcasting their ID the first.
4960
4961@node Controlled Flooding
4962@subsubsection Controlled Flooding
4963
4964@c %**end of header
4965
4966When a peer receives a value, first it verifies that it is closer than the
4967closest value it had so far, otherwise it answers the incoming message
4968with a message containing the better value. Then it checks a proof of
4969work that must be included in the incoming message, to ensure that the
4970other peer's ID is not made up (otherwise a malicious peer could claim to
4971have an ID of exactly the target value every round). Once validated, it
4972compares the brodcast time of the received value with the current time
4973and if it's not too early, sends the received value to its neighbors.
4974Otherwise it stores the value until the correct broadcast time comes.
4975This prevents unnecessary traffic of sub-optimal values, since a better
4976value can come before the broadcast time, rendering the previous one
4977obsolete and saving the traffic that would have been used to broadcast it
4978to the neighbors.
4979
4980@node Calculating the estimate
4981@subsubsection Calculating the estimate
4982
4983@c %**end of header
4984
4985Once the closest ID has been spread across the network each peer gets the
4986exact distance betweed this ID and the target value of the round and
4987calculates the estimate with a mathematical formula described in the tech
4988report. The estimate generated with this method for a single round is not
4989very precise. Remember the case of the example, where the only peer is the
4990ID 44 and we happen to generate the target value 42, thinking there are
499150 peers in the network. Therefore, the NSE subsystem remembers the last
499264 estimates and calculates an average over them, giving a result of which
4993usually has one bit of uncertainty (the real size could be half of the
4994estimate or twice as much). Note that the actual network size is
4995calculated in powers of two of the raw input, thus one bit of uncertainty
4996means a factor of two in the size estimate.
4997
4998@cindex libgnunetnse
4999@node libgnunetnse
5000@subsection libgnunetnse
5001
5002@c %**end of header
5003
5004The NSE subsystem has the simplest API of all services, with only two
5005calls: @code{GNUNET_NSE_connect} and @code{GNUNET_NSE_disconnect}.
5006
5007The connect call gets a callback function as a parameter and this function
5008is called each time the network agrees on an estimate. This usually is
5009once per round, with some exceptions: if the closest peer has a late
5010local clock and starts spreading his ID after everyone else agreed on a
5011value, the callback might be activated twice in a round, the second value
5012being always bigger than the first. The default round time is set to
50131 hour.
5014
5015The disconnect call disconnects from the NSE subsystem and the callback
5016is no longer called with new estimates.
5017
5018
5019
5020@menu
5021* Results::
5022* libgnunetnse - Examples::
5023@end menu
5024
5025@node Results
5026@subsubsection Results
5027
5028@c %**end of header
5029
5030The callback provides two values: the average and the
5031@uref{http://en.wikipedia.org/wiki/Standard_deviation, standard deviation}
5032of the last 64 rounds. The values provided by the callback function are
5033logarithmic, this means that the real estimate numbers can be obtained by
5034calculating 2 to the power of the given value (2average). From a
5035statistics point of view this means that:
5036
5037@itemize @bullet
5038@item 68% of the time the real size is included in the interval
5039[(2average-stddev), 2]
5040@item 95% of the time the real size is included in the interval
5041[(2average-2*stddev, 2^average+2*stddev]
5042@item 99.7% of the time the real size is included in the interval
5043[(2average-3*stddev, 2average+3*stddev]
5044@end itemize
5045
5046The expected standard variation for 64 rounds in a network of stable size
5047is 0.2. Thus, we can say that normally:
5048
5049@itemize @bullet
5050@item 68% of the time the real size is in the range [-13%, +15%]
5051@item 95% of the time the real size is in the range [-24%, +32%]
5052@item 99.7% of the time the real size is in the range [-34%, +52%]
5053@end itemize
5054
5055As said in the introduction, we can be quite sure that usually the real
5056size is between one third and three times the estimate. This can of
5057course vary with network conditions.
5058Thus, applications may want to also consider the provided standard
5059deviation value, not only the average (in particular, if the standard
5060veriation is very high, the average maybe meaningless: the network size is
5061changing rapidly).
5062
5063@node libgnunetnse - Examples
5064@subsubsection libgnunetnse -Examples
5065
5066@c %**end of header
5067
5068Let's close with a couple examples.
5069
5070@table @asis
5071
5072@item Average: 10, std dev: 1 Here the estimate would be
50732^10 = 1024 peers. @footnote{The range in which we can be 95% sure is:
5074[2^8, 2^12] = [256, 4096]. We can be very (>99.7%) sure that the network
5075is not a hundred peers and absolutely sure that it is not a million peers,
5076but somewhere around a thousand.}
5077
5078@item Average 22, std dev: 0.2 Here the estimate would be
50792^22 = 4 Million peers. @footnote{The range in which we can be 99.7% sure
5080is: [2^21.4, 2^22.6] = [2.8M, 6.3M]. We can be sure that the network size
5081is around four million, with absolutely way of it being 1 million.}
5082
5083@end table
5084
5085To put this in perspective, if someone remembers the LHC Higgs boson
5086results, were announced with "5 sigma" and "6 sigma" certainties. In this
5087case a 5 sigma minimum would be 2 million and a 6 sigma minimum,
50881.8 million.
5089
5090@node The NSE Client-Service Protocol
5091@subsection The NSE Client-Service Protocol
5092
5093@c %**end of header
5094
5095As with the API, the client-service protocol is very simple, only has 2
5096different messages, defined in @code{src/nse/nse.h}:
5097
5098@itemize @bullet
5099@item @code{GNUNET_MESSAGE_TYPE_NSE_START}@ This message has no parameters
5100and is sent from the client to the service upon connection.
5101@item @code{GNUNET_MESSAGE_TYPE_NSE_ESTIMATE}@ This message is sent from
5102the service to the client for every new estimate and upon connection.
5103Contains a timestamp for the estimate, the average and the standard
5104deviation for the respective round.
5105@end itemize
5106
5107When the @code{GNUNET_NSE_disconnect} API call is executed, the client
5108simply disconnects from the service, with no message involved.
5109
5110@cindex NSE Peer-to-Peer Protocol
5111@node The NSE Peer-to-Peer Protocol
5112@subsection The NSE Peer-to-Peer Protocol
5113
5114@c %**end of header
5115
5116The NSE subsystem only has one message in the P2P protocol, the
5117@code{GNUNET_MESSAGE_TYPE_NSE_P2P_FLOOD} message.
5118
5119This message key contents are the timestamp to identify the round
5120(differences in system clocks may cause some peers to send messages way
5121too early or way too late, so the timestamp allows other peers to
5122identify such messages easily), the
5123@uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proof of work}
5124used to make it difficult to mount a
5125@uref{http://en.wikipedia.org/wiki/Sybil_attack, Sybil attack}, and the
5126public key, which is used to verify the signature on the message.
5127
5128Every peer stores a message for the previous, current and next round. The
5129messages for the previous and current round are given to peers that
5130connect to us. The message for the next round is simply stored until our
5131system clock advances to the next round. The message for the current round
5132is what we are flooding the network with right now.
5133At the beginning of each round the peer does the following:
5134
5135@itemize @bullet
5136@item calculates his own distance to the target value
5137@item creates, signs and stores the message for the current round (unless
5138it has a better message in the "next round" slot which came early in the
5139previous round)
5140@item calculates, based on the stored round message (own or received) when
5141to stard flooding it to its neighbors
5142@end itemize
5143
5144Upon receiving a message the peer checks the validity of the message
5145(round, proof of work, signature). The next action depends on the
5146contents of the incoming message:
5147
5148@itemize @bullet
5149@item if the message is worse than the current stored message, the peer
5150sends the current message back immediately, to stop the other peer from
5151spreading suboptimal results
5152@item if the message is better than the current stored message, the peer
5153stores the new message and calculates the new target time to start
5154spreading it to its neighbors (excluding the one the message came from)
5155@item if the message is for the previous round, it is compared to the
5156message stored in the "previous round slot", which may then be updated
5157@item if the message is for the next round, it is compared to the message
5158stored in the "next round slot", which again may then be updated
5159@end itemize
5160
5161Finally, when it comes to send the stored message for the current round to
5162the neighbors there is a random delay added for each neighbor, to avoid
5163traffic spikes and minimize cross-messages.
5164
5165@cindex HOSTLIST subsystem
5166@cindex hostlist subsystem
5167@node GNUnet's HOSTLIST subsystem
5168@section GNUnet's HOSTLIST subsystem
5169
5170@c %**end of header
5171
5172Peers in the GNUnet overlay network need address information so that they
5173can connect with other peers. GNUnet uses so called HELLO messages to
5174store and exchange peer addresses.
5175GNUnet provides several methods for peers to obtain this information:
5176
5177@itemize @bullet
5178@item out-of-band exchange of HELLO messages (manually, using for example
5179gnunet-peerinfo)
5180@item HELLO messages shipped with GNUnet (automatic with distribution)
5181@item UDP neighbor discovery in LAN (IPv4 broadcast, IPv6 multicast)
5182@item topology gossiping (learning from other peers we already connected
5183to), and
5184@item the HOSTLIST daemon covered in this section, which is particularly
5185relevant for bootstrapping new peers.
5186@end itemize
5187
5188New peers have no existing connections (and thus cannot learn from gossip
5189among peers), may not have other peers in their LAN and might be started
5190with an outdated set of HELLO messages from the distribution.
5191In this case, getting new peers to connect to the network requires either
5192manual effort or the use of a HOSTLIST to obtain HELLOs.
5193
5194@menu
5195* HELLOs::
5196* Overview for the HOSTLIST subsystem::
5197* Interacting with the HOSTLIST daemon::
5198* Hostlist security address validation::
5199* The HOSTLIST daemon::
5200* The HOSTLIST server::
5201* The HOSTLIST client::
5202* Usage::
5203@end menu
5204
5205@node HELLOs
5206@subsection HELLOs
5207
5208@c %**end of header
5209
5210The basic information peers require to connect to other peers are
5211contained in so called HELLO messages you can think of as a business card.
5212Besides the identity of the peer (based on the cryptographic public key) a
5213HELLO message may contain address information that specifies ways to
5214contact a peer. By obtaining HELLO messages, a peer can learn how to
5215contact other peers.
5216
5217@node Overview for the HOSTLIST subsystem
5218@subsection Overview for the HOSTLIST subsystem
5219
5220@c %**end of header
5221
5222The HOSTLIST subsystem provides a way to distribute and obtain contact
5223information to connect to other peers using a simple HTTP GET request.
5224It's implementation is split in three parts, the main file for the daemon
5225itself (@file{gnunet-daemon-hostlist.c}), the HTTP client used to download
5226peer information (@file{hostlist-client.c}) and the server component used
5227to provide this information to other peers (@file{hostlist-server.c}).
5228The server is basically a small HTTP web server (based on GNU
5229libmicrohttpd) which provides a list of HELLOs known to the local peer for
5230download. The client component is basically a HTTP client
5231(based on libcurl) which can download hostlists from one or more websites.
5232The hostlist format is a binary blob containing a sequence of HELLO
5233messages. Note that any HTTP server can theoretically serve a hostlist,
5234the build-in hostlist server makes it simply convenient to offer this
5235service.
5236
5237
5238@menu
5239* Features::
5240* HOSTLIST - Limitations::
5241@end menu
5242
5243@node Features
5244@subsubsection Features
5245
5246@c %**end of header
5247
5248The HOSTLIST daemon can:
5249
5250@itemize @bullet
5251@item provide HELLO messages with validated addresses obtained from
5252PEERINFO to download for other peers
5253@item download HELLO messages and forward these message to the TRANSPORT
5254subsystem for validation
5255@item advertises the URL of this peer's hostlist address to other peers
5256via gossip
5257@item automatically learn about hostlist servers from the gossip of other
5258peers
5259@end itemize
5260
5261@node HOSTLIST - Limitations
5262@subsubsection HOSTLIST - Limitations
5263
5264@c %**end of header
5265
5266The HOSTLIST daemon does not:
5267
5268@itemize @bullet
5269@item verify the cryptographic information in the HELLO messages
5270@item verify the address information in the HELLO messages
5271@end itemize
5272
5273@node Interacting with the HOSTLIST daemon
5274@subsection Interacting with the HOSTLIST daemon
5275
5276@c %**end of header
5277
5278The HOSTLIST subsystem is currently implemented as a daemon, so there is
5279no need for the user to interact with it and therefore there is no
5280command line tool and no API to communicate with the daemon. In the
5281future, we can envision changing this to allow users to manually trigger
5282the download of a hostlist.
5283
5284Since there is no command line interface to interact with HOSTLIST, the
5285only way to interact with the hostlist is to use STATISTICS to obtain or
5286modify information about the status of HOSTLIST:
5287
5288@example
5289$ gnunet-statistics -s hostlist
5290@end example
5291
5292@noindent
5293In particular, HOSTLIST includes a @strong{persistent} value in statistics
5294that specifies when the hostlist server might be queried next. As this
5295value is exponentially increasing during runtime, developers may want to
5296reset or manually adjust it. Note that HOSTLIST (but not STATISTICS) needs
5297to be shutdown if changes to this value are to have any effect on the
5298daemon (as HOSTLIST does not monitor STATISTICS for changes to the
5299download frequency).
5300
5301@node Hostlist security address validation
5302@subsection Hostlist security address validation
5303
5304@c %**end of header
5305
5306Since information obtained from other parties cannot be trusted without
5307validation, we have to distinguish between @emph{validated} and
5308@emph{not validated} addresses. Before using (and so trusting)
5309information from other parties, this information has to be double-checked
5310(validated). Address validation is not done by HOSTLIST but by the
5311TRANSPORT service.
5312
5313The HOSTLIST component is functionally located between the PEERINFO and
5314the TRANSPORT subsystem. When acting as a server, the daemon obtains valid
5315(@emph{validated}) peer information (HELLO messages) from the PEERINFO
5316service and provides it to other peers. When acting as a client, it
5317contacts the HOSTLIST servers specified in the configuration, downloads
5318the (unvalidated) list of HELLO messages and forwards these information
5319to the TRANSPORT server to validate the addresses.
5320
5321@cindex HOSTLIST daemon
5322@node The HOSTLIST daemon
5323@subsection The HOSTLIST daemon
5324
5325@c %**end of header
5326
5327The hostlist daemon is the main component of the HOSTLIST subsystem. It is
5328started by the ARM service and (if configured) starts the HOSTLIST client
5329and server components.
5330
5331If the daemon provides a hostlist itself it can advertise it's own
5332hostlist to other peers. To do so it sends a
5333@code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT} message to other peers
5334when they connect to this peer on the CORE level. This hostlist
5335advertisement message contains the URL to access the HOSTLIST HTTP
5336server of the sender. The daemon may also subscribe to this type of
5337message from CORE service, and then forward these kind of message to the
5338HOSTLIST client. The client then uses all available URLs to download peer
5339information when necessary.
5340
5341When starting, the HOSTLIST daemon first connects to the CORE subsystem
5342and if hostlist learning is enabled, registers a CORE handler to receive
5343this kind of messages. Next it starts (if configured) the client and
5344server. It passes pointers to CORE connect and disconnect and receive
5345handlers where the client and server store their functions, so the daemon
5346can notify them about CORE events.
5347
5348To clean up on shutdown, the daemon has a cleaning task, shutting down all
5349subsystems and disconnecting from CORE.
5350
5351@cindex HOSTLIST server
5352@node The HOSTLIST server
5353@subsection The HOSTLIST server
5354
5355@c %**end of header
5356
5357The server provides a way for other peers to obtain HELLOs. Basically it
5358is a small web server other peers can connect to and download a list of
5359HELLOs using standard HTTP; it may also advertise the URL of the hostlist
5360to other peers connecting on CORE level.
5361
5362
5363@menu
5364* The HTTP Server::
5365* Advertising the URL::
5366@end menu
5367
5368@node The HTTP Server
5369@subsubsection The HTTP Server
5370
5371@c %**end of header
5372
5373During startup, the server starts a web server listening on the port
5374specified with the HTTPPORT value (default 8080). In addition it connects
5375to the PEERINFO service to obtain peer information. The HOSTLIST server
5376uses the GNUNET_PEERINFO_iterate function to request HELLO information for
5377all peers and adds their information to a new hostlist if they are
5378suitable (expired addresses and HELLOs without addresses are both not
5379suitable) and the maximum size for a hostlist is not exceeded
5380(MAX_BYTES_PER_HOSTLISTS = 500000).
5381When PEERINFO finishes (with a last NULL callback), the server destroys
5382the previous hostlist response available for download on the web server
5383and replaces it with the updated hostlist. The hostlist format is
5384basically a sequence of HELLO messages (as obtained from PEERINFO) without
5385any special tokenization. Since each HELLO message contains a size field,
5386the response can easily be split into separate HELLO messages by the
5387client.
5388
5389A HOSTLIST client connecting to the HOSTLIST server will receive the
5390hostlist as a HTTP response and the the server will terminate the
5391connection with the result code @code{HTTP 200 OK}.
5392The connection will be closed immediately if no hostlist is available.
5393
5394@node Advertising the URL
5395@subsubsection Advertising the URL
5396
5397@c %**end of header
5398
5399The server also advertises the URL to download the hostlist to other peers
5400if hostlist advertisement is enabled.
5401When a new peer connects and has hostlist learning enabled, the server
5402sends a @code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT} message to this
5403peer using the CORE service.
5404
5405@cindex HOSTLIST client
5406@node The HOSTLIST client
5407@subsection The HOSTLIST client
5408
5409@c %**end of header
5410
5411The client provides the functionality to download the list of HELLOs from
5412a set of URLs.
5413It performs a standard HTTP request to the URLs configured and learned
5414from advertisement messages received from other peers. When a HELLO is
5415downloaded, the HOSTLIST client forwards the HELLO to the TRANSPORT
5416service for validation.
5417
5418The client supports two modes of operation:
5419
5420@itemize @bullet
5421@item download of HELLOs (bootstrapping)
5422@item learning of URLs
5423@end itemize
5424
5425@menu
5426* Bootstrapping::
5427* Learning::
5428@end menu
5429
5430@node Bootstrapping
5431@subsubsection Bootstrapping
5432
5433@c %**end of header
5434
5435For bootstrapping, it schedules a task to download the hostlist from the
5436set of known URLs.
5437The downloads are only performed if the number of current
5438connections is smaller than a minimum number of connections
5439(at the moment 4).
5440The interval between downloads increases exponentially; however, the
5441exponential growth is limited if it becomes longer than an hour.
5442At that point, the frequency growth is capped at
5443(#number of connections * 1h).
5444
5445Once the decision has been taken to download HELLOs, the daemon chooses a
5446random URL from the list of known URLs. URLs can be configured in the
5447configuration or be learned from advertisement messages.
5448The client uses a HTTP client library (libcurl) to initiate the download
5449using the libcurl multi interface.
5450Libcurl passes the data to the callback_download function which
5451stores the data in a buffer if space is available and the maximum size for
5452a hostlist download is not exceeded (MAX_BYTES_PER_HOSTLISTS = 500000).
5453When a full HELLO was downloaded, the HOSTLIST client offers this
5454HELLO message to the TRANSPORT service for validation.
5455When the download is finished or failed, statistical information about the
5456quality of this URL is updated.
5457
5458@cindex HOSTLIST learning
5459@node Learning
5460@subsubsection Learning
5461
5462@c %**end of header
5463
5464The client also manages hostlist advertisements from other peers. The
5465HOSTLIST daemon forwards @code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT}
5466messages to the client subsystem, which extracts the URL from the message.
5467Next, a test of the newly obtained URL is performed by triggering a
5468download from the new URL. If the URL works correctly, it is added to the
5469list of working URLs.
5470
5471The size of the list of URLs is restricted, so if an additional server is
5472added and the list is full, the URL with the worst quality ranking
5473(determined through successful downloads and number of HELLOs e.g.) is
5474discarded. During shutdown the list of URLs is saved to a file for
5475persistance and loaded on startup. URLs from the configuration file are
5476never discarded.
5477
5478@node Usage
5479@subsection Usage
5480
5481@c %**end of header
5482
5483To start HOSTLIST by default, it has to be added to the DEFAULTSERVICES
5484section for the ARM services. This is done in the default configuration.
5485
5486For more information on how to configure the HOSTLIST subsystem see the
5487installation handbook:@
5488Configuring the hostlist to bootstrap@
5489Configuring your peer to provide a hostlist
5490
5491@cindex IDENTITY
5492@cindex identity subsystem
5493@node GNUnet's IDENTITY subsystem
5494@section GNUnet's IDENTITY subsystem
5495
5496@c %**end of header
5497
5498Identities of "users" in GNUnet are called egos.
5499Egos can be used as pseudonyms ("fake names") or be tied to an
5500organization (for example, "GNU") or even the actual identity of a human.
5501GNUnet users are expected to have many egos. They might have one tied to
5502their real identity, some for organizations they manage, and more for
5503different domains where they want to operate under a pseudonym.
5504
5505The IDENTITY service allows users to manage their egos. The identity
5506service manages the private keys egos of the local user; it does not
5507manage identities of other users (public keys). Public keys for other
5508users need names to become manageable. GNUnet uses the
5509@dfn{GNU Name System} (GNS) to give names to other users and manage their
5510public keys securely. This chapter is about the IDENTITY service,
5511which is about the management of private keys.
5512
5513On the network, an ego corresponds to an ECDSA key (over Curve25519,
5514using RFC 6979, as required by GNS). Thus, users can perform actions
5515under a particular ego by using (signing with) a particular private key.
5516Other users can then confirm that the action was really performed by that
5517ego by checking the signature against the respective public key.
5518
5519The IDENTITY service allows users to associate a human-readable name with
5520each ego. This way, users can use names that will remind them of the
5521purpose of a particular ego.
5522The IDENTITY service will store the respective private keys and
5523allows applications to access key information by name.
5524Users can change the name that is locally (!) associated with an ego.
5525Egos can also be deleted, which means that the private key will be removed
5526and it thus will not be possible to perform actions with that ego in the
5527future.
5528
5529Additionally, the IDENTITY subsystem can associate service functions with
5530egos.
5531For example, GNS requires the ego that should be used for the shorten
5532zone. GNS will ask IDENTITY for an ego for the "gns-short" service.
5533The IDENTITY service has a mapping of such service strings to the name of
5534the ego that the user wants to use for this service, for example
5535"my-short-zone-ego".
5536
5537Finally, the IDENTITY API provides access to a special ego, the
5538anonymous ego. The anonymous ego is special in that its private key is not
5539really private, but fixed and known to everyone.
5540Thus, anyone can perform actions as anonymous. This can be useful as with
5541this trick, code does not have to contain a special case to distinguish
5542between anonymous and pseudonymous egos.
5543
5544@menu
5545* libgnunetidentity::
5546* The IDENTITY Client-Service Protocol::
5547@end menu
5548
5549@cindex libgnunetidentity
5550@node libgnunetidentity
5551@subsection libgnunetidentity
5552@c %**end of header
5553
5554
5555@menu
5556* Connecting to the service::
5557* Operations on Egos::
5558* The anonymous Ego::
5559* Convenience API to lookup a single ego::
5560* Associating egos with service functions::
5561@end menu
5562
5563@node Connecting to the service
5564@subsubsection Connecting to the service
5565
5566@c %**end of header
5567
5568First, typical clients connect to the identity service using
5569@code{GNUNET_IDENTITY_connect}. This function takes a callback as a
5570parameter.
5571If the given callback parameter is non-null, it will be invoked to notify
5572the application about the current state of the identities in the system.
5573
5574@itemize @bullet
5575@item First, it will be invoked on all known egos at the time of the
5576connection. For each ego, a handle to the ego and the user's name for the
5577ego will be passed to the callback. Furthermore, a @code{void **} context
5578argument will be provided which gives the client the opportunity to
5579associate some state with the ego.
5580@item Second, the callback will be invoked with NULL for the ego, the name
5581and the context. This signals that the (initial) iteration over all egos
5582has completed.
5583@item Then, the callback will be invoked whenever something changes about
5584an ego.
5585If an ego is renamed, the callback is invoked with the ego handle of the
5586ego that was renamed, and the new name. If an ego is deleted, the callback
5587is invoked with the ego handle and a name of NULL. In the deletion case,
5588the application should also release resources stored in the context.
5589@item When the application destroys the connection to the identity service
5590using @code{GNUNET_IDENTITY_disconnect}, the callback is again invoked
5591with the ego and a name of NULL (equivalent to deletion of the egos).
5592This should again be used to clean up the per-ego context.
5593@end itemize
5594
5595The ego handle passed to the callback remains valid until the callback is
5596invoked with a name of NULL, so it is safe to store a reference to the
5597ego's handle.
5598
5599@node Operations on Egos
5600@subsubsection Operations on Egos
5601
5602@c %**end of header
5603
5604Given an ego handle, the main operations are to get its associated private
5605key using @code{GNUNET_IDENTITY_ego_get_private_key} or its associated
5606public key using @code{GNUNET_IDENTITY_ego_get_public_key}.
5607
5608The other operations on egos are pretty straightforward.
5609Using @code{GNUNET_IDENTITY_create}, an application can request the
5610creation of an ego by specifying the desired name.
5611The operation will fail if that name is
5612already in use. Using @code{GNUNET_IDENTITY_rename} the name of an
5613existing ego can be changed. Finally, egos can be deleted using
5614@code{GNUNET_IDENTITY_delete}. All of these operations will trigger
5615updates to the callback given to the @code{GNUNET_IDENTITY_connect}
5616function of all applications that are connected with the identity service
5617at the time. @code{GNUNET_IDENTITY_cancel} can be used to cancel the
5618operations before the respective continuations would be called.
5619It is not guaranteed that the operation will not be completed anyway,
5620only the continuation will no longer be called.
5621
5622@node The anonymous Ego
5623@subsubsection The anonymous Ego
5624
5625@c %**end of header
5626
5627A special way to obtain an ego handle is to call
5628@code{GNUNET_IDENTITY_ego_get_anonymous}, which returns an ego for the
5629"anonymous" user --- anyone knows and can get the private key for this
5630user, so it is suitable for operations that are supposed to be anonymous
5631but require signatures (for example, to avoid a special path in the code).
5632The anonymous ego is always valid and accessing it does not require a
5633connection to the identity service.
5634
5635@node Convenience API to lookup a single ego
5636@subsubsection Convenience API to lookup a single ego
5637
5638
5639As applications commonly simply have to lookup a single ego, there is a
5640convenience API to do just that. Use @code{GNUNET_IDENTITY_ego_lookup} to
5641lookup a single ego by name. Note that this is the user's name for the
5642ego, not the service function. The resulting ego will be returned via a
5643callback and will only be valid during that callback. The operation can
5644be cancelled via @code{GNUNET_IDENTITY_ego_lookup_cancel}
5645(cancellation is only legal before the callback is invoked).
5646
5647@node Associating egos with service functions
5648@subsubsection Associating egos with service functions
5649
5650
5651The @code{GNUNET_IDENTITY_set} function is used to associate a particular
5652ego with a service function. The name used by the service and the ego are
5653given as arguments.
5654Afterwards, the service can use its name to lookup the associated ego
5655using @code{GNUNET_IDENTITY_get}.
5656
5657@node The IDENTITY Client-Service Protocol
5658@subsection The IDENTITY Client-Service Protocol
5659
5660@c %**end of header
5661
5662A client connecting to the identity service first sends a message with
5663type
5664@code{GNUNET_MESSAGE_TYPE_IDENTITY_START} to the service. After that, the
5665client will receive information about changes to the egos by receiving
5666messages of type @code{GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE}.
5667Those messages contain the private key of the ego and the user's name of
5668the ego (or zero bytes for the name to indicate that the ego was deleted).
5669A special bit @code{end_of_list} is used to indicate the end of the
5670initial iteration over the identity service's egos.
5671
5672The client can trigger changes to the egos by sending @code{CREATE},
5673@code{RENAME} or @code{DELETE} messages.
5674The CREATE message contains the private key and the desired name.@
5675The RENAME message contains the old name and the new name.@
5676The DELETE message only needs to include the name of the ego to delete.@
5677The service responds to each of these messages with a @code{RESULT_CODE}
5678message which indicates success or error of the operation, and possibly
5679a human-readable error message.
5680
5681Finally, the client can bind the name of a service function to an ego by
5682sending a @code{SET_DEFAULT} message with the name of the service function
5683and the private key of the ego.
5684Such bindings can then be resolved using a @code{GET_DEFAULT} message,
5685which includes the name of the service function. The identity service
5686will respond to a GET_DEFAULT request with a SET_DEFAULT message
5687containing the respective information, or with a RESULT_CODE to
5688indicate an error.
5689
5690@cindex NAMESTORE
5691@cindex namestore subsystem
5692@node GNUnet's NAMESTORE Subsystem
5693@section GNUnet's NAMESTORE Subsystem
5694
5695The NAMESTORE subsystem provides persistent storage for local GNS zone
5696information. All local GNS zone information are managed by NAMESTORE. It
5697provides both the functionality to administer local GNS information (e.g.
5698delete and add records) as well as to retrieve GNS information (e.g to
5699list name information in a client).
5700NAMESTORE does only manage the persistent storage of zone information
5701belonging to the user running the service: GNS information from other
5702users obtained from the DHT are stored by the NAMECACHE subsystem.
5703
5704NAMESTORE uses a plugin-based database backend to store GNS information
5705with good performance. Here sqlite, MySQL and PostgreSQL are supported
5706database backends.
5707NAMESTORE clients interact with the IDENTITY subsystem to obtain
5708cryptographic information about zones based on egos as described with the
5709IDENTITY subsystem, but internally NAMESTORE refers to zones using the
5710ECDSA private key.
5711In addition, it collaborates with the NAMECACHE subsystem and
5712stores zone information when local information are modified in the
5713GNS cache to increase look-up performance for local information.
5714
5715NAMESTORE provides functionality to look-up and store records, to iterate
5716over a specific or all zones and to monitor zones for changes. NAMESTORE
5717functionality can be accessed using the NAMESTORE api or the NAMESTORE
5718command line tool.
5719
5720@menu
5721* libgnunetnamestore::
5722@end menu
5723
5724@cindex libgnunetnamestore
5725@node libgnunetnamestore
5726@subsection libgnunetnamestore
5727
5728To interact with NAMESTORE clients first connect to the NAMESTORE service
5729using the @code{GNUNET_NAMESTORE_connect} passing a configuration handle.
5730As a result they obtain a NAMESTORE handle, they can use for operations,
5731or NULL is returned if the connection failed.
5732
5733To disconnect from NAMESTORE, clients use
5734@code{GNUNET_NAMESTORE_disconnect} and specify the handle to disconnect.
5735
5736NAMESTORE internally uses the ECDSA private key to refer to zones. These
5737private keys can be obtained from the IDENTITY subsytem.
5738Here @emph{egos} @emph{can be used to refer to zones or the default ego
5739assigned to the GNS subsystem can be used to obtained the master zone's
5740private key.}
5741
5742
5743@menu
5744* Editing Zone Information::
5745* Iterating Zone Information::
5746* Monitoring Zone Information::
5747@end menu
5748
5749@node Editing Zone Information
5750@subsubsection Editing Zone Information
5751
5752@c %**end of header
5753
5754NAMESTORE provides functions to lookup records stored under a label in a
5755zone and to store records under a label in a zone.
5756
5757To store (and delete) records, the client uses the
5758@code{GNUNET_NAMESTORE_records_store} function and has to provide
5759namestore handle to use, the private key of the zone, the label to store
5760the records under, the records and number of records plus an callback
5761function.
5762After the operation is performed NAMESTORE will call the provided
5763callback function with the result GNUNET_SYSERR on failure
5764(including timeout/queue drop/failure to validate), GNUNET_NO if content
5765was already there or not found GNUNET_YES (or other positive value) on
5766success plus an additional error message.
5767
5768Records are deleted by using the store command with 0 records to store.
5769It is important to note, that records are not merged when records exist
5770with the label.
5771So a client has first to retrieve records, merge with existing records
5772and then store the result.
5773
5774To perform a lookup operation, the client uses the
5775@code{GNUNET_NAMESTORE_records_store} function. Here he has to pass the
5776namestore handle, the private key of the zone and the label. He also has
5777to provide a callback function which will be called with the result of
5778the lookup operation:
5779the zone for the records, the label, and the records including the
5780number of records included.
5781
5782A special operation is used to set the preferred nickname for a zone.
5783This nickname is stored with the zone and is automatically merged with
5784all labels and records stored in a zone. Here the client uses the
5785@code{GNUNET_NAMESTORE_set_nick} function and passes the private key of
5786the zone, the nickname as string plus a the callback with the result of
5787the operation.
5788
5789@node Iterating Zone Information
5790@subsubsection Iterating Zone Information
5791
5792@c %**end of header
5793
5794A client can iterate over all information in a zone or all zones managed
5795by NAMESTORE.
5796Here a client uses the @code{GNUNET_NAMESTORE_zone_iteration_start}
5797function and passes the namestore handle, the zone to iterate over and a
5798callback function to call with the result.
5799If the client wants to iterate over all the, he passes NULL for the zone.
5800A @code{GNUNET_NAMESTORE_ZoneIterator} handle is returned to be used to
5801continue iteration.
5802
5803NAMESTORE calls the callback for every result and expects the client to
5804call @code{GNUNET_NAMESTORE_zone_iterator_next} to continue to iterate or
5805@code{GNUNET_NAMESTORE_zone_iterator_stop} to interrupt the iteration.
5806When NAMESTORE reached the last item it will call the callback with a
5807NULL value to indicate.
5808
5809@node Monitoring Zone Information
5810@subsubsection Monitoring Zone Information
5811
5812@c %**end of header
5813
5814Clients can also monitor zones to be notified about changes. Here the
5815clients uses the @code{GNUNET_NAMESTORE_zone_monitor_start} function and
5816passes the private key of the zone and and a callback function to call
5817with updates for a zone.
5818The client can specify to obtain zone information first by iterating over
5819the zone and specify a synchronization callback to be called when the
5820client and the namestore are synced.
5821
5822On an update, NAMESTORE will call the callback with the private key of the
5823zone, the label and the records and their number.
5824
5825To stop monitoring, the client calls
5826@code{GNUNET_NAMESTORE_zone_monitor_stop} and passes the handle obtained
5827from the function to start the monitoring.
5828
5829@cindex PEERINFO
5830@cindex peerinfo subsystem
5831@node GNUnet's PEERINFO subsystem
5832@section GNUnet's PEERINFO subsystem
5833
5834@c %**end of header
5835
5836The PEERINFO subsystem is used to store verified (validated) information
5837about known peers in a persistent way. It obtains these addresses for
5838example from TRANSPORT service which is in charge of address validation.
5839Validation means that the information in the HELLO message are checked by
5840connecting to the addresses and performing a cryptographic handshake to
5841authenticate the peer instance stating to be reachable with these
5842addresses.
5843Peerinfo does not validate the HELLO messages itself but only stores them
5844and gives them to interested clients.
5845
5846As future work, we think about moving from storing just HELLO messages to
5847providing a generic persistent per-peer information store.
5848More and more subsystems tend to need to store per-peer information in
5849persistent way.
5850To not duplicate this functionality we plan to provide a PEERSTORE
5851service providing this functionality.
5852
5853@menu
5854* PEERINFO - Features::
5855* PEERINFO - Limitations::
5856* DeveloperPeer Information::
5857* Startup::
5858* Managing Information::
5859* Obtaining Information::
5860* The PEERINFO Client-Service Protocol::
5861* libgnunetpeerinfo::
5862@end menu
5863
5864@node PEERINFO - Features
5865@subsection PEERINFO - Features
5866
5867@c %**end of header
5868
5869@itemize @bullet
5870@item Persistent storage
5871@item Client notification mechanism on update
5872@item Periodic clean up for expired information
5873@item Differentiation between public and friend-only HELLO
5874@end itemize
5875
5876@node PEERINFO - Limitations
5877@subsection PEERINFO - Limitations
5878
5879
5880@itemize @bullet
5881@item Does not perform HELLO validation
5882@end itemize
5883
5884@node DeveloperPeer Information
5885@subsection DeveloperPeer Information
5886
5887@c %**end of header
5888
5889The PEERINFO subsystem stores these information in the form of HELLO
5890messages you can think of as business cards.
5891These HELLO messages contain the public key of a peer and the addresses
5892a peer can be reached under.
5893The addresses include an expiration date describing how long they are
5894valid. This information is updated regularly by the TRANSPORT service by
5895revalidating the address.
5896If an address is expired and not renewed, it can be removed from the
5897HELLO message.
5898
5899Some peer do not want to have their HELLO messages distributed to other
5900peers, especially when GNUnet's friend-to-friend modus is enabled.
5901To prevent this undesired distribution. PEERINFO distinguishes between
5902@emph{public} and @emph{friend-only} HELLO messages.
5903Public HELLO messages can be freely distributed to other (possibly
5904unknown) peers (for example using the hostlist, gossiping, broadcasting),
5905whereas friend-only HELLO messages may not be distributed to other peers.
5906Friend-only HELLO messages have an additional flag @code{friend_only} set
5907internally. For public HELLO message this flag is not set.
5908PEERINFO does and cannot not check if a client is allowed to obtain a
5909specific HELLO type.
5910
5911The HELLO messages can be managed using the GNUnet HELLO library.
5912Other GNUnet systems can obtain these information from PEERINFO and use
5913it for their purposes.
5914Clients are for example the HOSTLIST component providing these
5915information to other peers in form of a hostlist or the TRANSPORT
5916subsystem using these information to maintain connections to other peers.
5917
5918@node Startup
5919@subsection Startup
5920
5921@c %**end of header
5922
5923During startup the PEERINFO services loads persistent HELLOs from disk.
5924First PEERINFO parses the directory configured in the HOSTS value of the
5925@code{PEERINFO} configuration section to store PEERINFO information.
5926For all files found in this directory valid HELLO messages are extracted.
5927In addition it loads HELLO messages shipped with the GNUnet distribution.
5928These HELLOs are used to simplify network bootstrapping by providing
5929valid peer information with the distribution.
5930The use of these HELLOs can be prevented by setting the
5931@code{USE_INCLUDED_HELLOS} in the @code{PEERINFO} configuration section to
5932@code{NO}. Files containing invalid information are removed.
5933
5934@node Managing Information
5935@subsection Managing Information
5936
5937@c %**end of header
5938
5939The PEERINFO services stores information about known PEERS and a single
5940HELLO message for every peer.
5941A peer does not need to have a HELLO if no information are available.
5942HELLO information from different sources, for example a HELLO obtained
5943from a remote HOSTLIST and a second HELLO stored on disk, are combined
5944and merged into one single HELLO message per peer which will be given to
5945clients. During this merge process the HELLO is immediately written to
5946disk to ensure persistence.
5947
5948PEERINFO in addition periodically scans the directory where information
5949are stored for empty HELLO messages with expired TRANSPORT addresses.
5950This periodic task scans all files in the directory and recreates the
5951HELLO messages it finds.
5952Expired TRANSPORT addresses are removed from the HELLO and if the
5953HELLO does not contain any valid addresses, it is discarded and removed
5954from the disk.
5955
5956@node Obtaining Information
5957@subsection Obtaining Information
5958
5959@c %**end of header
5960
5961When a client requests information from PEERINFO, PEERINFO performs a
5962lookup for the respective peer or all peers if desired and transmits this
5963information to the client.
5964The client can specify if friend-only HELLOs have to be included or not
5965and PEERINFO filters the respective HELLO messages before transmitting
5966information.
5967
5968To notify clients about changes to PEERINFO information, PEERINFO
5969maintains a list of clients interested in this notifications.
5970Such a notification occurs if a HELLO for a peer was updated (due to a
5971merge for example) or a new peer was added.
5972
5973@node The PEERINFO Client-Service Protocol
5974@subsection The PEERINFO Client-Service Protocol
5975
5976@c %**end of header
5977
5978To connect and disconnect to and from the PEERINFO Service PEERINFO
5979utilizes the util client/server infrastructure, so no special messages
5980types are used here.
5981
5982To add information for a peer, the plain HELLO message is transmitted to
5983the service without any wrapping. All pieces of information required are
5984stored within the HELLO message.
5985The PEERINFO service provides a message handler accepting and processing
5986these HELLO messages.
5987
5988When obtaining PEERINFO information using the iterate functionality
5989specific messages are used. To obtain information for all peers, a
5990@code{struct ListAllPeersMessage} with message type
5991@code{GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL} and a flag
5992include_friend_only to indicate if friend-only HELLO messages should be
5993included are transmitted. If information for a specific peer is required
5994a @code{struct ListAllPeersMessage} with
5995@code{GNUNET_MESSAGE_TYPE_PEERINFO_GET} containing the peer identity is
5996used.
5997
5998For both variants the PEERINFO service replies for each HELLO message it
5999wants to transmit with a @code{struct ListAllPeersMessage} with type
6000@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO} containing the plain HELLO.
6001The final message is @code{struct GNUNET_MessageHeader} with type
6002@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO}. If the client receives this
6003message, it can proceed with the next request if any is pending.
6004
6005@node libgnunetpeerinfo
6006@subsection libgnunetpeerinfo
6007
6008@c %**end of header
6009
6010The PEERINFO API consists mainly of three different functionalities:
6011
6012@itemize @bullet
6013@item maintaining a connection to the service
6014@item adding new information to the PEERINFO service
6015@item retrieving information from the PEERINFO service
6016@end itemize
6017
6018@menu
6019* Connecting to the PEERINFO Service::
6020* Adding Information to the PEERINFO Service::
6021* Obtaining Information from the PEERINFO Service::
6022@end menu
6023
6024@node Connecting to the PEERINFO Service
6025@subsubsection Connecting to the PEERINFO Service
6026
6027@c %**end of header
6028
6029To connect to the PEERINFO service the function
6030@code{GNUNET_PEERINFO_connect} is used, taking a configuration handle as
6031an argument, and to disconnect from PEERINFO the function
6032@code{GNUNET_PEERINFO_disconnect}, taking the PEERINFO
6033handle returned from the connect function has to be called.
6034
6035@node Adding Information to the PEERINFO Service
6036@subsubsection Adding Information to the PEERINFO Service
6037
6038@c %**end of header
6039
6040@code{GNUNET_PEERINFO_add_peer} adds a new peer to the PEERINFO subsystem
6041storage. This function takes the PEERINFO handle as an argument, the HELLO
6042message to store and a continuation with a closure to be called with the
6043result of the operation.
6044The @code{GNUNET_PEERINFO_add_peer} returns a handle to this operation
6045allowing to cancel the operation with the respective cancel function
6046@code{GNUNET_PEERINFO_add_peer_cancel}. To retrieve information from
6047PEERINFO you can iterate over all information stored with PEERINFO or you
6048can tell PEERINFO to notify if new peer information are available.
6049
6050@node Obtaining Information from the PEERINFO Service
6051@subsubsection Obtaining Information from the PEERINFO Service
6052
6053@c %**end of header
6054
6055To iterate over information in PEERINFO you use
6056@code{GNUNET_PEERINFO_iterate}.
6057This function expects the PEERINFO handle, a flag if HELLO messages
6058intended for friend only mode should be included, a timeout how long the
6059operation should take and a callback with a callback closure to be called
6060for the results.
6061If you want to obtain information for a specific peer, you can specify
6062the peer identity, if this identity is NULL, information for all peers are
6063returned. The function returns a handle to allow to cancel the operation
6064using @code{GNUNET_PEERINFO_iterate_cancel}.
6065
6066To get notified when peer information changes, you can use
6067@code{GNUNET_PEERINFO_notify}.
6068This function expects a configuration handle and a flag if friend-only
6069HELLO messages should be included. The PEERINFO service will notify you
6070about every change and the callback function will be called to notify you
6071about changes. The function returns a handle to cancel notifications
6072with @code{GNUNET_PEERINFO_notify_cancel}.
6073
6074@cindex PEERSTORE subsystem
6075@node GNUnet's PEERSTORE subsystem
6076@section GNUnet's PEERSTORE subsystem
6077
6078@c %**end of header
6079
6080GNUnet's PEERSTORE subsystem offers persistent per-peer storage for other
6081GNUnet subsystems. GNUnet subsystems can use PEERSTORE to persistently
6082store and retrieve arbitrary data.
6083Each data record stored with PEERSTORE contains the following fields:
6084
6085@itemize @bullet
6086@item subsystem: Name of the subsystem responsible for the record.
6087@item peerid: Identity of the peer this record is related to.
6088@item key: a key string identifying the record.
6089@item value: binary record value.
6090@item expiry: record expiry date.
6091@end itemize
6092
6093@menu
6094* Functionality::
6095* Architecture::
6096* libgnunetpeerstore::
6097@end menu
6098
6099@node Functionality
6100@subsection Functionality
6101
6102@c %**end of header
6103
6104Subsystems can store any type of value under a (subsystem, peerid, key)
6105combination. A "replace" flag set during store operations forces the
6106PEERSTORE to replace any old values stored under the same
6107(subsystem, peerid, key) combination with the new value.
6108Additionally, an expiry date is set after which the record is *possibly*
6109deleted by PEERSTORE.
6110
6111Subsystems can iterate over all values stored under any of the following
6112combination of fields:
6113
6114@itemize @bullet
6115@item (subsystem)
6116@item (subsystem, peerid)
6117@item (subsystem, key)
6118@item (subsystem, peerid, key)
6119@end itemize
6120
6121Subsystems can also request to be notified about any new values stored
6122under a (subsystem, peerid, key) combination by sending a "watch"
6123request to PEERSTORE.
6124
6125@node Architecture
6126@subsection Architecture
6127
6128@c %**end of header
6129
6130PEERSTORE implements the following components:
6131
6132@itemize @bullet
6133@item PEERSTORE service: Handles store, iterate and watch operations.
6134@item PEERSTORE API: API to be used by other subsystems to communicate and
6135issue commands to the PEERSTORE service.
6136@item PEERSTORE plugins: Handles the persistent storage. At the moment,
6137only an "sqlite" plugin is implemented.
6138@end itemize
6139
6140@cindex libgnunetpeerstore
6141@node libgnunetpeerstore
6142@subsection libgnunetpeerstore
6143
6144@c %**end of header
6145
6146libgnunetpeerstore is the library containing the PEERSTORE API. Subsystems
6147wishing to communicate with the PEERSTORE service use this API to open a
6148connection to PEERSTORE. This is done by calling
6149@code{GNUNET_PEERSTORE_connect} which returns a handle to the newly
6150created connection.
6151This handle has to be used with any further calls to the API.
6152
6153To store a new record, the function @code{GNUNET_PEERSTORE_store} is to
6154be used which requires the record fields and a continuation function that
6155will be called by the API after the STORE request is sent to the
6156PEERSTORE service.
6157Note that calling the continuation function does not mean that the record
6158is successfully stored, only that the STORE request has been successfully
6159sent to the PEERSTORE service.
6160@code{GNUNET_PEERSTORE_store_cancel} can be called to cancel the STORE
6161request only before the continuation function has been called.
6162
6163To iterate over stored records, the function
6164@code{GNUNET_PEERSTORE_iterate} is
6165to be used. @emph{peerid} and @emph{key} can be set to NULL. An iterator
6166callback function will be called with each matching record found and a
6167NULL record at the end to signal the end of result set.
6168@code{GNUNET_PEERSTORE_iterate_cancel} can be used to cancel the ITERATE
6169request before the iterator callback is called with a NULL record.
6170
6171To be notified with new values stored under a (subsystem, peerid, key)
6172combination, the function @code{GNUNET_PEERSTORE_watch} is to be used.
6173This will register the watcher with the PEERSTORE service, any new
6174records matching the given combination will trigger the callback
6175function passed to @code{GNUNET_PEERSTORE_watch}. This continues until
6176@code{GNUNET_PEERSTORE_watch_cancel} is called or the connection to the
6177service is destroyed.
6178
6179After the connection is no longer needed, the function
6180@code{GNUNET_PEERSTORE_disconnect} can be called to disconnect from the
6181PEERSTORE service.
6182Any pending ITERATE or WATCH requests will be destroyed.
6183If the @code{sync_first} flag is set to @code{GNUNET_YES}, the API will
6184delay the disconnection until all pending STORE requests are sent to
6185the PEERSTORE service, otherwise, the pending STORE requests will be
6186destroyed as well.
6187
6188@cindex SET Subsystem
6189@node GNUnet's SET Subsystem
6190@section GNUnet's SET Subsystem
6191
6192@c %**end of header
6193
6194The SET service implements efficient set operations between two peers
6195over a mesh tunnel.
6196Currently, set union and set intersection are the only supported
6197operations. Elements of a set consist of an @emph{element type} and
6198arbitrary binary @emph{data}.
6199The size of an element's data is limited to around 62 KB.
6200
6201@menu
6202* Local Sets::
6203* Set Modifications::
6204* Set Operations::
6205* Result Elements::
6206* libgnunetset::
6207* The SET Client-Service Protocol::
6208* The SET Intersection Peer-to-Peer Protocol::
6209* The SET Union Peer-to-Peer Protocol::
6210@end menu
6211
6212@node Local Sets
6213@subsection Local Sets
6214
6215@c %**end of header
6216
6217Sets created by a local client can be modified and reused for multiple
6218operations. As each set operation requires potentially expensive special
6219auxilliary data to be computed for each element of a set, a set can only
6220participate in one type of set operation (i.e. union or intersection).
6221The type of a set is determined upon its creation.
6222If a the elements of a set are needed for an operation of a different
6223type, all of the set's element must be copied to a new set of appropriate
6224type.
6225
6226@node Set Modifications
6227@subsection Set Modifications
6228
6229@c %**end of header
6230
6231Even when set operations are active, one can add to and remove elements
6232from a set.
6233However, these changes will only be visible to operations that have been
6234created after the changes have taken place. That is, every set operation
6235only sees a snapshot of the set from the time the operation was started.
6236This mechanism is @emph{not} implemented by copying the whole set, but by
6237attaching @emph{generation information} to each element and operation.
6238
6239@node Set Operations
6240@subsection Set Operations
6241
6242@c %**end of header
6243
6244Set operations can be started in two ways: Either by accepting an
6245operation request from a remote peer, or by requesting a set operation
6246from a remote peer.
6247Set operations are uniquely identified by the involved @emph{peers}, an
6248@emph{application id} and the @emph{operation type}.
6249
6250The client is notified of incoming set operations by @emph{set listeners}.
6251A set listener listens for incoming operations of a specific operation
6252type and application id.
6253Once notified of an incoming set request, the client can accept the set
6254request (providing a local set for the operation) or reject it.
6255
6256@node Result Elements
6257@subsection Result Elements
6258
6259@c %**end of header
6260
6261The SET service has three @emph{result modes} that determine how an
6262operation's result set is delivered to the client:
6263
6264@itemize @bullet
6265@item @strong{Full Result Set.} All elements of set resulting from the set
6266operation are returned to the client.
6267@item @strong{Added Elements.} Only elements that result from the
6268operation and are not already in the local peer's set are returned.
6269Note that for some operations (like set intersection) this result mode
6270will never return any elements.
6271This can be useful if only the remove peer is actually interested in
6272the result of the set operation.
6273@item @strong{Removed Elements.} Only elements that are in the local
6274peer's initial set but not in the operation's result set are returned.
6275Note that for some operations (like set union) this result mode will
6276never return any elements. This can be useful if only the remove peer is
6277actually interested in the result of the set operation.
6278@end itemize
6279
6280@cindex libgnunetset
6281@node libgnunetset
6282@subsection libgnunetset
6283
6284@c %**end of header
6285
6286@menu
6287* Sets::
6288* Listeners::
6289* Operations::
6290* Supplying a Set::
6291* The Result Callback::
6292@end menu
6293
6294@node Sets
6295@subsubsection Sets
6296
6297@c %**end of header
6298
6299New sets are created with @code{GNUNET_SET_create}. Both the local peer's
6300configuration (as each set has its own client connection) and the
6301operation type must be specified.
6302The set exists until either the client calls @code{GNUNET_SET_destroy} or
6303the client's connection to the service is disrupted.
6304In the latter case, the client is notified by the return value of
6305functions dealing with sets. This return value must always be checked.
6306
6307Elements are added and removed with @code{GNUNET_SET_add_element} and
6308@code{GNUNET_SET_remove_element}.
6309
6310@node Listeners
6311@subsubsection Listeners
6312
6313@c %**end of header
6314
6315Listeners are created with @code{GNUNET_SET_listen}. Each time time a
6316remote peer suggests a set operation with an application id and operation
6317type matching a listener, the listener's callback is invoked.
6318The client then must synchronously call either @code{GNUNET_SET_accept}
6319or @code{GNUNET_SET_reject}. Note that the operation will not be started
6320until the client calls @code{GNUNET_SET_commit}
6321(see Section "Supplying a Set").
6322
6323@node Operations
6324@subsubsection Operations
6325
6326@c %**end of header
6327
6328Operations to be initiated by the local peer are created with
6329@code{GNUNET_SET_prepare}. Note that the operation will not be started
6330until the client calls @code{GNUNET_SET_commit}
6331(see Section "Supplying a Set").
6332
6333@node Supplying a Set
6334@subsubsection Supplying a Set
6335
6336@c %**end of header
6337
6338To create symmetry between the two ways of starting a set operation
6339(accepting and nitiating it), the operation handles returned by
6340@code{GNUNET_SET_accept} and @code{GNUNET_SET_prepare} do not yet have a
6341set to operate on, thus they can not do any work yet.
6342
6343The client must call @code{GNUNET_SET_commit} to specify a set to use for
6344an operation. @code{GNUNET_SET_commit} may only be called once per set
6345operation.
6346
6347@node The Result Callback
6348@subsubsection The Result Callback
6349
6350@c %**end of header
6351
6352Clients must specify both a result mode and a result callback with
6353@code{GNUNET_SET_accept} and @code{GNUNET_SET_prepare}. The result
6354callback with a status indicating either that an element was received, or
6355the operation failed or succeeded.
6356The interpretation of the received element depends on the result mode.
6357The callback needs to know which result mode it is used in, as the
6358arguments do not indicate if an element is part of the full result set,
6359or if it is in the difference between the original set and the final set.
6360
6361@node The SET Client-Service Protocol
6362@subsection The SET Client-Service Protocol
6363
6364@c %**end of header
6365
6366@menu
6367* Creating Sets::
6368* Listeners2::
6369* Initiating Operations::
6370* Modifying Sets::
6371* Results and Operation Status::
6372* Iterating Sets::
6373@end menu
6374
6375@node Creating Sets
6376@subsubsection Creating Sets
6377
6378@c %**end of header
6379
6380For each set of a client, there exists a client connection to the service.
6381Sets are created by sending the @code{GNUNET_SERVICE_SET_CREATE} message
6382over a new client connection. Multiple operations for one set are
6383multiplexed over one client connection, using a request id supplied by
6384the client.
6385
6386@node Listeners2
6387@subsubsection Listeners2
6388
6389@c %**end of header
6390
6391Each listener also requires a seperate client connection. By sending the
6392@code{GNUNET_SERVICE_SET_LISTEN} message, the client notifies the service
6393of the application id and operation type it is interested in. A client
6394rejects an incoming request by sending @code{GNUNET_SERVICE_SET_REJECT}
6395on the listener's client connection.
6396In contrast, when accepting an incoming request, a
6397@code{GNUNET_SERVICE_SET_ACCEPT} message must be sent over the@ set that
6398is supplied for the set operation.
6399
6400@node Initiating Operations
6401@subsubsection Initiating Operations
6402
6403@c %**end of header
6404
6405Operations with remote peers are initiated by sending a
6406@code{GNUNET_SERVICE_SET_EVALUATE} message to the service. The@ client
6407connection that this message is sent by determines the set to use.
6408
6409@node Modifying Sets
6410@subsubsection Modifying Sets
6411
6412@c %**end of header
6413
6414Sets are modified with the @code{GNUNET_SERVICE_SET_ADD} and
6415@code{GNUNET_SERVICE_SET_REMOVE} messages.
6416
6417
6418@c %@menu
6419@c %* Results and Operation Status::
6420@c %* Iterating Sets::
6421@c %@end menu
6422
6423@node Results and Operation Status
6424@subsubsection Results and Operation Status
6425@c %**end of header
6426
6427The service notifies the client of result elements and success/failure of
6428a set operation with the @code{GNUNET_SERVICE_SET_RESULT} message.
6429
6430@node Iterating Sets
6431@subsubsection Iterating Sets
6432
6433@c %**end of header
6434
6435All elements of a set can be requested by sending
6436@code{GNUNET_SERVICE_SET_ITER_REQUEST}. The server responds with
6437@code{GNUNET_SERVICE_SET_ITER_ELEMENT} and eventually terminates the
6438iteration with @code{GNUNET_SERVICE_SET_ITER_DONE}.
6439After each received element, the client
6440must send @code{GNUNET_SERVICE_SET_ITER_ACK}. Note that only one set
6441iteration may be active for a set at any given time.
6442
6443@node The SET Intersection Peer-to-Peer Protocol
6444@subsection The SET Intersection Peer-to-Peer Protocol
6445
6446@c %**end of header
6447
6448The intersection protocol operates over CADET and starts with a
6449GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer
6450initiating the operation to the peer listening for inbound requests.
6451It includes the number of elements of the initiating peer, which is used
6452to decide which side will send a Bloom filter first.
6453
6454The listening peer checks if the operation type and application
6455identifier are acceptable for its current state.
6456If not, it responds with a GNUNET_MESSAGE_TYPE_SET_RESULT and a status of
6457GNUNET_SET_STATUS_FAILURE (and terminates the CADET channel).
6458
6459If the application accepts the request, the listener sends back a
6460@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO} if it has
6461more elements in the set than the client.
6462Otherwise, it immediately starts with the Bloom filter exchange.
6463If the initiator receives a
6464@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO} response,
6465it beings the Bloom filter exchange, unless the set size is indicated to
6466be zero, in which case the intersection is considered finished after
6467just the initial handshake.
6468
6469
6470@menu
6471* The Bloom filter exchange::
6472* Salt::
6473@end menu
6474
6475@node The Bloom filter exchange
6476@subsubsection The Bloom filter exchange
6477
6478@c %**end of header
6479
6480In this phase, each peer transmits a Bloom filter over the remaining
6481keys of the local set to the other peer using a
6482@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF} message. This
6483message additionally includes the number of elements left in the sender's
6484set, as well as the XOR over all of the keys in that set.
6485
6486The number of bits 'k' set per element in the Bloom filter is calculated
6487based on the relative size of the two sets.
6488Furthermore, the size of the Bloom filter is calculated based on 'k' and
6489the number of elements in the set to maximize the amount of data filtered
6490per byte transmitted on the wire (while avoiding an excessively high
6491number of iterations).
6492
6493The receiver of the message removes all elements from its local set that
6494do not pass the Bloom filter test.
6495It then checks if the set size of the sender and the XOR over the keys
6496match what is left of his own set. If they do, he sends a
6497@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_DONE} back to indicate
6498that the latest set is the final result.
6499Otherwise, the receiver starts another Bloom fitler exchange, except
6500this time as the sender.
6501
6502@node Salt
6503@subsubsection Salt
6504
6505@c %**end of header
6506
6507Bloomfilter operations are probablistic: With some non-zero probability
6508the test may incorrectly say an element is in the set, even though it is
6509not.
6510
6511To mitigate this problem, the intersection protocol iterates exchanging
6512Bloom filters using a different random 32-bit salt in each iteration (the
6513salt is also included in the message).
6514With different salts, set operations may fail for different elements.
6515Merging the results from the executions, the probability of failure drops
6516to zero.
6517
6518The iterations terminate once both peers have established that they have
6519sets of the same size, and where the XOR over all keys computes the same
6520512-bit value (leaving a failure probability of 2-511).
6521
6522@node The SET Union Peer-to-Peer Protocol
6523@subsection The SET Union Peer-to-Peer Protocol
6524
6525@c %**end of header
6526
6527The SET union protocol is based on Eppstein's efficient set reconciliation
6528without prior context. You should read this paper first if you want to
6529understand the protocol.
6530
6531The union protocol operates over CADET and starts with a
6532GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer
6533initiating the operation to the peer listening for inbound requests.
6534It includes the number of elements of the initiating peer, which is
6535currently not used.
6536
6537The listening peer checks if the operation type and application
6538identifier are acceptable for its current state. If not, it responds with
6539a @code{GNUNET_MESSAGE_TYPE_SET_RESULT} and a status of
6540@code{GNUNET_SET_STATUS_FAILURE} (and terminates the CADET channel).
6541
6542If the application accepts the request, it sends back a strata estimator
6543using a message of type GNUNET_MESSAGE_TYPE_SET_UNION_P2P_SE. The
6544initiator evaluates the strata estimator and initiates the exchange of
6545invertible Bloom filters, sending a GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
6546
6547During the IBF exchange, if the receiver cannot invert the Bloom filter or
6548detects a cycle, it sends a larger IBF in response (up to a defined
6549maximum limit; if that limit is reached, the operation fails).
6550Elements decoded while processing the IBF are transmitted to the other
6551peer using GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS, or requested from the
6552other peer using GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS messages,
6553depending on the sign observed during decoding of the IBF.
6554Peers respond to a GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS message
6555with the respective element in a GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS
6556message. If the IBF fully decodes, the peer responds with a
6557GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE message instead of another
6558GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
6559
6560All Bloom filter operations use a salt to mingle keys before hasing them
6561into buckets, such that future iterations have a fresh chance of
6562succeeding if they failed due to collisions before.
6563
6564@cindex STATISTICS subsystem
6565@node GNUnet's STATISTICS subsystem
6566@section GNUnet's STATISTICS subsystem
6567
6568@c %**end of header
6569
6570In GNUnet, the STATISTICS subsystem offers a central place for all
6571subsystems to publish unsigned 64-bit integer run-time statistics.
6572Keeping this information centrally means that there is a unified way for
6573the user to obtain data on all subsystems, and individual subsystems do
6574not have to always include a custom data export method for performance
6575metrics and other statistics. For example, the TRANSPORT system uses
6576STATISTICS to update information about the number of directly connected
6577peers and the bandwidth that has been consumed by the various plugins.
6578This information is valuable for diagnosing connectivity and performance
6579issues.
6580
6581Following the GNUnet service architecture, the STATISTICS subsystem is
6582divided into an API which is exposed through the header
6583@strong{gnunet_statistics_service.h} and the STATISTICS service
6584@strong{gnunet-service-statistics}. The @strong{gnunet-statistics}
6585command-line tool can be used to obtain (and change) information about
6586the values stored by the STATISTICS service. The STATISTICS service does
6587not communicate with other peers.
6588
6589Data is stored in the STATISTICS service in the form of tuples
6590@strong{(subsystem, name, value, persistence)}. The subsystem determines
6591to which other GNUnet's subsystem the data belongs. name is the name
6592through which value is associated. It uniquely identifies the record
6593from among other records belonging to the same subsystem.
6594In some parts of the code, the pair @strong{(subsystem, name)} is called
6595a @strong{statistic} as it identifies the values stored in the STATISTCS
6596service.The persistence flag determines if the record has to be preserved
6597across service restarts. A record is said to be persistent if this flag
6598is set for it; if not, the record is treated as a non-persistent record
6599and it is lost after service restart. Persistent records are written to
6600and read from the file @strong{statistics.data} before shutdown
6601and upon startup. The file is located in the HOME directory of the peer.
6602
6603An anomaly of the STATISTICS service is that it does not terminate
6604immediately upon receiving a shutdown signal if it has any clients
6605connected to it. It waits for all the clients that are not monitors to
6606close their connections before terminating itself.
6607This is to prevent the loss of data during peer shutdown --- delaying the
6608STATISTICS service shutdown helps other services to store important data
6609to STATISTICS during shutdown.
6610
6611@menu
6612* libgnunetstatistics::
6613* The STATISTICS Client-Service Protocol::
6614@end menu
6615
6616@cindex libgnunetstatistics
6617@node libgnunetstatistics
6618@subsection libgnunetstatistics
6619
6620@c %**end of header
6621
6622@strong{libgnunetstatistics} is the library containing the API for the
6623STATISTICS subsystem. Any process requiring to use STATISTICS should use
6624this API by to open a connection to the STATISTICS service.
6625This is done by calling the function @code{GNUNET_STATISTICS_create()}.
6626This function takes the subsystem's name which is trying to use STATISTICS
6627and a configuration.
6628All values written to STATISTICS with this connection will be placed in
6629the section corresponding to the given subsystem's name.
6630The connection to STATISTICS can be destroyed with the function
6631@code{GNUNET_STATISTICS_destroy()}. This function allows for the
6632connection to be destroyed immediately or upon transferring all
6633pending write requests to the service.
6634
6635Note: STATISTICS subsystem can be disabled by setting @code{DISABLE = YES}
6636under the @code{[STATISTICS]} section in the configuration. With such a
6637configuration all calls to @code{GNUNET_STATISTICS_create()} return
6638@code{NULL} as the STATISTICS subsystem is unavailable and no other
6639functions from the API can be used.
6640
6641
6642@menu
6643* Statistics retrieval::
6644* Setting statistics and updating them::
6645* Watches::
6646@end menu
6647
6648@node Statistics retrieval
6649@subsubsection Statistics retrieval
6650
6651@c %**end of header
6652
6653Once a connection to the statistics service is obtained, information
6654about any other system which uses statistics can be retrieved with the
6655function GNUNET_STATISTICS_get().
6656This function takes the connection handle, the name of the subsystem
6657whose information we are interested in (a @code{NULL} value will
6658retrieve information of all available subsystems using STATISTICS), the
6659name of the statistic we are interested in (a @code{NULL} value will
6660retrieve all available statistics), a continuation callback which is
6661called when all of requested information is retrieved, an iterator
6662callback which is called for each parameter in the retrieved information
6663and a closure for the aforementioned callbacks. The library then invokes
6664the iterator callback for each value matching the request.
6665
6666Call to @code{GNUNET_STATISTICS_get()} is asynchronous and can be
6667canceled with the function @code{GNUNET_STATISTICS_get_cancel()}.
6668This is helpful when retrieving statistics takes too long and especially
6669when we want to shutdown and cleanup everything.
6670
6671@node Setting statistics and updating them
6672@subsubsection Setting statistics and updating them
6673
6674@c %**end of header
6675
6676So far we have seen how to retrieve statistics, here we will learn how we
6677can set statistics and update them so that other subsystems can retrieve
6678them.
6679
6680A new statistic can be set using the function
6681@code{GNUNET_STATISTICS_set()}.
6682This function takes the name of the statistic and its value and a flag to
6683make the statistic persistent.
6684The value of the statistic should be of the type @code{uint64_t}.
6685The function does not take the name of the subsystem; it is determined
6686from the previous @code{GNUNET_STATISTICS_create()} invocation. If
6687the given statistic is already present, its value is overwritten.
6688
6689An existing statistics can be updated, i.e its value can be increased or
6690decreased by an amount with the function
6691@code{GNUNET_STATISTICS_update()}.
6692The parameters to this function are similar to
6693@code{GNUNET_STATISTICS_set()}, except that it takes the amount to be
6694changed as a type @code{int64_t} instead of the value.
6695
6696The library will combine multiple set or update operations into one
6697message if the client performs requests at a rate that is faster than the
6698available IPC with the STATISTICS service. Thus, the client does not have
6699to worry about sending requests too quickly.
6700
6701@node Watches
6702@subsubsection Watches
6703
6704@c %**end of header
6705
6706As interesting feature of STATISTICS lies in serving notifications
6707whenever a statistic of our interest is modified.
6708This is achieved by registering a watch through the function
6709@code{GNUNET_STATISTICS_watch()}.
6710The parameters of this function are similar to those of
6711@code{GNUNET_STATISTICS_get()}.
6712Changes to the respective statistic's value will then cause the given
6713iterator callback to be called.
6714Note: A watch can only be registered for a specific statistic. Hence
6715the subsystem name and the parameter name cannot be @code{NULL} in a
6716call to @code{GNUNET_STATISTICS_watch()}.
6717
6718A registered watch will keep notifying any value changes until
6719@code{GNUNET_STATISTICS_watch_cancel()} is called with the same
6720parameters that are used for registering the watch.
6721
6722@node The STATISTICS Client-Service Protocol
6723@subsection The STATISTICS Client-Service Protocol
6724@c %**end of header
6725
6726
6727@menu
6728* Statistics retrieval2::
6729* Setting and updating statistics::
6730* Watching for updates::
6731@end menu
6732
6733@node Statistics retrieval2
6734@subsubsection Statistics retrieval2
6735
6736@c %**end of header
6737
6738To retrieve statistics, the client transmits a message of type
6739@code{GNUNET_MESSAGE_TYPE_STATISTICS_GET} containing the given subsystem
6740name and statistic parameter to the STATISTICS service.
6741The service responds with a message of type
6742@code{GNUNET_MESSAGE_TYPE_STATISTICS_VALUE} for each of the statistics
6743parameters that match the client request for the client. The end of
6744information retrieved is signaled by the service by sending a message of
6745type @code{GNUNET_MESSAGE_TYPE_STATISTICS_END}.
6746
6747@node Setting and updating statistics
6748@subsubsection Setting and updating statistics
6749
6750@c %**end of header
6751
6752The subsystem name, parameter name, its value and the persistence flag are
6753communicated to the service through the message
6754@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}.
6755
6756When the service receives a message of type
6757@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}, it retrieves the subsystem
6758name and checks for a statistic parameter with matching the name given in
6759the message.
6760If a statistic parameter is found, the value is overwritten by the new
6761value from the message; if not found then a new statistic parameter is
6762created with the given name and value.
6763
6764In addition to just setting an absolute value, it is possible to perform a
6765relative update by sending a message of type
6766@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET} with an update flag
6767(@code{GNUNET_STATISTICS_SETFLAG_RELATIVE}) signifying that the value in
6768the message should be treated as an update value.
6769
6770@node Watching for updates
6771@subsubsection Watching for updates
6772
6773@c %**end of header
6774
6775The function registers the watch at the service by sending a message of
6776type @code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH}. The service then sends
6777notifications through messages of type
6778@code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE} whenever the statistic
6779parameter's value is changed.
6780
6781@cindex DHT
6782@cindex Distributed Hash Table
6783@node GNUnet's Distributed Hash Table (DHT)
6784@section GNUnet's Distributed Hash Table (DHT)
6785
6786@c %**end of header
6787
6788GNUnet includes a generic distributed hash table that can be used by
6789developers building P2P applications in the framework.
6790This section documents high-level features and how developers are
6791expected to use the DHT.
6792We have a research paper detailing how the DHT works.
6793Also, Nate's thesis includes a detailed description and performance
6794analysis (in chapter 6).
6795
6796Key features of GNUnet's DHT include:
6797
6798@itemize @bullet
6799@item stores key-value pairs with values up to (approximately) 63k in size
6800@item works with many underlay network topologies (small-world, random
6801graph), underlay does not need to be a full mesh / clique
6802@item support for extended queries (more than just a simple 'key'),
6803filtering duplicate replies within the network (bloomfilter) and content
6804validation (for details, please read the subsection on the block library)
6805@item can (optionally) return paths taken by the PUT and GET operations
6806to the application
6807@item provides content replication to handle churn
6808@end itemize
6809
6810GNUnet's DHT is randomized and unreliable. Unreliable means that there is
6811no strict guarantee that a value stored in the DHT is always
6812found --- values are only found with high probability.
6813While this is somewhat true in all P2P DHTs, GNUnet developers should be
6814particularly wary of this fact (this will help you write secure,
6815fault-tolerant code). Thus, when writing any application using the DHT,
6816you should always consider the possibility that a value stored in the
6817DHT by you or some other peer might simply not be returned, or returned
6818with a significant delay.
6819Your application logic must be written to tolerate this (naturally, some
6820loss of performance or quality of service is expected in this case).
6821
6822@menu
6823* Block library and plugins::
6824* libgnunetdht::
6825* The DHT Client-Service Protocol::
6826* The DHT Peer-to-Peer Protocol::
6827@end menu
6828
6829@node Block library and plugins
6830@subsection Block library and plugins
6831
6832@c %**end of header
6833
6834@menu
6835* What is a Block?::
6836* The API of libgnunetblock::
6837* Queries::
6838* Sample Code::
6839* Conclusion2::
6840@end menu
6841
6842@node What is a Block?
6843@subsubsection What is a Block?
6844
6845@c %**end of header
6846
6847Blocks are small (< 63k) pieces of data stored under a key (struct
6848GNUNET_HashCode). Blocks have a type (enum GNUNET_BlockType) which defines
6849their data format. Blocks are used in GNUnet as units of static data
6850exchanged between peers and stored (or cached) locally.
6851Uses of blocks include file-sharing (the files are broken up into blocks),
6852the VPN (DNS information is stored in blocks) and the DHT (all
6853information in the DHT and meta-information for the maintenance of the
6854DHT are both stored using blocks).
6855The block subsystem provides a few common functions that must be
6856available for any type of block.
6857
6858@cindex libgnunetblock API
6859@node The API of libgnunetblock
6860@subsubsection The API of libgnunetblock
6861
6862@c %**end of header
6863
6864The block library requires for each (family of) block type(s) a block
6865plugin (implementing @file{gnunet_block_plugin.h}) that provides basic
6866functions that are needed by the DHT (and possibly other subsystems) to
6867manage the block.
6868These block plugins are typically implemented within their respective
6869subsystems.
6870The main block library is then used to locate, load and query the
6871appropriate block plugin.
6872Which plugin is appropriate is determined by the block type (which is
6873just a 32-bit integer). Block plugins contain code that specifies which
6874block types are supported by a given plugin. The block library loads all
6875block plugins that are installed at the local peer and forwards the
6876application request to the respective plugin.
6877
6878The central functions of the block APIs (plugin and main library) are to
6879allow the mapping of blocks to their respective key (if possible) and the
6880ability to check that a block is well-formed and matches a given
6881request (again, if possible).
6882This way, GNUnet can avoid storing invalid blocks, storing blocks under
6883the wrong key and forwarding blocks in response to a query that they do
6884not answer.
6885
6886One key function of block plugins is that it allows GNUnet to detect
6887duplicate replies (via the Bloom filter). All plugins MUST support
6888detecting duplicate replies (by adding the current response to the
6889Bloom filter and rejecting it if it is encountered again).
6890If a plugin fails to do this, responses may loop in the network.
6891
6892@node Queries
6893@subsubsection Queries
6894@c %**end of header
6895
6896The query format for any block in GNUnet consists of four main components.
6897First, the type of the desired block must be specified. Second, the query
6898must contain a hash code. The hash code is used for lookups in hash
6899tables and databases and must not be unique for the block (however, if
6900possible a unique hash should be used as this would be best for
6901performance).
6902Third, an optional Bloom filter can be specified to exclude known results;
6903replies that hash to the bits set in the Bloom filter are considered
6904invalid. False-positives can be eliminated by sending the same query
6905again with a different Bloom filter mutator value, which parameterizes
6906the hash function that is used.
6907Finally, an optional application-specific "eXtended query" (xquery) can
6908be specified to further constrain the results. It is entirely up to
6909the type-specific plugin to determine whether or not a given block
6910matches a query (type, hash, Bloom filter, and xquery).
6911Naturally, not all xquery's are valid and some types of blocks may not
6912support Bloom filters either, so the plugin also needs to check if the
6913query is valid in the first place.
6914
6915Depending on the results from the plugin, the DHT will then discard the
6916(invalid) query, forward the query, discard the (invalid) reply, cache the
6917(valid) reply, and/or forward the (valid and non-duplicate) reply.
6918
6919@node Sample Code
6920@subsubsection Sample Code
6921
6922@c %**end of header
6923
6924The source code in @strong{plugin_block_test.c} is a good starting point
6925for new block plugins --- it does the minimal work by implementing a
6926plugin that performs no validation at all.
6927The respective @strong{Makefile.am} shows how to build and install a
6928block plugin.
6929
6930@node Conclusion2
6931@subsubsection Conclusion2
6932
6933@c %**end of header
6934
6935In conclusion, GNUnet subsystems that want to use the DHT need to define a
6936block format and write a plugin to match queries and replies. For testing,
6937the "@code{GNUNET_BLOCK_TYPE_TEST}" block type can be used; it accepts
6938any query as valid and any reply as matching any query.
6939This type is also used for the DHT command line tools.
6940However, it should NOT be used for normal applications due to the lack
6941of error checking that results from this primitive implementation.
6942
6943@cindex libgnunetdht
6944@node libgnunetdht
6945@subsection libgnunetdht
6946
6947@c %**end of header
6948
6949The DHT API itself is pretty simple and offers the usual GET and PUT
6950functions that work as expected. The specified block type refers to the
6951block library which allows the DHT to run application-specific logic for
6952data stored in the network.
6953
6954
6955@menu
6956* GET::
6957* PUT::
6958* MONITOR::
6959* DHT Routing Options::
6960@end menu
6961
6962@node GET
6963@subsubsection GET
6964
6965@c %**end of header
6966
6967When using GET, the main consideration for developers (other than the
6968block library) should be that after issuing a GET, the DHT will
6969continuously cause (small amounts of) network traffic until the operation
6970is explicitly canceled.
6971So GET does not simply send out a single network request once; instead,
6972the DHT will continue to search for data. This is needed to achieve good
6973success rates and also handles the case where the respective PUT
6974operation happens after the GET operation was started.
6975Developers should not cancel an existing GET operation and then
6976explicitly re-start it to trigger a new round of network requests;
6977this is simply inefficient, especially as the internal automated version
6978can be more efficient, for example by filtering results in the network
6979that have already been returned.
6980
6981If an application that performs a GET request has a set of replies that it
6982already knows and would like to filter, it can call@
6983@code{GNUNET_DHT_get_filter_known_results} with an array of hashes over
6984the respective blocks to tell the DHT that these results are not
6985desired (any more).
6986This way, the DHT will filter the respective blocks using the block
6987library in the network, which may result in a significant reduction in
6988bandwidth consumption.
6989
6990@node PUT
6991@subsubsection PUT
6992
6993@c %**end of header
6994
6995In contrast to GET operations, developers @strong{must} manually re-run
6996PUT operations periodically (if they intend the content to continue to be
6997available). Content stored in the DHT expires or might be lost due to
6998churn.
6999Furthermore, GNUnet's DHT typically requires multiple rounds of PUT
7000operations before a key-value pair is consistently available to all
7001peers (the DHT randomizes paths and thus storage locations, and only
7002after multiple rounds of PUTs there will be a sufficient number of
7003replicas in large DHTs). An explicit PUT operation using the DHT API will
7004only cause network traffic once, so in order to ensure basic availability
7005and resistance to churn (and adversaries), PUTs must be repeated.
7006While the exact frequency depends on the application, a rule of thumb is
7007that there should be at least a dozen PUT operations within the content
7008lifetime. Content in the DHT typically expires after one day, so
7009DHT PUT operations should be repeated at least every 1-2 hours.
7010
7011@node MONITOR
7012@subsubsection MONITOR
7013
7014@c %**end of header
7015
7016The DHT API also allows applications to monitor messages crossing the
7017local DHT service.
7018The types of messages used by the DHT are GET, PUT and RESULT messages.
7019Using the monitoring API, applications can choose to monitor these
7020requests, possibly limiting themselves to requests for a particular block
7021type.
7022
7023The monitoring API is not only usefu only for diagnostics, it can also be
7024used to trigger application operations based on PUT operations.
7025For example, an application may use PUTs to distribute work requests to
7026other peers.
7027The workers would then monitor for PUTs that give them work, instead of
7028looking for work using GET operations.
7029This can be beneficial, especially if the workers have no good way to
7030guess the keys under which work would be stored.
7031Naturally, additional protocols might be needed to ensure that the desired
7032number of workers will process the distributed workload.
7033
7034@node DHT Routing Options
7035@subsubsection DHT Routing Options
7036
7037@c %**end of header
7038
7039There are two important options for GET and PUT requests:
7040
7041@table @asis
7042@item GNUNET_DHT_RO_DEMULITPLEX_EVERYWHERE This option means that all
7043peers should process the request, even if their peer ID is not closest to
7044the key. For a PUT request, this means that all peers that a request
7045traverses may make a copy of the data.
7046Similarly for a GET request, all peers will check their local database
7047for a result. Setting this option can thus significantly improve caching
7048and reduce bandwidth consumption --- at the expense of a larger DHT
7049database. If in doubt, we recommend that this option should be used.
7050@item GNUNET_DHT_RO_RECORD_ROUTE This option instructs the DHT to record
7051the path that a GET or a PUT request is taking through the overlay
7052network. The resulting paths are then returned to the application with
7053the respective result. This allows the receiver of a result to construct
7054a path to the originator of the data, which might then be used for
7055routing. Naturally, setting this option requires additional bandwidth
7056and disk space, so applications should only set this if the paths are
7057needed by the application logic.
7058@item GNUNET_DHT_RO_FIND_PEER This option is an internal option used by
7059the DHT's peer discovery mechanism and should not be used by applications.
7060@item GNUNET_DHT_RO_BART This option is currently not implemented. It may
7061in the future offer performance improvements for clique topologies.
7062@end table
7063
7064@node The DHT Client-Service Protocol
7065@subsection The DHT Client-Service Protocol
7066
7067@c %**end of header
7068
7069@menu
7070* PUTting data into the DHT::
7071* GETting data from the DHT::
7072* Monitoring the DHT::
7073@end menu
7074
7075@node PUTting data into the DHT
7076@subsubsection PUTting data into the DHT
7077
7078@c %**end of header
7079
7080To store (PUT) data into the DHT, the client sends a
7081@code{struct GNUNET_DHT_ClientPutMessage} to the service.
7082This message specifies the block type, routing options, the desired
7083replication level, the expiration time, key,
7084value and a 64-bit unique ID for the operation. The service responds with
7085a @code{struct GNUNET_DHT_ClientPutConfirmationMessage} with the same
708664-bit unique ID. Note that the service sends the confirmation as soon as
7087it has locally processed the PUT request. The PUT may still be
7088propagating through the network at this time.
7089
7090In the future, we may want to change this to provide (limited) feedback
7091to the client, for example if we detect that the PUT operation had no
7092effect because the same key-value pair was already stored in the DHT.
7093However, changing this would also require additional state and messages
7094in the P2P interaction.
7095
7096@node GETting data from the DHT
7097@subsubsection GETting data from the DHT
7098
7099@c %**end of header
7100
7101To retrieve (GET) data from the DHT, the client sends a
7102@code{struct GNUNET_DHT_ClientGetMessage} to the service. The message
7103specifies routing options, a replication level (for replicating the GET,
7104not the content), the desired block type, the key, the (optional)
7105extended query and unique 64-bit request ID.
7106
7107Additionally, the client may send any number of
7108@code{struct GNUNET_DHT_ClientGetResultSeenMessage}s to notify the
7109service about results that the client is already aware of.
7110These messages consist of the key, the unique 64-bit ID of the request,
7111and an arbitrary number of hash codes over the blocks that the client is
7112already aware of. As messages are restricted to 64k, a client that
7113already knows more than about a thousand blocks may need to send
7114several of these messages. Naturally, the client should transmit these
7115messages as quickly as possible after the original GET request such that
7116the DHT can filter those results in the network early on. Naturally, as
7117these messages are send after the original request, it is conceivalbe
7118that the DHT service may return blocks that match those already known
7119to the client anyway.
7120
7121In response to a GET request, the service will send @code{struct
7122GNUNET_DHT_ClientResultMessage}s to the client. These messages contain the
7123block type, expiration, key, unique ID of the request and of course the
7124value (a block). Depending on the options set for the respective
7125operations, the replies may also contain the path the GET and/or the PUT
7126took through the network.
7127
7128A client can stop receiving replies either by disconnecting or by sending
7129a @code{struct GNUNET_DHT_ClientGetStopMessage} which must contain the
7130key and the 64-bit unique ID of the original request. Using an
7131explicit "stop" message is more common as this allows a client to run
7132many concurrent GET operations over the same connection with the DHT
7133service --- and to stop them individually.
7134
7135@node Monitoring the DHT
7136@subsubsection Monitoring the DHT
7137
7138@c %**end of header
7139
7140To begin monitoring, the client sends a
7141@code{struct GNUNET_DHT_MonitorStartStop} message to the DHT service.
7142In this message, flags can be set to enable (or disable) monitoring of
7143GET, PUT and RESULT messages that pass through a peer. The message can
7144also restrict monitoring to a particular block type or a particular key.
7145Once monitoring is enabled, the DHT service will notify the client about
7146any matching event using @code{struct GNUNET_DHT_MonitorGetMessage}s for
7147GET events, @code{struct GNUNET_DHT_MonitorPutMessage} for PUT events
7148and @code{struct GNUNET_DHT_MonitorGetRespMessage} for RESULTs. Each of
7149these messages contains all of the information about the event.
7150
7151@node The DHT Peer-to-Peer Protocol
7152@subsection The DHT Peer-to-Peer Protocol
7153@c %**end of header
7154
7155
7156@menu
7157* Routing GETs or PUTs::
7158* PUTting data into the DHT2::
7159* GETting data from the DHT2::
7160@end menu
7161
7162@node Routing GETs or PUTs
7163@subsubsection Routing GETs or PUTs
7164
7165@c %**end of header
7166
7167When routing GETs or PUTs, the DHT service selects a suitable subset of
7168neighbours for forwarding. The exact number of neighbours can be zero or
7169more and depends on the hop counter of the query (initially zero) in
7170relation to the (log of) the network size estimate, the desired
7171replication level and the peer's connectivity.
7172Depending on the hop counter and our network size estimate, the selection
7173of the peers maybe randomized or by proximity to the key.
7174Furthermore, requests include a set of peers that a request has already
7175traversed; those peers are also excluded from the selection.
7176
7177@node PUTting data into the DHT2
7178@subsubsection PUTting data into the DHT2
7179
7180@c %**end of header
7181
7182To PUT data into the DHT, the service sends a @code{struct PeerPutMessage}
7183of type @code{GNUNET_MESSAGE_TYPE_DHT_P2P_PUT} to the respective
7184neighbour.
7185In addition to the usual information about the content (type, routing
7186options, desired replication level for the content, expiration time, key
7187and value), the message contains a fixed-size Bloom filter with
7188information about which peers (may) have already seen this request.
7189This Bloom filter is used to ensure that DHT messages never loop back to
7190a peer that has already processed the request.
7191Additionally, the message includes the current hop counter and, depending
7192on the routing options, the message may include the full path that the
7193message has taken so far.
7194The Bloom filter should already contain the identity of the previous hop;
7195however, the path should not include the identity of the previous hop and
7196the receiver should append the identity of the sender to the path, not
7197its own identity (this is done to reduce bandwidth).
7198
7199@node GETting data from the DHT2
7200@subsubsection GETting data from the DHT2
7201
7202@c %**end of header
7203
7204A peer can search the DHT by sending @code{struct PeerGetMessage}s of type
7205@code{GNUNET_MESSAGE_TYPE_DHT_P2P_GET} to other peers. In addition to the
7206usual information about the request (type, routing options, desired
7207replication level for the request, the key and the extended query), a GET
7208request also again contains a hop counter, a Bloom filter over the peers
7209that have processed the request already and depending on the routing
7210options the full path traversed by the GET.
7211Finally, a GET request includes a variable-size second Bloom filter and a
7212so-called Bloom filter mutator value which together indicate which
7213replies the sender has already seen. During the lookup, each block that
7214matches they block type, key and extended query is additionally subjected
7215to a test against this Bloom filter.
7216The block plugin is expected to take the hash of the block and combine it
7217with the mutator value and check if the result is not yet in the Bloom
7218filter. The originator of the query will from time to time modify the
7219mutator to (eventually) allow false-positives filtered by the Bloom filter
7220to be returned.
7221
7222Peers that receive a GET request perform a local lookup (depending on
7223their proximity to the key and the query options) and forward the request
7224to other peers.
7225They then remember the request (including the Bloom filter for blocking
7226duplicate results) and when they obtain a matching, non-filtered response
7227a @code{struct PeerResultMessage} of type
7228@code{GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT} is forwarded to the previous
7229hop.
7230Whenver a result is forwarded, the block plugin is used to update the
7231Bloom filter accordingly, to ensure that the same result is never
7232forwarded more than once.
7233The DHT service may also cache forwarded results locally if the
7234"CACHE_RESULTS" option is set to "YES" in the configuration.
7235
7236@node The GNU Name System (GNS)
7237@section The GNU Name System (GNS)
7238
7239@c %**end of header
7240
7241The GNU Name System (GNS) is a decentralized database that enables users
7242to securely resolve names to values.
7243Names can be used to identify other users (for example, in social
7244networking), or network services (for example, VPN services running at a
7245peer in GNUnet, or purely IP-based services on the Internet).
7246Users interact with GNS by typing in a hostname that ends in ".gnu"
7247or ".zkey".
7248
7249Videos giving an overview of most of the GNS and the motivations behind
7250it is available here and here.
7251The remainder of this chapter targets developers that are familiar with
7252high level concepts of GNS as presented in these talks.
7253@c TODO: Add links to here and here and to these.
7254
7255GNS-aware applications should use the GNS resolver to obtain the
7256respective records that are stored under that name in GNS.
7257Each record consists of a type, value, expiration time and flags.
7258
7259The type specifies the format of the value. Types below 65536 correspond
7260to DNS record types, larger values are used for GNS-specific records.
7261Applications can define new GNS record types by reserving a number and
7262implementing a plugin (which mostly needs to convert the binary value
7263representation to a human-readable text format and vice-versa).
7264The expiration time specifies how long the record is to be valid.
7265The GNS API ensures that applications are only given non-expired values.
7266The flags are typically irrelevant for applications, as GNS uses them
7267internally to control visibility and validity of records.
7268
7269Records are stored along with a signature.
7270The signature is generated using the private key of the authoritative
7271zone. This allows any GNS resolver to verify the correctness of a
7272name-value mapping.
7273
7274Internally, GNS uses the NAMECACHE to cache information obtained from
7275other users, the NAMESTORE to store information specific to the local
7276users, and the DHT to exchange data between users.
7277A plugin API is used to enable applications to define new GNS
7278record types.
7279
7280@menu
7281* libgnunetgns::
7282* libgnunetgnsrecord::
7283* GNS plugins::
7284* The GNS Client-Service Protocol::
7285* Hijacking the DNS-Traffic using gnunet-service-dns::
7286* Serving DNS lookups via GNS on W32::
7287@end menu
7288
7289@node libgnunetgns
7290@subsection libgnunetgns
7291
7292@c %**end of header
7293
7294The GNS API itself is extremely simple. Clients first connec to the
7295GNS service using @code{GNUNET_GNS_connect}.
7296They can then perform lookups using @code{GNUNET_GNS_lookup} or cancel
7297pending lookups using @code{GNUNET_GNS_lookup_cancel}.
7298Once finished, clients disconnect using @code{GNUNET_GNS_disconnect}.
7299
7300@menu
7301* Looking up records::
7302* Accessing the records::
7303* Creating records::
7304* Future work::
7305@end menu
7306
7307@node Looking up records
7308@subsubsection Looking up records
7309
7310@c %**end of header
7311
7312@code{GNUNET_GNS_lookup} takes a number of arguments:
7313
7314@table @asis
7315@item handle This is simply the GNS connection handle from
7316@code{GNUNET_GNS_connect}.
7317@item name The client needs to specify the name to
7318be resolved. This can be any valid DNS or GNS hostname.
7319@item zone The client
7320needs to specify the public key of the GNS zone against which the
7321resolution should be done (the ".gnu" zone).
7322Note that a key must be provided, even if the name ends in ".zkey".
7323This should typically be the public key of the master-zone of the user.
7324@item type This is the desired GNS or DNS record type
7325to look for. While all records for the given name will be returned, this
7326can be important if the client wants to resolve record types that
7327themselves delegate resolution, such as CNAME, PKEY or GNS2DNS.
7328Resolving a record of any of these types will only work if the respective
7329record type is specified in the request, as the GNS resolver will
7330otherwise follow the delegation and return the records from the
7331respective destination, instead of the delegating record.
7332@item only_cached This argument should typically be set to
7333@code{GNUNET_NO}. Setting it to @code{GNUNET_YES} disables resolution via
7334the overlay network.
7335@item shorten_zone_key If GNS encounters new names during resolution,
7336their respective zones can automatically be learned and added to the
7337"shorten zone". If this is desired, clients must pass the private key of
7338the shorten zone. If NULL is passed, shortening is disabled.
7339@item proc This argument identifies
7340the function to call with the result. It is given proc_cls, the number of
7341records found (possilby zero) and the array of the records as arguments.
7342proc will only be called once. After proc,> has been called, the lookup
7343must no longer be cancelled.
7344@item proc_cls The closure for proc.
7345@end table
7346
7347@node Accessing the records
7348@subsubsection Accessing the records
7349
7350@c %**end of header
7351
7352The @code{libgnunetgnsrecord} library provides an API to manipulate the
7353GNS record array that is given to proc. In particular, it offers
7354functions such as converting record values to human-readable
7355strings (and back). However, most @code{libgnunetgnsrecord} functions are
7356not interesting to GNS client applications.
7357
7358For DNS records, the @code{libgnunetdnsparser} library provides
7359functions for parsing (and serializing) common types of DNS records.
7360
7361@node Creating records
7362@subsubsection Creating records
7363
7364@c %**end of header
7365
7366Creating GNS records is typically done by building the respective record
7367information (possibly with the help of @code{libgnunetgnsrecord} and
7368@code{libgnunetdnsparser}) and then using the @code{libgnunetnamestore} to
7369publish the information. The GNS API is not involved in this
7370operation.
7371
7372@node Future work
7373@subsubsection Future work
7374
7375@c %**end of header
7376
7377In the future, we want to expand @code{libgnunetgns} to allow
7378applications to observe shortening operations performed during GNS
7379resolution, for example so that users can receive visual feedback when
7380this happens.
7381
7382@node libgnunetgnsrecord
7383@subsection libgnunetgnsrecord
7384
7385@c %**end of header
7386
7387The @code{libgnunetgnsrecord} library is used to manipulate GNS
7388records (in plaintext or in their encrypted format).
7389Applications mostly interact with @code{libgnunetgnsrecord} by using the
7390functions to convert GNS record values to strings or vice-versa, or to
7391lookup a GNS record type number by name (or vice-versa).
7392The library also provides various other functions that are mostly
7393used internally within GNS, such as converting keys to names, checking for
7394expiration, encrypting GNS records to GNS blocks, verifying GNS block
7395signatures and decrypting GNS records from GNS blocks.
7396
7397We will now discuss the four commonly used functions of the API.@
7398@code{libgnunetgnsrecord} does not perform these operations itself,
7399but instead uses plugins to perform the operation.
7400GNUnet includes plugins to support common DNS record types as well as
7401standard GNS record types.
7402
7403@menu
7404* Value handling::
7405* Type handling::
7406@end menu
7407
7408@node Value handling
7409@subsubsection Value handling
7410
7411@c %**end of header
7412
7413@code{GNUNET_GNSRECORD_value_to_string} can be used to convert
7414the (binary) representation of a GNS record value to a human readable,
74150-terminated UTF-8 string.
7416NULL is returned if the specified record type is not supported by any
7417available plugin.
7418
7419@code{GNUNET_GNSRECORD_string_to_value} can be used to try to convert a
7420human readable string to the respective (binary) representation of
7421a GNS record value.
7422
7423@node Type handling
7424@subsubsection Type handling
7425
7426@c %**end of header
7427
7428@code{GNUNET_GNSRECORD_typename_to_number} can be used to obtain the
7429numeric value associated with a given typename. For example, given the
7430typename "A" (for DNS A reocrds), the function will return the number 1.
7431A list of common DNS record types is
7432@uref{http://en.wikipedia.org/wiki/List_of_DNS_record_types, here}.
7433Note that not all DNS record types are supported by GNUnet GNSRECORD
7434plugins at this time.
7435
7436@code{GNUNET_GNSRECORD_number_to_typename} can be used to obtain the
7437typename associated with a given numeric value.
7438For example, given the type number 1, the function will return the
7439typename "A".
7440
7441@node GNS plugins
7442@subsection GNS plugins
7443
7444@c %**end of header
7445
7446Adding a new GNS record type typically involves writing (or extending) a
7447GNSRECORD plugin. The plugin needs to implement the
7448@code{gnunet_gnsrecord_plugin.h} API which provides basic functions that
7449are needed by GNSRECORD to convert typenames and values of the respective
7450record type to strings (and back).
7451These gnsrecord plugins are typically implemented within their respective
7452subsystems.
7453Examples for such plugins can be found in the GNSRECORD, GNS and
7454CONVERSATION subsystems.
7455
7456The @code{libgnunetgnsrecord} library is then used to locate, load and
7457query the appropriate gnsrecord plugin.
7458Which plugin is appropriate is determined by the record type (which is
7459just a 32-bit integer). The @code{libgnunetgnsrecord} library loads all
7460block plugins that are installed at the local peer and forwards the
7461application request to the plugins. If the record type is not
7462supported by the plugin, it should simply return an error code.
7463
7464The central functions of the block APIs (plugin and main library) are the
7465same four functions for converting between values and strings, and
7466typenames and numbers documented in the previous subsection.
7467
7468@node The GNS Client-Service Protocol
7469@subsection The GNS Client-Service Protocol
7470@c %**end of header
7471
7472The GNS client-service protocol consists of two simple messages, the
7473@code{LOOKUP} message and the @code{LOOKUP_RESULT}. Each @code{LOOKUP}
7474message contains a unique 32-bit identifier, which will be included in the
7475corresponding response. Thus, clients can send many lookup requests in
7476parallel and receive responses out-of-order.
7477A @code{LOOKUP} request also includes the public key of the GNS zone,
7478the desired record type and fields specifying whether shortening is
7479enabled or networking is disabled. Finally, the @code{LOOKUP} message
7480includes the name to be resolved.
7481
7482The response includes the number of records and the records themselves
7483in the format created by @code{GNUNET_GNSRECORD_records_serialize}.
7484They can thus be deserialized using
7485@code{GNUNET_GNSRECORD_records_deserialize}.
7486
7487@node Hijacking the DNS-Traffic using gnunet-service-dns
7488@subsection Hijacking the DNS-Traffic using gnunet-service-dns
7489
7490@c %**end of header
7491
7492This section documents how the gnunet-service-dns (and the
7493gnunet-helper-dns) intercepts DNS queries from the local system.
7494This is merely one method for how we can obtain GNS queries.
7495It is also possible to change @code{resolv.conf} to point to a machine
7496running @code{gnunet-dns2gns} or to modify libc's name system switch
7497(NSS) configuration to include a GNS resolution plugin.
7498The method described in this chaper is more of a last-ditch catch-all
7499approach.
7500
7501@code{gnunet-service-dns} enables intercepting DNS traffic using policy
7502based routing.
7503We MARK every outgoing DNS-packet if it was not sent by our application.
7504Using a second routing table in the Linux kernel these marked packets are
7505then routed through our virtual network interface and can thus be
7506captured unchanged.
7507
7508Our application then reads the query and decides how to handle it: A
7509query to an address ending in ".gnu" or ".zkey" is hijacked by
7510@code{gnunet-service-gns} and resolved internally using GNS.
7511In the future, a reverse query for an address of the configured virtual
7512network could be answered with records kept about previous forward
7513queries.
7514Queries that are not hijacked by some application using the DNS service
7515will be sent to the original recipient.
7516The answer to the query will always be sent back through the virtual
7517interface with the original nameserver as source address.
7518
7519
7520@menu
7521* Network Setup Details::
7522@end menu
7523
7524@node Network Setup Details
7525@subsubsection Network Setup Details
7526
7527@c %**end of header
7528
7529The DNS interceptor adds the following rules to the Linux kernel:
7530@example
7531iptables -t mangle -I OUTPUT 1 -p udp --sport $LOCALPORT --dport 53 \
7532-j ACCEPT iptables -t mangle -I OUTPUT 2 -p udp --dport 53 -j MARK \
7533--set-mark 3 ip rule add fwmark 3 table2 ip route add default via \
7534$VIRTUALDNS table2
7535@end example
7536
7537@c FIXME: Rewrite to reflect display which is no longer content by line
7538@c FIXME: due to the < 74 characters limit.
7539Line 1 makes sure that all packets coming from a port our application
7540opened beforehand (@code{$LOCALPORT}) will be routed normally.
7541Line 2 marks every other packet to a DNS-Server with mark 3 (chosen
7542arbitrarily). The third line adds a routing policy based on this mark
75433 via the routing table.
7544
7545@node Serving DNS lookups via GNS on W32
7546@subsection Serving DNS lookups via GNS on W32
7547
7548@c %**end of header
7549
7550This section documents how the libw32nsp (and
7551gnunet-gns-helper-service-w32) do DNS resolutions of DNS queries on the
7552local system. This only applies to GNUnet running on W32.
7553
7554W32 has a concept of "Namespaces" and "Namespace providers".
7555These are used to present various name systems to applications in a
7556generic way.
7557Namespaces include DNS, mDNS, NLA and others. For each namespace any
7558number of providers could be registered, and they are queried in an order
7559of priority (which is adjustable).
7560
7561Applications can resolve names by using WSALookupService*() family of
7562functions.
7563
7564However, these are WSA-only facilities. Common BSD socket functions for
7565namespace resolutions are gethostbyname and getaddrinfo (among others).
7566These functions are implemented internally (by default - by mswsock,
7567which also implements the default DNS provider) as wrappers around
7568WSALookupService*() functions (see "Sample Code for a Service Provider"
7569on MSDN).
7570
7571On W32 GNUnet builds a libw32nsp - a namespace provider, which can then be
7572installed into the system by using w32nsp-install (and uninstalled by
7573w32nsp-uninstall), as described in "Installation Handbook".
7574
7575libw32nsp is very simple and has almost no dependencies. As a response to
7576NSPLookupServiceBegin(), it only checks that the provider GUID passed to
7577it by the caller matches GNUnet DNS Provider GUID, checks that name being
7578resolved ends in ".gnu" or ".zkey", then connects to
7579gnunet-gns-helper-service-w32 at 127.0.0.1:5353 (hardcoded) and sends the
7580name resolution request there, returning the connected socket to the
7581caller.
7582
7583When the caller invokes NSPLookupServiceNext(), libw32nsp reads a
7584completely formed reply from that socket, unmarshalls it, then gives
7585it back to the caller.
7586
7587At the moment gnunet-gns-helper-service-w32 is implemented to ever give
7588only one reply, and subsequent calls to NSPLookupServiceNext() will fail
7589with WSA_NODATA (first call to NSPLookupServiceNext() might also fail if
7590GNS failed to find the name, or there was an error connecting to it).
7591
7592gnunet-gns-helper-service-w32 does most of the processing:
7593
7594@itemize @bullet
7595@item Maintains a connection to GNS.
7596@item Reads GNS config and loads appropriate keys.
7597@item Checks service GUID and decides on the type of record to look up,
7598refusing to make a lookup outright when unsupported service GUID is
7599passed.
7600@item Launches the lookup
7601@end itemize
7602
7603When lookup result arrives, gnunet-gns-helper-service-w32 forms a complete
7604reply (including filling a WSAQUERYSETW structure and, possibly, a binary
7605blob with a hostent structure for gethostbyname() client), marshalls it,
7606and sends it back to libw32nsp. If no records were found, it sends an
7607empty header.
7608
7609This works for most normal applications that use gethostbyname() or
7610getaddrinfo() to resolve names, but fails to do anything with
7611applications that use alternative means of resolving names (such as
7612sending queries to a DNS server directly by themselves).
7613This includes some of well known utilities, like "ping" and "nslookup".
7614
7615@node The GNS Namecache
7616@section The GNS Namecache
7617
7618@c %**end of header
7619
7620The NAMECACHE subsystem is responsible for caching (encrypted) resolution
7621results of the GNU Name System (GNS). GNS makes zone information available
7622to other users via the DHT. However, as accessing the DHT for every
7623lookup is expensive (and as the DHT's local cache is lost whenever the
7624peer is restarted), GNS uses the NAMECACHE as a more persistent cache for
7625DHT lookups.
7626Thus, instead of always looking up every name in the DHT, GNS first
7627checks if the result is already available locally in the NAMECACHE.
7628Only if there is no result in the NAMECACHE, GNS queries the DHT.
7629The NAMECACHE stores data in the same (encrypted) format as the DHT.
7630It thus makes no sense to iterate over all items in the
7631NAMECACHE --- the NAMECACHE does not have a way to provide the keys
7632required to decrypt the entries.
7633
7634Blocks in the NAMECACHE share the same expiration mechanism as blocks in
7635the DHT --- the block expires wheneever any of the records in
7636the (encrypted) block expires.
7637The expiration time of the block is the only information stored in
7638plaintext. The NAMECACHE service internally performs all of the required
7639work to expire blocks, clients do not have to worry about this.
7640Also, given that NAMECACHE stores only GNS blocks that local users
7641requested, there is no configuration option to limit the size of the
7642NAMECACHE. It is assumed to be always small enough (a few MB) to fit on
7643the drive.
7644
7645The NAMECACHE supports the use of different database backends via a
7646plugin API.
7647
7648@menu
7649* libgnunetnamecache::
7650* The NAMECACHE Client-Service Protocol::
7651* The NAMECACHE Plugin API::
7652@end menu
7653
7654@node libgnunetnamecache
7655@subsection libgnunetnamecache
7656
7657@c %**end of header
7658
7659The NAMECACHE API consists of five simple functions. First, there is
7660@code{GNUNET_NAMECACHE_connect} to connect to the NAMECACHE service.
7661This returns the handle required for all other operations on the
7662NAMECACHE. Using @code{GNUNET_NAMECACHE_block_cache} clients can insert a
7663block into the cache.
7664@code{GNUNET_NAMECACHE_lookup_block} can be used to lookup blocks that
7665were stored in the NAMECACHE. Both operations can be cancelled using
7666@code{GNUNET_NAMECACHE_cancel}. Note that cancelling a
7667@code{GNUNET_NAMECACHE_block_cache} operation can result in the block
7668being stored in the NAMECACHE --- or not. Cancellation primarily ensures
7669that the continuation function with the result of the operation will no
7670longer be invoked.
7671Finally, @code{GNUNET_NAMECACHE_disconnect} closes the connection to the
7672NAMECACHE.
7673
7674The maximum size of a block that can be stored in the NAMECACHE is
7675@code{GNUNET_NAMECACHE_MAX_VALUE_SIZE}, which is defined to be 63 kB.
7676
7677@node The NAMECACHE Client-Service Protocol
7678@subsection The NAMECACHE Client-Service Protocol
7679
7680@c %**end of header
7681
7682All messages in the NAMECACHE IPC protocol start with the
7683@code{struct GNUNET_NAMECACHE_Header} which adds a request
7684ID (32-bit integer) to the standard message header.
7685The request ID is used to match requests with the
7686respective responses from the NAMECACHE, as they are allowed to happen
7687out-of-order.
7688
7689
7690@menu
7691* Lookup::
7692* Store::
7693@end menu
7694
7695@node Lookup
7696@subsubsection Lookup
7697
7698@c %**end of header
7699
7700The @code{struct LookupBlockMessage} is used to lookup a block stored in
7701the cache.
7702It contains the query hash. The NAMECACHE always responds with a
7703@code{struct LookupBlockResponseMessage}. If the NAMECACHE has no
7704response, it sets the expiration time in the response to zero.
7705Otherwise, the response is expected to contain the expiration time, the
7706ECDSA signature, the derived key and the (variable-size) encrypted data
7707of the block.
7708
7709@node Store
7710@subsubsection Store
7711
7712@c %**end of header
7713
7714The @code{struct BlockCacheMessage} is used to cache a block in the
7715NAMECACHE.
7716It has the same structure as the @code{struct LookupBlockResponseMessage}.
7717The service responds with a @code{struct BlockCacheResponseMessage} which
7718contains the result of the operation (success or failure).
7719In the future, we might want to make it possible to provide an error
7720message as well.
7721
7722@node The NAMECACHE Plugin API
7723@subsection The NAMECACHE Plugin API
7724@c %**end of header
7725
7726The NAMECACHE plugin API consists of two functions, @code{cache_block} to
7727store a block in the database, and @code{lookup_block} to lookup a block
7728in the database.
7729
7730
7731@menu
7732* Lookup2::
7733* Store2::
7734@end menu
7735
7736@node Lookup2
7737@subsubsection Lookup2
7738
7739@c %**end of header
7740
7741The @code{lookup_block} function is expected to return at most one block
7742to the iterator, and return @code{GNUNET_NO} if there were no non-expired
7743results.
7744If there are multiple non-expired results in the cache, the lookup is
7745supposed to return the result with the largest expiration time.
7746
7747@node Store2
7748@subsubsection Store2
7749
7750@c %**end of header
7751
7752The @code{cache_block} function is expected to try to store the block in
7753the database, and return @code{GNUNET_SYSERR} if this was not possible
7754for any reason.
7755Furthermore, @code{cache_block} is expected to implicitly perform cache
7756maintenance and purge blocks from the cache that have expired. Note that
7757@code{cache_block} might encounter the case where the database already has
7758another block stored under the same key. In this case, the plugin must
7759ensure that the block with the larger expiration time is preserved.
7760Obviously, this can done either by simply adding new blocks and selecting
7761for the most recent expiration time during lookup, or by checking which
7762block is more recent during the store operation.
7763
7764@node The REVOCATION Subsystem
7765@section The REVOCATION Subsystem
7766@c %**end of header
7767
7768The REVOCATION subsystem is responsible for key revocation of Egos.
7769If a user learns that theis private key has been compromised or has lost
7770it, they can use the REVOCATION system to inform all of the other users
7771that their private key is no longer valid.
7772The subsystem thus includes ways to query for the validity of keys and to
7773propagate revocation messages.
7774
7775@menu
7776* Dissemination::
7777* Revocation Message Design Requirements::
7778* libgnunetrevocation::
7779* The REVOCATION Client-Service Protocol::
7780* The REVOCATION Peer-to-Peer Protocol::
7781@end menu
7782
7783@node Dissemination
7784@subsection Dissemination
7785
7786@c %**end of header
7787
7788When a revocation is performed, the revocation is first of all
7789disseminated by flooding the overlay network.
7790The goal is to reach every peer, so that when a peer needs to check if a
7791key has been revoked, this will be purely a local operation where the
7792peer looks at his local revocation list. Flooding the network is also the
7793most robust form of key revocation --- an adversary would have to control
7794a separator of the overlay graph to restrict the propagation of the
7795revocation message. Flooding is also very easy to implement --- peers that
7796receive a revocation message for a key that they have never seen before
7797simply pass the message to all of their neighbours.
7798
7799Flooding can only distribute the revocation message to peers that are
7800online.
7801In order to notify peers that join the network later, the revocation
7802service performs efficient set reconciliation over the sets of known
7803revocation messages whenever two peers (that both support REVOCATION
7804dissemination) connect.
7805The SET service is used to perform this operation efficiently.
7806
7807@node Revocation Message Design Requirements
7808@subsection Revocation Message Design Requirements
7809
7810@c %**end of header
7811
7812However, flooding is also quite costly, creating O(|E|) messages on a
7813network with |E| edges.
7814Thus, revocation messages are required to contain a proof-of-work, the
7815result of an expensive computation (which, however, is cheap to verify).
7816Only peers that have expended the CPU time necessary to provide
7817this proof will be able to flood the network with the revocation message.
7818This ensures that an attacker cannot simply flood the network with
7819millions of revocation messages. The proof-of-work required by GNUnet is
7820set to take days on a typical PC to compute; if the ability to quickly
7821revoke a key is needed, users have the option to pre-compute revocation
7822messages to store off-line and use instantly after their key has expired.
7823
7824Revocation messages must also be signed by the private key that is being
7825revoked. Thus, they can only be created while the private key is in the
7826possession of the respective user. This is another reason to create a
7827revocation message ahead of time and store it in a secure location.
7828
7829@node libgnunetrevocation
7830@subsection libgnunetrevocation
7831
7832@c %**end of header
7833
7834The REVOCATION API consists of two parts, to query and to issue
7835revocations.
7836
7837
7838@menu
7839* Querying for revoked keys::
7840* Preparing revocations::
7841* Issuing revocations::
7842@end menu
7843
7844@node Querying for revoked keys
7845@subsubsection Querying for revoked keys
7846
7847@c %**end of header
7848
7849@code{GNUNET_REVOCATION_query} is used to check if a given ECDSA public
7850key has been revoked.
7851The given callback will be invoked with the result of the check.
7852The query can be cancelled using @code{GNUNET_REVOCATION_query_cancel} on
7853the return value.
7854
7855@node Preparing revocations
7856@subsubsection Preparing revocations
7857
7858@c %**end of header
7859
7860It is often desirable to create a revocation record ahead-of-time and
7861store it in an off-line location to be used later in an emergency.
7862This is particularly true for GNUnet revocations, where performing the
7863revocation operation itself is computationally expensive and thus is
7864likely to take some time.
7865Thus, if users want the ability to perform revocations quickly in an
7866emergency, they must pre-compute the revocation message.
7867The revocation API enables this with two functions that are used to
7868compute the revocation message, but not trigger the actual revocation
7869operation.
7870
7871@code{GNUNET_REVOCATION_check_pow} should be used to calculate the
7872proof-of-work required in the revocation message. This function takes the
7873public key, the required number of bits for the proof of work (which in
7874GNUnet is a network-wide constant) and finally a proof-of-work number as
7875arguments.
7876The function then checks if the given proof-of-work number is a valid
7877proof of work for the given public key. Clients preparing a revocation
7878are expected to call this function repeatedly (typically with a
7879monotonically increasing sequence of numbers of the proof-of-work number)
7880until a given number satisfies the check.
7881That number should then be saved for later use in the revocation
7882operation.
7883
7884@code{GNUNET_REVOCATION_sign_revocation} is used to generate the
7885signature that is required in a revocation message.
7886It takes the private key that (possibly in the future) is to be revoked
7887and returns the signature.
7888The signature can again be saved to disk for later use, which will then
7889allow performing a revocation even without access to the private key.
7890
7891@node Issuing revocations
7892@subsubsection Issuing revocations
7893
7894
7895Given a ECDSA public key, the signature from @code{GNUNET_REVOCATION_sign}
7896and the proof-of-work,
7897@code{GNUNET_REVOCATION_revoke} can be used to perform the
7898actual revocation. The given callback is called upon completion of the
7899operation. @code{GNUNET_REVOCATION_revoke_cancel} can be used to stop the
7900library from calling the continuation; however, in that case it is
7901undefined whether or not the revocation operation will be executed.
7902
7903@node The REVOCATION Client-Service Protocol
7904@subsection The REVOCATION Client-Service Protocol
7905
7906
7907The REVOCATION protocol consists of four simple messages.
7908
7909A @code{QueryMessage} containing a public ECDSA key is used to check if a
7910particular key has been revoked. The service responds with a
7911@code{QueryResponseMessage} which simply contains a bit that says if the
7912given public key is still valid, or if it has been revoked.
7913
7914The second possible interaction is for a client to revoke a key by
7915passing a @code{RevokeMessage} to the service. The @code{RevokeMessage}
7916contains the ECDSA public key to be revoked, a signature by the
7917corresponding private key and the proof-of-work, The service responds
7918with a @code{RevocationResponseMessage} which can be used to indicate
7919that the @code{RevokeMessage} was invalid (i.e. proof of work incorrect),
7920or otherwise indicates that the revocation has been processed
7921successfully.
7922
7923@node The REVOCATION Peer-to-Peer Protocol
7924@subsection The REVOCATION Peer-to-Peer Protocol
7925
7926@c %**end of header
7927
7928Revocation uses two disjoint ways to spread revocation information among
7929peers.
7930First of all, P2P gossip exchanged via CORE-level neighbours is used to
7931quickly spread revocations to all connected peers.
7932Second, whenever two peers (that both support revocations) connect,
7933the SET service is used to compute the union of the respective revocation
7934sets.
7935
7936In both cases, the exchanged messages are @code{RevokeMessage}s which
7937contain the public key that is being revoked, a matching ECDSA signature,
7938and a proof-of-work.
7939Whenever a peer learns about a new revocation this way, it first
7940validates the signature and the proof-of-work, then stores it to disk
7941(typically to a file $GNUNET_DATA_HOME/revocation.dat) and finally
7942spreads the information to all directly connected neighbours.
7943
7944For computing the union using the SET service, the peer with the smaller
7945hashed peer identity will connect (as a "client" in the two-party set
7946protocol) to the other peer after one second (to reduce traffic spikes
7947on connect) and initiate the computation of the set union.
7948All revocation services use a common hash to identify the SET operation
7949over revocation sets.
7950
7951The current implementation accepts revocation set union operations from
7952all peers at any time; however, well-behaved peers should only initiate
7953this operation once after establishing a connection to a peer with a
7954larger hashed peer identity.
7955
7956@cindex gnunet-fs
7957@cindex FS
7958@cindex FS subsystem
7959@node GNUnet's File-sharing (FS) Subsystem
7960@section GNUnet's File-sharing (FS) Subsystem
7961
7962@c %**end of header
7963
7964This chapter describes the details of how the file-sharing service works.
7965As with all services, it is split into an API (libgnunetfs), the service
7966process (gnunet-service-fs) and user interface(s).
7967The file-sharing service uses the datastore service to store blocks and
7968the DHT (and indirectly datacache) for lookups for non-anonymous
7969file-sharing.
7970Furthermore, the file-sharing service uses the block library (and the
7971block fs plugin) for validation of DHT operations.
7972
7973In contrast to many other services, libgnunetfs is rather complex since
7974the client library includes a large number of high-level abstractions;
7975this is necessary since the Fs service itself largely only operates on
7976the block level.
7977The FS library is responsible for providing a file-based abstraction to
7978applications, including directories, meta data, keyword search,
7979verification, and so on.
7980
7981The method used by GNUnet to break large files into blocks and to use
7982keyword search is called the
7983"Encoding for Censorship Resistant Sharing" (ECRS).
7984ECRS is largely implemented in the fs library; block validation is also
7985reflected in the block FS plugin and the FS service.
7986ECRS on-demand encoding is implemented in the FS service.
7987
7988NOTE: The documentation in this chapter is quite incomplete.
7989
7990@menu
7991* Encoding for Censorship-Resistant Sharing (ECRS)::
7992* File-sharing persistence directory structure::
7993@end menu
7994
7995@cindex ecrs
7996@cindex Encoding for Censorship-Resistant Sharing
7997@node Encoding for Censorship-Resistant Sharing (ECRS)
7998@subsection Encoding for Censorship-Resistant Sharing (ECRS)
7999
8000@c %**end of header
8001
8002When GNUnet shares files, it uses a content encoding that is called ECRS,
8003the Encoding for Censorship-Resistant Sharing.
8004Most of ECRS is described in the (so far unpublished) research paper
8005attached to this page. ECRS obsoletes the previous ESED and ESED II
8006encodings which were used in GNUnet before version 0.7.0.
8007The rest of this page assumes that the reader is familiar with the
8008attached paper. What follows is a description of some minor extensions
8009that GNUnet makes over what is described in the paper.
8010The reason why these extensions are not in the paper is that we felt
8011that they were obvious or trivial extensions to the original scheme and
8012thus did not warrant space in the research report.
8013
8014@menu
8015* Namespace Advertisements::
8016* KSBlocks::
8017@end menu
8018
8019@node Namespace Advertisements
8020@subsubsection Namespace Advertisements
8021
8022@c %**end of header
8023@c %**FIXME: all zeroses -> ?
8024
8025An @code{SBlock} with identifier all zeros is a signed
8026advertisement for a namespace. This special @code{SBlock} contains
8027metadata describing the content of the namespace.
8028Instead of the name of the identifier for a potential update, it contains
8029the identifier for the root of the namespace.
8030The URI should always be empty. The @code{SBlock} is signed with the
8031content provder's RSA private key (just like any other SBlock). Peers
8032can search for @code{SBlock}s in order to find out more about a namespace.
8033
8034@node KSBlocks
8035@subsubsection KSBlocks
8036
8037@c %**end of header
8038
8039GNUnet implements @code{KSBlocks} which are @code{KBlocks} that, instead
8040of encrypting a CHK and metadata, encrypt an @code{SBlock} instead.
8041In other words, @code{KSBlocks} enable GNUnet to find @code{SBlocks}
8042using the global keyword search.
8043Usually the encrypted @code{SBlock} is a namespace advertisement.
8044The rationale behind @code{KSBlock}s and @code{SBlock}s is to enable
8045peers to discover namespaces via keyword searches, and, to associate
8046useful information with namespaces. When GNUnet finds @code{KSBlocks}
8047during a normal keyword search, it adds the information to an internal
8048list of discovered namespaces. Users looking for interesting namespaces
8049can then inspect this list, reducing the need for out-of-band discovery
8050of namespaces.
8051Naturally, namespaces (or more specifically, namespace advertisements) can
8052also be referenced from directories, but @code{KSBlock}s should make it
8053easier to advertise namespaces for the owner of the pseudonym since they
8054eliminate the need to first create a directory.
8055
8056Collections are also advertised using @code{KSBlock}s.
8057
8058@table @asis
8059@item Attachment Size
8060@item ecrs.pdf 270.68 KB
8061@item https://gnunet.org/sites/default/files/ecrs.pdf
8062@end table
8063
8064@node File-sharing persistence directory structure
8065@subsection File-sharing persistence directory structure
8066
8067@c %**end of header
8068
8069This section documents how the file-sharing library implements
8070persistence of file-sharing operations and specifically the resulting
8071directory structure.
8072This code is only active if the @code{GNUNET_FS_FLAGS_PERSISTENCE} flag
8073was set when calling @code{GNUNET_FS_start}.
8074In this case, the file-sharing library will try hard to ensure that all
8075major operations (searching, downloading, publishing, unindexing) are
8076persistent, that is, can live longer than the process itself.
8077More specifically, an operation is supposed to live until it is
8078explicitly stopped.
8079
8080If @code{GNUNET_FS_stop} is called before an operation has been stopped, a
8081@code{SUSPEND} event is generated and then when the process calls
8082@code{GNUNET_FS_start} next time, a @code{RESUME} event is generated.
8083Additionally, even if an application crashes (segfault, SIGKILL, system
8084crash) and hence @code{GNUNET_FS_stop} is never called and no
8085@code{SUSPEND} events are generated, operations are still resumed (with
8086@code{RESUME} events).
8087This is implemented by constantly writing the current state of the
8088file-sharing operations to disk.
8089Specifically, the current state is always written to disk whenever
8090anything significant changes (the exception are block-wise progress in
8091publishing and unindexing, since those operations would be slowed down
8092significantly and can be resumed cheaply even without detailed
8093accounting).
8094Note that if the process crashes (or is killed) during a serialization
8095operation, FS does not guarantee that this specific operation is
8096recoverable (no strict transactional semantics, again for performance
8097reasons). However, all other unrelated operations should resume nicely.
8098
8099Since we need to serialize the state continuously and want to recover as
8100much as possible even after crashing during a serialization operation,
8101we do not use one large file for serialization.
8102Instead, several directories are used for the various operations.
8103When @code{GNUNET_FS_start} executes, the master directories are scanned
8104for files describing operations to resume.
8105Sometimes, these operations can refer to related operations in child
8106directories which may also be resumed at this point.
8107Note that corrupted files are cleaned up automatically.
8108However, dangling files in child directories (those that are not
8109referenced by files from the master directories) are not automatically
8110removed.
8111
8112Persistence data is kept in a directory that begins with the "STATE_DIR"
8113prefix from the configuration file
8114(by default, "$SERVICEHOME/persistence/") followed by the name of the
8115client as given to @code{GNUNET_FS_start} (for example, "gnunet-gtk")
8116followed by the actual name of the master or child directory.
8117
8118The names for the master directories follow the names of the operations:
8119
8120@itemize @bullet
8121@item "search"
8122@item "download"
8123@item "publish"
8124@item "unindex"
8125@end itemize
8126
8127Each of the master directories contains names (chosen at random) for each
8128active top-level (master) operation.
8129Note that a download that is associated with a search result is not a
8130top-level operation.
8131
8132In contrast to the master directories, the child directories are only
8133consulted when another operation refers to them.
8134For each search, a subdirectory (named after the master search
8135synchronization file) contains the search results.
8136Search results can have an associated download, which is then stored in
8137the general "download-child" directory.
8138Downloads can be recursive, in which case children are stored in
8139subdirectories mirroring the structure of the recursive download
8140(either starting in the master "download" directory or in the
8141"download-child" directory depending on how the download was initiated).
8142For publishing operations, the "publish-file" directory contains
8143information about the individual files and directories that are part of
8144the publication.
8145However, this directory structure is flat and does not mirror the
8146structure of the publishing operation.
8147Note that unindex operations cannot have associated child operations.
8148
8149@cindex REGEX subsystem
8150@cindex regex subsystem
8151@node GNUnet's REGEX Subsystem
8152@section GNUnet's REGEX Subsystem
8153
8154@c %**end of header
8155
8156Using the REGEX subsystem, you can discover peers that offer a particular
8157service using regular expressions.
8158The peers that offer a service specify it using a regular expressions.
8159Peers that want to patronize a service search using a string.
8160The REGEX subsystem will then use the DHT to return a set of matching
8161offerers to the patrons.
8162
8163For the technical details, we have Max's defense talk and Max's Master's
8164thesis.
8165
8166@c An additional publication is under preparation and available to
8167@c team members (in Git).
8168@c FIXME: Where is the file? Point to it. Assuming that it's szengel2012ms
8169
8170@menu
8171* How to run the regex profiler::
8172@end menu
8173
8174@node How to run the regex profiler
8175@subsection How to run the regex profiler
8176
8177@c %**end of header
8178
8179The gnunet-regex-profiler can be used to profile the usage of mesh/regex
8180for a given set of regular expressions and strings.
8181Mesh/regex allows you to announce your peer ID under a certain regex and
8182search for peers matching a particular regex using a string.
8183See @uref{https://gnunet.org/szengel2012ms, szengel2012ms} for a full
8184introduction.
8185
8186First of all, the regex profiler uses GNUnet testbed, thus all the
8187implications for testbed also apply to the regex profiler
8188(for example you need password-less ssh login to the machines listed in
8189your hosts file).
8190
8191@strong{Configuration}
8192
8193Moreover, an appropriate configuration file is needed.
8194Generally you can refer to the
8195@file{contrib/regex_profiler_infiniband.conf} file in the sourcecode
8196of GNUnet for an example configuration.
8197In the following paragraph the important details are highlighted.
8198
8199Announcing of the regular expressions is done by the
8200gnunet-daemon-regexprofiler, therefore you have to make sure it is
8201started, by adding it to the AUTOSTART set of ARM:
8202
8203@example
8204[regexprofiler]
8205AUTOSTART = YES
8206@end example
8207
8208@noindent
8209Furthermore you have to specify the location of the binary:
8210
8211@example
8212[regexprofiler]
8213# Location of the gnunet-daemon-regexprofiler binary.
8214BINARY = /home/szengel/gnunet/src/mesh/.libs/gnunet-daemon-regexprofiler
8215# Regex prefix that will be applied to all regular expressions and
8216# search string.
8217REGEX_PREFIX = "GNVPN-0001-PAD"
8218@end example
8219
8220@noindent
8221When running the profiler with a large scale deployment, you probably
8222want to reduce the workload of each peer.
8223Use the following options to do this.
8224
8225@example
8226[dht]
8227# Force network size estimation
8228FORCE_NSE = 1
8229
8230[dhtcache]
8231DATABASE = heap
8232# Disable RC-file for Bloom filter? (for benchmarking with limited IO
8233# availability)
8234DISABLE_BF_RC = YES
8235# Disable Bloom filter entirely
8236DISABLE_BF = YES
8237
8238[nse]
8239# Minimize proof-of-work CPU consumption by NSE
8240WORKBITS = 1
8241@end example
8242
8243@noindent
8244@strong{Options}
8245
8246To finally run the profiler some options and the input data need to be
8247specified on the command line.
8248
8249@example
8250gnunet-regex-profiler -c config-file -d log-file -n num-links \
8251-p path-compression-length -s search-delay -t matching-timeout \
8252-a num-search-strings hosts-file policy-dir search-strings-file
8253@end example
8254
8255@noindent
8256Where...
8257
8258@itemize @bullet
8259@item ... @code{config-file} means the configuration file created earlier.
8260@item ... @code{log-file} is the file where to write statistics output.
8261@item ... @code{num-links} indicates the number of random links between
8262started peers.
8263@item ... @code{path-compression-length} is the maximum path compression
8264length in the DFA.
8265@item ... @code{search-delay} time to wait between peers finished linking
8266and starting to match strings.
8267@item ... @code{matching-timeout} timeout after which to cancel the
8268searching.
8269@item ... @code{num-search-strings} number of strings in the
8270search-strings-file.
8271@item ... the @code{hosts-file} should contain a list of hosts for the
8272testbed, one per line in the following format:
8273
8274@itemize @bullet
8275@item @code{user@@host_ip:port}
8276@end itemize
8277@item ... the @code{policy-dir} is a folder containing text files
8278containing one or more regular expressions. A peer is started for each
8279file in that folder and the regular expressions in the corresponding file
8280are announced by this peer.
8281@item ... the @code{search-strings-file} is a text file containing search
8282strings, one in each line.
8283@end itemize
8284
8285@noindent
8286You can create regular expressions and search strings for every AS in the
8287Internet using the attached scripts. You need one of the
8288@uref{http://data.caida.org/datasets/routing/routeviews-prefix2as/, CAIDA routeviews prefix2as}
8289data files for this. Run
8290
8291@example
8292create_regex.py <filename> <output path>
8293@end example
8294
8295@noindent
8296to create the regular expressions and
8297
8298@example
8299create_strings.py <input path> <outfile>
8300@end example
8301
8302@noindent
8303to create a search strings file from the previously created
8304regular expressions.
diff --git a/doc/documentation/chapters/installation.texi b/doc/documentation/chapters/installation.texi
new file mode 100644
index 000000000..dfd94d037
--- /dev/null
+++ b/doc/documentation/chapters/installation.texi
@@ -0,0 +1,3995 @@
1@node GNUnet Installation Handbook
2@chapter GNUnet Installation Handbook
3
4This handbook describes how to install (build setup, compilation) and
5setup (configuration, start) GNUnet 0.10.x. After following these
6instructions you should be able to install and then start user-interfaces
7to interact with the network.
8
9This manual is far from complete, and we welcome informed contributions,
10be it in the form of new chapters or insightful comments.
11
12@menu
13* Dependencies::
14* Pre-installation notes::
15* Generic installation instructions::
16* Build instructions for Ubuntu 12.04 using Git::
17* Build Instructions for Microsoft Windows Platforms::
18* Build instructions for Debian 7.5::
19* Installing GNUnet from Git on Ubuntu 14.4::
20* Build instructions for Debian 8::
21* Outdated build instructions for previous revisions::
22@c * Portable GNUnet::
23* The graphical configuration interface::
24* How to start and stop a GNUnet peer::
25@end menu
26
27@node Dependencies
28@section Dependencies
29@c %**end of header
30
31This section lists the various known dependencies for
32GNUnet @value{EDITION}.
33Suggestions for missing dependencies or wrong version numbers are welcome.
34
35@menu
36* External dependencies::
37* Fixing libgnurl build issues::
38* Optional dependencies::
39* Internal dependencies::
40@end menu
41
42@node External dependencies
43@subsection External dependencies
44@c %**end of header
45
46These packages must be installed before a typical GNUnet installation
47can be performed:
48
49@itemize @bullet
50@item autoconf
51@item automake
52@item pkg-config
53@item libltdl
54@item gstreamer
55@item gst-plugins-base
56@item perl
57@item python (only 2.7 supported)@footnote{tests and gnunet-qr}
58@item jansson
59@item nss
60@item glib
61@item gmp
62@item bluez
63@item miniupnpc
64@item gettext
65@item which
66@item texinfo
67@item GNU libmicrohttpd @geq{} 0.9.30 @footnote{We recommend to build it
68with a GnuTLS version that was configured with libunbound}
69@item GNU libextractor @geq{} 1.0
70@item GNU libtool @geq{} 2.2
71@item GNU libunistring @geq{} 0.9.1.1
72@item GNU libidn @geq{} 1.0.0
73@item @uref{https://gnupg.org/software/libgcrypt/, GNU libgcrypt} @geq{}
74@uref{https://gnupg.org/ftp/gcrypt/libgcrypt/, 1.6.0}
75@item @uref{https://gnutls.org/, GnuTLS} @geq{} 3.2.7
76@footnote{We recommend to compile with libunbound for DANE support;
77GnuTLS also requires GNU nettle 2.7 (update: GnuTLS 3.2.7 appears NOT
78to work against GNU nettle > 2.7, due to some API updatings done by
79nettle. Thus it should be compiled against nettle 2.7
80and, in case you get some error on the reference to `rpl_strerror' being
81undefined, follow the instructions on
82@uref{http://lists.gnupg.org/pipermail/gnutls-devel/2013-November/006588.html, this}
83post (and the link inside it)).}
84@item @uref{https://gnunet.org/gnurl, gnURL} libgnurl @geq{} 7.34.0
85@footnote{must be compiled after @code{GnuTLS}}
86@item libglpk @geq{} 4.45
87@item @uref{http://www.openssl.org/, OpenSSL} @geq{} 1.0
88@item TeX Live @geq{} 2012, optional (for gnunet-bcd)
89@item Texinfo @geq{} 5.2 (for documentation)
90@item libsqlite @geq{} 3.8.0 @footnote{(note that the code will
91compile and often work with lower version numbers, but you may get subtle
92bugs with respect to quota management in certain rare cases);
93alternatively, MySQL or Postgres can also be installed, but those
94databases will require more complex configurations (not
95recommended for first-time users)}
96@item zlib
97@end itemize
98
99@node Fixing libgnurl build issues
100@subsection Fixing libgnurl build issues
101
102If you have to compile libgnurl from source since the version included in
103your distribution is to old you perhaps get an error message while
104running the @file{configure} script:
105
106@example
107$ configure
108...
109checking for 64-bit curl_off_t data type... unknown
110checking for 32-bit curl_off_t data type... unknown
111checking for 16-bit curl_off_t data type... unknown
112configure: error: cannot find data type for curl_off_t.
113@end example
114
115@noindent
116Solution:
117
118Before running the configure script, set:
119
120@example
121CFLAGS="-I. -I$BUILD_ROOT/include"
122@end example
123
124@node Optional dependencies
125@subsection Optional dependencies
126
127These applications must be installed for various experimental or otherwise
128optional features such as @code{gnunet-conversation}, @code{gnunet-gtk}.
129
130@itemize @bullet
131@item libpulse 2.0 or higher, optional (for gnunet-conversation)
132@item libopus 1.0.1 or higher, optional (for gnunet-conversation)
133@item libogg 1.3.0 or higher, optional (for gnunet-conversation)
134@item certool (binary) optional @footnote{for convenient installation of
135the GNS proxy (available as part of Debian's libnss3-tools)}
136@item python-zbar 0.10 or higher, optional (for gnunet-qr)
137@item Gtk+ 3.0 or higher, optional (for gnunet-gtk)
138@item libgladeui must match Gtk+ version, optional (for gnunet-gtk)
139@item libqrencode 3.0 or higher, optional (for gnunet-namestore-gtk)
140@end itemize
141
142@node Internal dependencies
143@subsection Internal dependencies
144
145This section tries to give an overview of what processes a typical GNUnet
146peer running a particular application would consist of. All of the
147processes listed here should be automatically started by
148@code{gnunet-arm -s}.
149The list is given as a rough first guide to users for failure diagnostics.
150Ideally, end-users should never have to worry about these internal
151dependencies.
152In terms of internal dependencies, a minimum file-sharing system consists
153of the following GNUnet processes (in order of dependency):
154
155@itemize @bullet
156@item gnunet-service-arm
157@item gnunet-service-resolver (required by all)
158@item gnunet-service-statistics (required by all)
159@item gnunet-service-peerinfo
160@item gnunet-service-transport (requires peerinfo)
161@item gnunet-service-core (requires transport)
162@item gnunet-daemon-hostlist (requires core)
163@item gnunet-daemon-topology (requires hostlist, peerinfo)
164@item gnunet-service-datastore
165@item gnunet-service-dht (requires core)
166@item gnunet-service-identity
167@item gnunet-service-fs (requires identity, mesh, dht, datastore, core)
168@end itemize
169
170@noindent
171A minimum VPN system consists of the following GNUnet processes (in
172order of dependency):
173
174@itemize @bullet
175@item gnunet-service-arm
176@item gnunet-service-resolver (required by all)
177@item gnunet-service-statistics (required by all)
178@item gnunet-service-peerinfo
179@item gnunet-service-transport (requires peerinfo)
180@item gnunet-service-core (requires transport)
181@item gnunet-daemon-hostlist (requires core)
182@item gnunet-service-dht (requires core)
183@item gnunet-service-mesh (requires dht, core)
184@item gnunet-service-dns (requires dht)
185@item gnunet-service-regex (requires dht)
186@item gnunet-service-vpn (requires regex, dns, mesh, dht)
187@end itemize
188
189@noindent
190A minimum GNS system consists of the following GNUnet processes (in
191order of dependency):
192
193@itemize @bullet
194@item gnunet-service-arm
195@item gnunet-service-resolver (required by all)
196@item gnunet-service-statistics (required by all)
197@item gnunet-service-peerinfo
198@item gnunet-service-transport (requires peerinfo)
199@item gnunet-service-core (requires transport)
200@item gnunet-daemon-hostlist (requires core)
201@item gnunet-service-dht (requires core)
202@item gnunet-service-mesh (requires dht, core)
203@item gnunet-service-dns (requires dht)
204@item gnunet-service-regex (requires dht)
205@item gnunet-service-vpn (requires regex, dns, mesh, dht)
206@item gnunet-service-identity
207@item gnunet-service-namestore (requires identity)
208@item gnunet-service-gns (requires vpn, dns, dht, namestore, identity)
209@end itemize
210
211@node Pre-installation notes
212@section Pre-installation notes
213
214Please note that in the code instructions for the installation,
215@emph{#} indicates commands run as privileged root user and
216@emph{$} shows commands run as unprivileged ("normal") system user.
217
218
219@node Generic installation instructions
220@section Generic installation instructions
221
222First, in addition to the GNUnet sources you might require downloading the
223latest version of various dependencies, depending on how recent the
224software versions in your distribution of GNU/Linux are.
225Most distributions do not include sufficiently recent versions of these
226dependencies.
227Thus, a typically installation on a "modern" GNU/Linux distribution
228requires you to install the following dependencies (ideally in this
229order):
230
231@itemize @bullet
232@item libgpgerror and libgcrypt
233@item libnettle and libunbound (possibly from distribution), GnuTLS
234@item libgnurl (read the README)
235@item GNU libmicrohttpd
236@item GNU libextractor
237@end itemize
238
239Make sure to first install the various mandatory and optional
240dependencies including development headers from your distribution.
241
242Other dependencies that you should strongly consider to install is a
243database (MySQL, sqlite or Postgres).
244The following instructions will assume that you installed at least sqlite.
245For most distributions you should be able to find pre-build packages for
246the database. Again, make sure to install the client libraries and the
247respective development headers (if they are packaged separately) as well.
248
249You can find specific, detailed instructions for installing of the
250dependencies (and possibly the rest of the GNUnet installation) in the
251platform-specific descriptions, which can be found in the Index.
252Please consult them now.
253If your distribution is not listed, please study the instructions for
254Debian stable carefully as you try to install the dependencies for your
255own distribution.
256Contributing additional instructions for further platforms is always
257appreciated.
258Please take in mind that operating system development tends to move at
259a rather fast speed. Due to this you should be aware that some of
260the instructionss could be outdated by the time you are reading this.
261If you find a mistake, please tell us about it (or even better: send
262a patch to the documentation to fix it!).
263
264Before proceeding further, please double-check the dependency list.
265Note that in addition to satisfying the dependencies, you might have to
266make sure that development headers for the various libraries are also
267installed.
268There maybe files for other distributions, or you might be able to find
269equivalent packages for your distribution.
270
271While it is possible to build and install GNUnet without having root
272access, we will assume that you have full control over your system in
273these instructions.
274First, you should create a system user @emph{gnunet} and an additional
275group @emph{gnunetdns}. On Debian and Ubuntu GNU/Linux, type:
276
277@example
278# adduser --system --home /var/lib/gnunet --group \
279--disabled-password gnunet
280# addgroup --system gnunetdns
281@end example
282
283@noindent
284On other Unixes, this should have the same effect:
285
286@example
287# useradd --system --groups gnunet --home-dir /var/lib/gnunet
288# addgroup --system gnunetdns
289@end example
290
291Now compile and install GNUnet using:
292
293@example
294$ tar xvf gnunet-0.10.?.tar.gz
295$ cd gnunet-0.10.?
296$ ./configure --with-sudo=sudo --with-nssdir=/lib
297$ make
298$ sudo make install
299@end example
300
301If you want to be able to enable DEBUG-level log messages, add
302@code{--enable-logging=verbose} to the end of the
303@code{./configure} command.
304DEBUG-level log messages are in English-only and should only be useful for
305developers (or for filing really detailed bug reports).
306
307Finally, you probably want to compile @code{gnunet-gtk}, which
308includes gnunet-setup (graphical tool for configuration)
309and @code{gnunet-fs-gtk} (graphical tool for file-sharing):
310
311@example
312$ tar xvf gnunet-gtk-0.10.?.tar.gz
313$ cd gnunet-gtk-0.10.?
314$ ./configure --with-gnunet=/usr/local/
315$ make
316$ sudo make install
317$ cd ..
318# just to be safe run this:
319$ sudo ldconfig
320@end example
321
322@noindent
323Next, edit the file @file{/etc/gnunet.conf} to contain the following:
324
325@example
326[arm]
327SYSTEM_ONLY = YES
328USER_ONLY = NO
329@end example
330
331@noindent
332You may need to update your ld.so cache to include files installed in
333@file{/usr/local/lib}:
334
335@example
336# ldconfig
337@end example
338
339@noindent
340Then, switch from user root to user gnunet to start the peer:
341
342@example
343# su -s /bin/sh - gnunet
344$ gnunet-arm -c /etc/gnunet.conf -s
345@end example
346
347You may also want to add the last line in the gnunet users @file{crontab}
348prefixed with @code{@@reboot} so that it is executed whenever the system
349is booted:
350
351@example
352@@reboot /usr/local/bin/gnunet-arm -c /etc/gnunet.conf -s@
353@end example
354
355@noindent
356This will only start the system-wide GNUnet services.
357Type exit to get back your root shell.
358Now, you need to configure the per-user part. For each
359$USER on the system, run:
360
361@example
362# adduser $USER gnunet
363@end example
364
365@noindent
366to allow them to access the system-wide GNUnet services. Then, each
367user should create a configuration file @file{~/.config/gnunet.conf}
368with the lines:
369
370@example
371[arm]
372SYSTEM_ONLY = NO
373USER_ONLY = YES
374DEFAULTSERVICES = gns
375@end example
376
377@noindent
378and start the per-user services using
379
380@example
381$ gnunet-arm -c ~/.config/gnunet.conf -s
382@end example
383
384@noindent
385Again, adding a @code{crontab} entry to autostart the peer is advised:
386
387@example
388@@reboot /usr/local/bin/gnunet-arm -c $HOME/.config/gnunet.conf -s
389@end example
390
391@noindent
392Note that some GNUnet services (such as SOCKS5 proxies) may need a
393system-wide TCP port for each user.
394For those services, systems with more than one user may require each user
395to specify a different port number in their personal configuration file.
396
397Finally, the user should perform the basic initial setup for the GNU Name
398System. This is done by running two commands:
399
400@example
401$ gnunet-gns-import.sh
402$ gnunet-gns-proxy-setup-ca
403@end example
404
405@noindent
406The first generates the default zones, wheras the second setups the GNS
407Certificate Authority with the user's browser. Now, to actiave GNS in the
408normal DNS resolution process, you need to edit your
409@file{/etc/nsswitch.conf} where you should find a line like this:
410
411@example
412hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
413@end example
414
415@noindent
416The exact details may differ a bit, which is fine. Add the text
417@emph{"gns [NOTFOUND=return]"} after @emph{"files"}.
418Keep in mind that we included a backslash ("\") here just for
419markup reasons. You should write the text below on @b{one line}
420and @b{without} the "\":
421
422@example
423hosts: files gns [NOTFOUND=return] mdns4_minimal \
424[NOTFOUND=return] dns mdns4
425@end example
426
427@c FIXME: Document new behavior.
428You might want to make sure that @file{/lib/libnss_gns.so.2} exists on
429your system, it should have been created during the installation.
430
431@node Build instructions for Ubuntu 12.04 using Git
432@section Build instructions for Ubuntu 12.04 using Git
433
434
435@menu
436* Install the required build tools::
437* Install libgcrypt 1.6 and libgpg-error::
438* Install gnutls with DANE support::
439* Install libgnurl::
440* Install libmicrohttpd from Git::
441* Install libextractor from Git::
442* Install GNUnet dependencies::
443* Build GNUnet::
444* Install the GNUnet-gtk user interface from Git::
445@end menu
446
447@node Install the required build tools
448@subsection Install the required build tools
449
450First, make sure Git is installed on your system:
451
452@example
453$ sudo apt-get install git
454@end example
455
456Install the essential buildtools:
457
458@example
459$ sudo apt-get install automake autopoint autoconf libtool
460@end example
461
462@node Install libgcrypt 1.6 and libgpg-error
463@subsection Install libgcrypt 1.6 and libgpg-error
464
465@example
466$ wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.12.tar.bz2
467$ tar xf libgpg-error-1.12.tar.bz2
468$ cd libgpg-error-1.12
469$ ./configure
470$ sudo make install ; cd ..
471@end example
472
473@node Install gnutls with DANE support
474@subsection Install gnutls with DANE support
475
476@example
477$ wget http://www.lysator.liu.se/~nisse/archive/nettle-2.7.1.tar.gz
478$ tar xf nettle-2.7.1.tar.gz
479$ cd nettle-2.7.1
480$ ./configure
481$ sudo make install ; cd ..
482@end example
483
484@example
485$ wget https://www.nlnetlabs.nl/downloads/ldns/ldns-1.6.16.tar.gz
486$ tar xf ldns-1.6.16.tar.gz
487$ cd ldns-1.6.16
488$ ./configure
489$ sudo make install ; cd ..
490@end example
491
492@example
493$ wget https://unbound.net/downloads/unbound-1.4.21.tar.gz
494$ tar xf unbound-1.4.21.tar.gz
495$ cd unbound-1.4.21
496$ ./configure
497$ sudo make install ; cd ..
498@end example
499
500@example
501$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.17.tar.xz
502$ tar xf gnutls-3.1.17.tar.xz
503$ cd gnutls-3.1.17
504$ ./configure
505$ sudo make install ; cd ..
506@end example
507
508@example
509$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.0.tar.bz2
510$ tar xf libgcrypt-1.6.0.tar.bz2
511$ cd libgcrypt-1.6.0
512$ ./configure
513$ sudo make install ; cd ..
514@end example
515
516@node Install libgnurl
517@subsection Install libgnurl
518
519@example
520$ wget https://gnunet.org/sites/default/files/gnurl-7.34.0.tar.bz2
521$ tar xf gnurl-7.34.0.tar.bz2
522$ cd gnurl-7.34.0
523$ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
524 --without-libmetalink --without-winidn --without-librtmp \
525 --without-nghttp2 --without-nss --without-cyassl \
526 --without-polarssl --without-ssl --without-winssl \
527 --without-darwinssl --disable-sspi --disable-ntlm-wb \
528 --disable-ldap --disable-rtsp --disable-dict --disable-telnet \
529 --disable-tftp --disable-pop3 --disable-imap --disable-smtp \
530 --disable-gopher --disable-file --disable-ftp
531$ sudo make install ; cd ..
532@end example
533
534@node Install libmicrohttpd from Git
535@subsection Install libmicrohttpd from Git
536
537@example
538$ git clone https://gnunet.org/git/libmicrohttpd
539$ cd libmicrohttpd/
540$ ./bootstrap
541$ ./configure
542$ sudo make install ; cd ..
543@end example
544
545@node Install libextractor from Git
546@subsection Install libextractor from Git
547
548Install libextractor dependencies:
549
550@example
551$ sudo apt-get install zlib1g-dev libgsf-1-dev libmpeg2-4-dev \
552 libpoppler-dev libvorbis-dev libexiv2-dev libjpeg-dev \
553 libtiff-dev libgif-dev libvorbis-dev libflac-dev libsmf-dev \
554 g++
555@end example
556
557Build libextractor:
558
559@example
560$ git clone https://gnunet.org/git/libextractor
561$ cd libextractor
562$ ./bootstrap
563$ ./configure
564$ sudo make install ; cd ..
565@end example
566
567@node Install GNUnet dependencies
568@subsection Install GNUnet dependencies
569
570@example
571$ sudo apt-get install libidn11-dev libunistring-dev libglpk-dev \
572 libpulse-dev libbluetooth-dev libsqlite-dev
573@end example
574
575Install libopus:
576
577@example
578$ wget http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz
579$ tar xf opus-1.1.tar.gz
580$ cd opus-1.1/
581$ ./configure
582$ sudo make install ; cd ..
583@end example
584
585Choose one or more database backends:
586
587SQLite3:
588@example
589$ sudo apt-get install libsqlite3-dev
590@end example
591MySQL:
592@example
593$ sudo apt-get install libmysqlclient-dev
594@end example
595PostgreSQL:
596@example
597$ sudo apt-get install libpq-dev postgresql
598@end example
599
600
601
602@node Build GNUnet
603@subsection Build GNUnet
604
605
606
607@menu
608* Configuring the installation path::
609* Configuring the system::
610* Installing components requiring sudo permission::
611* Build::
612@end menu
613
614@node Configuring the installation path
615@subsubsection Configuring the installation path
616
617You can specify the location of the GNUnet installation by setting the
618prefix when calling the configure script with @code{--prefix=DIRECTORY}
619
620@example
621$ export PATH=$PATH:DIRECTORY/bin
622@end example
623
624@node Configuring the system
625@subsubsection Configuring the system
626
627Please make sure NOW that you have created a user and group 'gnunet'
628and additionally a group 'gnunetdns':
629
630@example
631$ sudo addgroup gnunet
632$ sudo addgroup gnunetdns
633$ sudo adduser gnunet
634@end example
635
636Each GNUnet user should be added to the 'gnunet' group (may
637require fresh login to come into effect):
638
639@example
640$ sudo useradd -G gnunet
641@end example
642
643@node Installing components requiring sudo permission
644@subsubsection Installing components requiring sudo permission
645
646Some components, like the nss plugin required for GNS, may require root
647permissions. To allow these few components to be installed use:
648
649@example
650$ ./configure --with-sudo
651@end example
652
653@node Build
654@subsubsection Build
655
656@example
657$ git clone https://gnunet.org/git/gnunet/
658$ cd gnunet/
659$ ./bootstrap
660@end example
661
662Use the required configure call including the optional installation prefix
663PREFIX or the sudo permissions:
664
665@example
666$ ./configure [ --with-sudo | --with-prefix=PREFIX ]
667@end example
668
669@example
670$ make; sudo make install
671@end example
672
673After installing it, you need to create an empty configuration file:
674
675@example
676mkdir ~/.gnunet; touch ~/.gnunet/gnunet.conf
677@end example
678
679And finally you can start GNUnet with:
680
681@example
682$ gnunet-arm -s
683@end example
684
685@node Install the GNUnet-gtk user interface from Git
686@subsection Install the GNUnet-gtk user interface from Git
687
688
689Install depencies:
690
691@example
692$ sudo apt-get install libgtk-3-dev libunique-3.0-dev libgladeui-dev \
693libqrencode-dev
694@end example
695
696To build GNUnet (with an optional prefix)and execute:
697
698@example
699$ git clone https://gnunet.org/git/gnunet-gtk/
700$ cd gnunet-gtk/
701$ ./bootstrap
702$ ./configure [--prefix=PREFIX] --with-gnunet=DIRECTORY
703$ make; sudo make install
704@end example
705
706@node Build Instructions for Microsoft Windows Platforms
707@section Build Instructions for Microsoft Windows Platforms
708
709@menu
710* Introduction to building on MS Windows::
711* Requirements::
712* Dependencies & Initial Setup::
713* GNUnet Installation::
714* Adjusting Windows for running and testing GNUnet::
715* Building the GNUnet Installer::
716* Using GNUnet with Netbeans on Windows::
717@end menu
718
719@node Introduction to building on MS Windows
720@subsection Introduction to building on MS Windows
721
722
723This document is a guide to building GNUnet and its dependencies on
724Windows platforms. GNUnet development is mostly done under GNU/Linux and
725especially git checkouts may not build out of the box.
726We regret any inconvenience, and if you have problems, please report
727them.
728
729@node Requirements
730@subsection Requirements
731
732The Howto is based upon a @strong{Windows Server 2008 32bit}
733@strong{Installation}, @strong{sbuild} and thus a
734@uref{http://www.mingw.org/wiki/MSYS, MSYS+MinGW}
735(W32-GCC-Compiler-Suite + Unix-like Userland) installation. sbuild
736is a convenient set of scripts which creates a working msys/mingw
737installation and installs most dependencies required for GNUnet.
738
739As of the point of the creation of these instructions,
740GNUnet @strong{requires} a Windows @strong{Server} 2003 or
741newer for full feature support.
742Windows Vista and later will also work, but
743@strong{non-server version can not run a VPN-Exit-Node} as the NAT
744features have been removed as of Windows Vista.
745
746@node Dependencies & Initial Setup
747@subsection Dependencies & Initial Setup
748
749
750@itemize @bullet
751
752@item
753Install a fresh version of @strong{Python 2.x}, even if you are using a
754x64-OS, install a 32-bit version for use with sbuild.
755Python 3.0 currently is incompatible.
756
757@item
758Install your favorite @uref{http://code.google.com/p/tortoisegit/, GIT} &
759@uref{http://tortoisesvn.net/, SVN}-clients.
760
761@item
762You will also need some archive-manager like
763@uref{http://www.7-zip.org/, 7zip}.
764
765@item
766Pull a copy of sbuild to a directory of your choice, which will be used
767in the remainder of this guide. For now, we will use
768@file{c:\gnunet\sbuild\}
769
770@item
771in @file{sbuild\src\mingw\mingw32-buildall.sh}, comment out the packages
772@strong{gnunet-svn} and @strong{gnunet-gtk-svn}, as we don't want sbuild
773to compile/install those for us.
774
775@item
776Follow LRN's sbuild installation instructions.-
777@end itemize
778
779Please note that sbuild may (or will most likely) fail during
780installation, thus you really HAVE to @strong{check the logfiles} created
781during the installation process.
782Certain packages may fail to build initially due to missing dependencies,
783thus you may have to
784@strong{substitute those with binary-versions initially}. Later on once
785dependencies are satisfied you can re-build the newer package versions.
786
787@strong{It is normal that you may have to repeat this step multiple times
788and there is no uniform way to fix all compile-time issues, as the
789build-process of many of the dependencies installed are rather unstable
790on win32 and certain releases may not even compile at all.}
791
792Most dependencies for GNUnet have been set up by sbuild, thus we now
793should add the @file{bin/} directories in your new msys and mingw
794installations to PATH. You will want to create a backup of your finished
795msys-environment by now.
796
797@node GNUnet Installation
798@subsection GNUnet Installation
799
800First, we need to launch our msys-shell, you can do this via
801
802@file{C:\gnunet\sbuild\msys\msys.bat}
803
804You might wish to take a look at this file and adjust some
805login-parameters to your msys environment.
806
807Also, sbuild added two pointpoints to your msys-environment, though those
808might remain invisible:
809
810@itemize @bullet
811
812@item
813/mingw, which will mount your mingw-directory from sbuild/mingw and the
814other one is
815
816@item
817/src which contains all the installation sources sbuild just compiled.
818@end itemize
819
820Check out the current GNUnet sources (git HEAD) from the
821GNUnet repository "gnunet.git", we will do this in your home directory:
822
823@code{git clone https://gnunet.org/git/gnunet/ ~/gnunet}
824
825Now, we will first need to bootstrap the checked out installation and then
826configure it accordingly.
827
828@example
829cd ~/gnunet
830./bootstrap
831STRIP=true CPPFLAGS="-DUSE_IPV6=1 -DW32_VEH" CFLAGS="$CFLAGS -g -O2" \
832./configure --prefix=/ --docdir=/share/doc/gnunet \
833--with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw \
834--with-libcurl=/mingw --with-extractor=/mingw --with-sqlite=/mingw \
835--with-microhttpd=/mingw --with-plibc=/mingw --enable-benchmarks \
836--enable-expensivetests --enable-experimental --with-qrencode=/mingw \
837--enable-silent-rules --enable-experimental 2>&1 | tee -a ./configure.log
838@end example
839
840The parameters above will configure for a reasonable GNUnet installation
841to the your msys-root directory.
842Depending on which features your would like to build or you may need to
843specify additional dependencies. Sbuild installed most libs into
844the /mingw subdirectory, so remember to prefix library locations with
845this path.
846
847Like on a unixoid system, you might want to use your home directory as
848prefix for your own GNUnet installation for development, without tainting
849the buildenvironment. Just change the "prefix" parameter to point towards
850~/ in this case.
851
852Now it's time to compile GNUnet as usual. Though this will take some time,
853so you may fetch yourself a coffee or some Mate now...
854
855@example
856make ; make install
857@end example
858
859@node Adjusting Windows for running and testing GNUnet
860@subsection Adjusting Windows for running and testing GNUnet
861
862Assuming the build succeeded and you
863@strong{added the bin directory of your GNUnet to PATH}, you can now use
864your gnunet-installation as usual.
865Remember that UAC or the windows firewall may popup initially, blocking
866further execution of gnunet until you acknowledge them.
867
868You will also have to take the usual steps to get peer-to-peer (p2p)
869software running properly (port forwarding, ...),
870and GNUnet will require administrative permissions as it may even
871install a device-driver (in case you are using gnunet-vpn and/or
872gnunet-exit).
873
874@node Building the GNUnet Installer
875@subsection Building the GNUnet Installer
876
877The GNUnet installer is made with
878@uref{http://nsis.sourceforge.net/, NSIS}.
879The installer script is located in @file{contrib\win} in the
880GNUnet source tree.
881
882@node Using GNUnet with Netbeans on Windows
883@subsection Using GNUnet with Netbeans on Windows
884
885TODO
886
887@node Build instructions for Debian 7.5
888@section Build instructions for Debian 7.5
889
890
891These are the installation instructions for Debian 7.5. They were tested
892using a minimal, fresh Debian 7.5 AMD64 installation without non-free
893software (no contrib or non-free).
894By "minimal", we mean that during installation, we did not select any
895desktop environment, servers or system utilities during the "tasksel"
896step. Note that the packages and the dependencies that we will install
897during this chapter take about 1.5 GB of disk space.
898Combined with GNUnet and space for objects during compilation, you should
899not even attempt this unless you have about 2.5 GB free after the minimal
900Debian installation.
901Using these instructions to build a VM image is likely to require a
902minimum of 4-5 GB for the VM (as you will likely also want a desktop
903manager).
904
905GNUnet's security model assumes that your @file{/home} directory is
906encrypted. Thus, if possible, you should encrypt your home partition
907(or per-user home directory).
908
909Naturally, the exact details of the starting state for your installation
910should not matter much. For example, if you selected any of those
911installation groups you might simply already have some of the necessary
912packages installed.
913We did this for testing, as this way we are less likely to forget to
914mention a required package.
915Note that we will not install a desktop environment, but of course you
916will need to install one to use GNUnet's graphical user interfaces.
917Thus, it is suggested that you simply install the desktop environment of
918your choice before beginning with the instructions.
919
920
921
922@menu
923* Update::
924* Stable? Hah!::
925* Update again::
926* Installing packages::
927* Installing dependencies from source::
928* Installing GNUnet from source::
929* But wait there is more!::
930@end menu
931
932@node Update
933@subsection Update
934
935After any installation, you should begin by running
936
937@example
938# apt-get update ; apt-get upgrade
939@end example
940
941to ensure that all of your packages are up-to-date. Note that the "#" is
942used to indicate that you need to type in this command as "root"
943(or prefix with "sudo"), whereas "$" is used to indicate typing in a
944command as a normal user.
945
946@node Stable? Hah!
947@subsection Stable? Hah!
948
949Yes, we said we start with a Debian 7.5 "stable" system. However, to
950reduce the amount of compilation by hand, we will begin by allowing the
951installation of packages from the testing and unstable distributions as
952well.
953We will stick to "stable" packages where possible, but some packages will
954be taken from the other distributions.
955Start by modifying @file{/etc/apt/sources.list} to contain the
956following (possibly adjusted to point to your mirror of choice):
957
958@example
959# These were there before:
960deb http://ftp.de.debian.org/debian/ wheezy main
961deb-src http://ftp.de.debian.org/debian/ wheezy main
962deb http://security.debian.org/ wheezy/updates main
963deb-src http://security.debian.org/ wheezy/updates main
964deb http://ftp.de.debian.org/debian/ wheezy-updates main
965deb-src http://ftp.de.debian.org/debian/ wheezy-updates main
966
967# Add these lines (feel free to adjust the mirror):
968deb http://ftp.de.debian.org/debian/ testing main
969deb http://ftp.de.debian.org/debian/ unstable main
970@end example
971
972The next step is to create/edit your @file{/etc/apt/preferences}
973file to look like this:
974
975@example
976Package: *
977Pin: release a=stable,n=wheezy
978Pin-Priority: 700
979
980Package: *
981Pin: release o=Debian,a=testing
982Pin-Priority: 650
983
984Package: *
985Pin: release o=Debian,a=unstable
986Pin-Priority: 600
987@end example
988
989You can read more about Apt Preferences here and here.
990Note that other pinnings are likely to also work for GNUnet, the key
991thing is that you need some packages from unstable (as shown below).
992However, as unstable is unlikely to be comprehensive (missing packages)
993or might be problematic (crashing packages), you probably want others
994from stable and/or testing.
995
996@node Update again
997@subsection Update again
998
999Now, run again@
1000
1001@example
1002# apt-get update@
1003# apt-get upgrade@
1004@end example
1005
1006to ensure that all your new distribution indices are downloaded, and
1007that your pinning is correct: the upgrade step should cause no changes
1008at all.
1009
1010@node Installing packages
1011@subsection Installing packages
1012
1013We begin by installing a few Debian packages from stable:@
1014
1015@example
1016# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
1017 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev \
1018 texlive libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev \
1019 libbz2-dev libexiv2-dev libflac-dev libgif-dev libglib2.0-dev \
1020 libgtk-3-dev libmagic-dev libjpeg8-dev libmpeg2-4-dev libmp4v2-dev \
1021 librpm-dev libsmf-dev libtidy-dev libtiff5-dev libvorbis-dev \
1022 libogg-dev zlib1g-dev g++ gettext libgsf-1-dev libunbound-dev \
1023 libqrencode-dev libgladeui-dev nasm texlive-latex-extra \
1024 libunique-3.0-dev gawk miniupnpc libfuse-dev libbluetooth-dev
1025@end example
1026
1027After that, we install a few more packages from unstable:@
1028
1029@example
1030# apt-get install -t unstable nettle-dev libgstreamer1.0-dev \
1031 gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
1032 libgstreamer-plugins-base1.0-dev
1033@end example
1034
1035@node Installing dependencies from source
1036@subsection Installing dependencies from source
1037
1038Next, we need to install a few dependencies from source.
1039You might want to do this as a "normal" user and only run the
1040@code{make install} steps as root (hence the @code{sudo} in the
1041commands below). Also, you do this from any
1042directory. We begin by downloading all dependencies, then extracting the
1043sources, and finally compiling and installing the libraries:@
1044
1045@example
1046$ wget https://libav.org/releases/libav-9.10.tar.xz
1047$ wget http://ftp.gnu.org/gnu/libextractor/libextractor-1.3.tar.gz
1048$ wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.12.tar.bz2
1049$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.0.tar.bz2
1050$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.7.tar.xz
1051$ wget http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.33.tar.gz
1052$ wget https://gnunet.org/sites/default/files/gnurl-7.34.0.tar.bz2
1053$ tar xvf libextractor-1.3.tar.gz
1054$ tar xvf libgpg-error-1.12.tar.bz2
1055$ tar xvf libgcrypt-1.6.0.tar.bz2
1056$ tar xvf gnutls-3.2.7.tar.xz
1057$ tar xvf libmicrohttpd-0.9.33.tar.gz
1058$ tar xvf gnurl-7.34.0.tar.bz2
1059$ cd libav-0.9 ; ./configure --enable-shared;
1060$ make; sudo make install; cd ..
1061$ cd libextractor-1.3 ; ./configure;
1062$ make ; sudo make install; cd ..
1063$ cd libgpg-error-1.12; ./configure;
1064$ make ; sudo make install; cd ..
1065$ cd libgcrypt-1.6.0; ./configure --with-gpg-error-prefix=/usr/local;
1066$ make ; sudo make install ; cd ..
1067$ cd gnutls-3.2.7 ; ./configure;
1068$ make ; sudo make install ; cd ..
1069$ cd libmicrohttpd-0.9.33; ./configure;
1070$ make ; sudo make install ; cd ..
1071$ cd gnurl-7.34.0
1072$ ./configure --enable-ipv6 --with-gnutls=/usr/local --without-libssh2 \
1073 --without-libmetalink --without-winidn --without-librtmp \
1074 --without-nghttp2 --without-nss --without-cyassl --without-polarssl \
1075 --without-ssl --without-winssl --without-darwinssl --disable-sspi \
1076 --disable-ntlm-wb --disable-ldap --disable-rtsp --disable-dict \
1077 --disable-telnet --disable-tftp --disable-pop3 --disable-imap \
1078 --disable-smtp --disable-gopher --disable-file --disable-ftp
1079$ make ; sudo make install; cd ..
1080@end example
1081
1082@node Installing GNUnet from source
1083@subsection Installing GNUnet from source
1084
1085
1086For this, simply follow the generic installation instructions from
1087here.
1088
1089@node But wait there is more!
1090@subsection But wait there is more!
1091
1092So far, we installed all of the packages and dependencies required to
1093ensure that all of GNUnet would be built.
1094However, while for example the plugins to interact with the MySQL or
1095Postgres databases have been created, we did not actually install or
1096configure those databases. Thus, you will need to install
1097and configure those databases or stick with the default Sqlite database.
1098Sqlite is usually fine for most applications, but MySQL can offer better
1099performance and Postgres better resillience.
1100
1101
1102@node Installing GNUnet from Git on Ubuntu 14.4
1103@section Installing GNUnet from Git on Ubuntu 14.4
1104
1105@strong{Install the required build tools:}
1106
1107@example
1108$ sudo apt-get install git automake autopoint autoconf
1109@end example
1110
1111@strong{Install the required dependencies}
1112
1113@example
1114$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
1115 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
1116 libmicrohttpd-dev libgnutls28-dev
1117@end example
1118
1119@strong{Choose one or more database backends}
1120
1121@itemize @bullet
1122
1123@item SQLite3:
1124
1125@example
1126$ sudo apt-get install libsqlite3-dev
1127@end example
1128
1129@item MySQL:
1130
1131@example
1132$ sudo apt-get install libmysqlclient-dev
1133@end example
1134
1135@item PostgreSQL:
1136
1137@example
1138$ sudo apt-get install libpq-dev postgresql
1139@end example
1140
1141@end itemize
1142
1143@strong{Install the optional dependencies for gnunet-conversation:}
1144
1145@example
1146$ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev
1147@end example
1148
1149@strong{Install the libgrypt 1.6.1:}
1150
1151@itemize @bullet
1152
1153@item For Ubuntu 14.04:
1154
1155@example
1156$ sudo apt-get install libgcrypt20-dev
1157@end example
1158
1159@item For Ubuntu older 14.04:
1160
1161@example
1162$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2
1163$ tar xf libgcrypt-1.6.1.tar.bz2
1164$ cd libgcrypt-1.6.1
1165$ ./configure
1166$ sudo make install
1167$ cd ..
1168@end example
1169
1170@end itemize
1171
1172@strong{Install libgnurl}
1173
1174@example
1175$ wget https://gnunet.org/sites/default/files/gnurl-7.35.0.tar.bz2
1176$ tar xf gnurl-7.35.0.tar.bz2
1177$ cd gnurl-7.35.0
1178$ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
1179 --without-libmetalink --without-winidn --without-librtmp \
1180 --without-nghttp2 --without-nss --without-cyassl --without-polarssl \
1181 --without-ssl --without-winssl --without-darwinssl --disable-sspi \
1182 --disable-ntlm-wb --disable-ldap --disable-rtsp --disable-dict \
1183 --disable-telnet --disable-tftp --disable-pop3 --disable-imap \
1184 --disable-smtp --disable-gopher --disable-file --disable-ftp
1185$ sudo make install
1186$ cd ..
1187@end example
1188
1189@strong{Install GNUnet}
1190
1191@example
1192$ git clone https://gnunet.org/git/gnunet/
1193$ cd gnunet/
1194$ ./bootstrap
1195@end example
1196
1197If you want to:
1198
1199@itemize @bullet
1200
1201@item Install to a different directory:
1202
1203@example
1204--prefix=PREFIX
1205@end example
1206
1207@item
1208Have sudo permission, but do not want to compile as root:
1209
1210@example
1211--with-sudo
1212@end example
1213
1214@item
1215Want debug message enabled:
1216
1217@example
1218--enable-logging=verbose
1219@end example
1220
1221@end itemize
1222
1223
1224@example
1225$ ./configure [ --with-sudo | --prefix=PREFIX | --enable-logging=verbose]
1226$ make; sudo make install
1227@end example
1228
1229After installing it, you need to create an empty configuration file:
1230
1231@example
1232touch ~/.config/gnunet.conf
1233@end example
1234
1235And finally you can start GNUnet with
1236
1237@example
1238$ gnunet-arm -s
1239@end example
1240
1241@node Build instructions for Debian 8
1242@section Build instructions for Debian 8
1243@c FIXME: I -> we
1244
1245These are the installation instructions for Debian 8. They were tested
1246sing a fresh Debian 8 AMD64 installation without non-free software (no
1247contrib or non-free). During installation, I only selected "lxde" for the
1248desktop environment.
1249Note that the packages and the dependencies that we will install during
1250this chapter take about 1.5 GB of disk space. Combined with GNUnet and
1251space for objects during compilation, you should not even attempt this
1252unless you have about 2.5 GB free after the Debian installation.
1253Using these instructions to build a VM image is likely to require a
1254minimum of 4-5 GB for the VM (as you will likely also want a desktop
1255manager).
1256
1257GNUnet's security model assumes that your @code{/home} directory is
1258encrypted.
1259Thus, if possible, you should encrypt your entire disk, or at least just
1260your home partition (or per-user home directory).
1261
1262Naturally, the exact details of the starting state for your installation
1263should not matter much.
1264For example, if you selected any of those installation groups you might
1265simply already have some of the necessary packages installed. Thus, it is
1266suggested that you simply install the desktop environment of your choice
1267before beginning with the instructions.
1268
1269
1270@menu
1271* Update Debian::
1272* Installing Debian Packages::
1273* Installing Dependencies from Source2::
1274* Installing GNUnet from Source2::
1275* But wait (again) there is more!::
1276@end menu
1277
1278@node Update Debian
1279@subsection Update Debian
1280
1281After any installation, you should begin by running
1282
1283@example
1284# apt-get update
1285# apt-get upgrade
1286@end example
1287
1288to ensure that all of your packages are up-to-date. Note that the "#" is
1289used to indicate that you need to type in this command as "root" (or
1290prefix with "sudo"), whereas "$" is used to indicate typing in a command
1291as a normal user.
1292
1293@node Installing Debian Packages
1294@subsection Installing Debian Packages
1295
1296We begin by installing a few Debian packages from stable:
1297
1298@example
1299# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
1300libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev texlive \
1301libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev libbz2-dev \
1302libflac-dev libgif-dev libglib2.0-dev libgtk-3-dev libmpeg2-4-dev \
1303libtidy-dev libvorbis-dev libogg-dev zlib1g-dev g++ gettext \
1304libgsf-1-dev libunbound-dev libqrencode-dev libgladeui-dev nasm \
1305texlive-latex-extra libunique-3.0-dev gawk miniupnpc libfuse-dev \
1306libbluetooth-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
1307libgstreamer-plugins-base1.0-dev nettle-dev libextractor-dev \
1308libgcrypt20-dev libmicrohttpd-dev
1309@end example
1310
1311@node Installing Dependencies from Source2
1312@subsection Installing Dependencies from Source2
1313
1314Yes, we said we start with a Debian 8 "stable" system, but because Debian
1315linked GnuTLS without support for DANE, we need to compile a few things,
1316in addition to GNUnet, still by hand. Yes, you can run GNUnet using the
1317respective Debian packages, but then you will not get DANE support.
1318
1319Next, we need to install a few dependencies from source. You might want
1320to do this as a "normal" user and only run the @code{make install} steps
1321as root (hence the @code{sudo} in the commands below). Also, you do this
1322from any directory. We begin by downloading all dependencies, then
1323extracting the sources, and finally compiling and installing the
1324libraries:
1325
1326@example
1327$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.12.tar.xz
1328$ wget https://gnunet.org/sites/default/files/gnurl-7.40.0.tar.bz2
1329$ tar xvf gnutls-3.3.12.tar.xz
1330$ tar xvf gnurl-7.40.0.tar.bz2
1331$ cd gnutls-3.3.12 ; ./configure ; make ; sudo make install ; cd ..
1332$ cd gnurl-7.40.0
1333$ ./configure --enable-ipv6 --with-gnutls=/usr/local --without-libssh2 \
1334--without-libmetalink --without-winidn --without-librtmp \
1335--without-nghttp2 --without-nss --without-cyassl --without-polarssl \
1336--without-ssl --without-winssl --without-darwinssl --disable-sspi \
1337--disable-ntlm-wb --disable-ldap --disable-rtsp --disable-dict \
1338--disable-telnet --disable-tftp --disable-pop3 --disable-imap \
1339--disable-smtp --disable-gopher --disable-file --disable-ftp \
1340--disable-smb
1341$ make ; sudo make install; cd ..
1342@end example
1343
1344@node Installing GNUnet from Source2
1345@subsection Installing GNUnet from Source2
1346
1347For this, simply follow the generic installation instructions from@
1348here.
1349
1350@node But wait (again) there is more!
1351@subsection But wait (again) there is more!
1352
1353So far, we installed all of the packages and dependencies required to
1354ensure that all of GNUnet would be built. However, while for example the
1355plugins to interact with the MySQL or Postgres databases have been
1356created, we did not actually install or configure those databases.
1357Thus, you will need to install and configure those databases or stick
1358with the default Sqlite database. Sqlite is usually fine for most
1359applications, but MySQL can offer better performance and Postgres better
1360resillience.
1361
1362@node Outdated build instructions for previous revisions
1363@section Outdated build instructions for previous revisions
1364
1365This chapter contains a collection of outdated, older installation guides.
1366They are mostly intended to serve as a starting point for writing
1367up-to-date instructions and should not be expected to work for
1368GNUnet 0.10.x.
1369A set of older installation instructions can also be found in the
1370file @file{doc/outdated-and-old-installation-instructions.txt} in the
1371source tree of GNUnet.
1372
1373This file covers old instructions which no longer receive security
1374updates or any kind of support.
1375
1376@menu
1377* Installing GNUnet 0.10.1 on Ubuntu 14.04::
1378* Building GLPK for MinGW::
1379* GUI build instructions for Ubuntu 12.04 using Subversion::
1380@c * Installation with gnunet-update::
1381* Instructions for Microsoft Windows Platforms (Old)::
1382@end menu
1383
1384
1385@node Installing GNUnet 0.10.1 on Ubuntu 14.04
1386@subsection Installing GNUnet 0.10.1 on Ubuntu 14.04
1387
1388Install the required dependencies:
1389
1390@example
1391$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
1392 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
1393 libmicrohttpd-dev libgnutls28-dev
1394@end example
1395
1396Choose one or more database backends:
1397
1398@itemize @bullet
1399
1400@item SQLite3
1401
1402@example
1403 $ sudo apt-get install libsqlite3-dev@
1404@end example
1405
1406@item MySQL
1407
1408@example
1409$ sudo apt-get install libmysqlclient-dev@
1410@end example
1411
1412@item PostgreSQL
1413
1414@example
1415 $ sudo apt-get install libpq-dev postgresql@
1416@end example
1417
1418@end itemize
1419
1420Install the optional dependencies for gnunet-conversation:
1421
1422@example
1423 $ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev
1424@end example
1425
1426Install libgcrypt 1.6:
1427
1428@itemize @bullet
1429
1430@item For Ubuntu 14.04:
1431
1432@example
1433$ sudo apt-get install libgcrypt20-dev
1434@end example
1435
1436@item For Ubuntu older than 14.04:
1437
1438@example
1439wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2
1440$ tar xf libgcrypt-1.6.1.tar.bz2
1441$ cd libgcrypt-1.6.1
1442$ ./configure
1443$ sudo make install
1444$ cd ..
1445@end example
1446@end itemize
1447
1448Install libgnurl:
1449
1450@example
1451$ wget https://gnunet.org/sites/default/files/gnurl-7.35.0.tar.bz2
1452$ tar xf gnurl-7.35.0.tar.bz2
1453$ cd gnurl-7.35.0
1454$ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
1455--without-libmetalink --without-winidn --without-librtmp
1456--without-nghttp2 --without-nss --without-cyassl --without-polarssl \
1457--without-ssl --without-winssl --without-darwinssl --disable-sspi \
1458--disable-ntlm-wb --disable-ldap --disable-rtsp --disable-dict \
1459--disable-telnet --disable-tftp --disable-pop3 --disable-imap \
1460--disable-smtp --disable-gopher --disable-file --disable-ftp
1461$ sudo make install@
1462$ cd ..@
1463@end example
1464
1465Install GNUnet:
1466
1467@example
1468$ wget http://ftpmirror.gnu.org/gnunet/gnunet-0.10.1.tar.gz
1469$ tar xf gnunet-0.10.1.tar.gz
1470$ cd gnunet-0.10.1
1471@end example
1472
1473If you want to:
1474
1475@itemize @bullet
1476
1477@item
1478Install to a different directory:
1479
1480@example
1481--prefix=PREFIX
1482@end example
1483
1484@item
1485Have sudo permission, but do not want to compile as root:
1486
1487@example
1488--with-sudo
1489@end example
1490
1491@item
1492Want debug message enabled:
1493
1494@example
1495--enable-logging=verbose
1496@end example
1497
1498@end itemize
1499
1500@example
1501$ ./configure [ --with-sudo | --prefix=PREFIX | --enable-logging=verbose]
1502$ make; sudo make install
1503@end example
1504
1505After installing it, you need to create an empty configuration file:
1506
1507@example
1508touch ~/.config/gnunet.conf
1509@end example
1510
1511And finally you can start GNUnet with
1512
1513@example
1514$ gnunet-arm -s
1515@end example
1516
1517@node Building GLPK for MinGW
1518@subsection Building GLPK for MinGW
1519
1520GNUnet now requires the GNU Linear Programming Kit (GLPK).
1521Since there's is no package you can install with @code{mingw-get} you
1522have to compile it from source:
1523
1524@itemize @bullet
1525
1526@item Download the latest version from
1527@uref{http://ftp.gnu.org/gnu/glpk/}
1528
1529@item Unzip the downloaded source tarball using your favourite
1530unzipper application In the MSYS shell
1531
1532@item change to the respective directory
1533
1534@item Configure glpk for "i686-pc-mingw32":
1535
1536@example
1537./configure '--build=i686-pc-mingw32'
1538@end example
1539
1540@item run
1541
1542@example
1543make install check
1544@end example
1545
1546@end itemize
1547
1548MinGW does not automatically detect the correct buildtype so you have to
1549specify it manually.
1550
1551
1552@node GUI build instructions for Ubuntu 12.04 using Subversion
1553@subsection GUI build instructions for Ubuntu 12.04 using Subversion
1554
1555After installing GNUnet you can continue installing the GNUnet GUI tools:
1556
1557First, install the required dependencies:
1558
1559@example
1560$ sudo apt-get install libgladeui-dev libqrencode-dev
1561@end example
1562
1563Please ensure that the GNUnet shared libraries can be found by the linker.
1564If you installed GNUnet libraries in a non standard path
1565(say GNUNET_PREFIX=/usr/local/lib/), you can
1566
1567@itemize @bullet
1568
1569@item set the environmental variable permanently to:
1570
1571@example
1572LD_LIBRARY_PATH=$GNUNET_PREFIX
1573@end example
1574
1575@item or add @code{$GNUNET_PREFIX} to @file{/etc/ld.so.conf}
1576
1577@end itemize
1578
1579Now you can checkout and compile the GNUnet GUI tools:
1580
1581@example
1582$ git clone https://gnunet.org/git/gnunet-gtk
1583$ cd gnunet-gtk
1584$ ./bootstrap
1585$ ./configure --prefix=$GNUNET_PREFIX/.. --with-gnunet=$GNUNET_PREFIX/..
1586$ make install
1587@end example
1588
1589@c @node Installation with gnunet-update
1590@c @subsection Installation with gnunet-update
1591
1592@c gnunet-update project is an effort to introduce updates to GNUnet
1593@c installations. An interesting to-be-implemented-feature of gnunet-update
1594@c is that these updates are propagated through GNUnet's peer-to-peer
1595@c network. More information about gnunet-update can be found at
1596@c @c FIXME: Use correct cgit URL
1597@c @uref{https://gnunet.org/git/gnunet-update.git/tree/plain/README}.
1598
1599@c While the project is still under development, we have implemented the
1600@c following features which we believe may be helpful for users and we
1601@c would like them to be tested:
1602
1603@c @itemize @bullet
1604
1605@c @item
1606@c Packaging GNUnet installation along with its run-time dependencies into
1607@c update packages
1608
1609@c @item
1610@c Installing update packages into compatible hosts
1611
1612@c @item
1613@c Updating an existing installation (which had been installed by
1614@c gnunet-update) to a newer one
1615
1616@c @end itemize
1617
1618@c The above said features of gnunet-update are currently available for
1619@c testing on GNU/Linux systems.
1620
1621@c The following is a guide to help you get started with gnunet-update.
1622@c It shows you how to install the testing binary packages of GNUnet
1623@c 0.9.1 we have at @uref{https://gnunet.org/install/}.
1624
1625@c gnunet-update needs the following dependencies:
1626
1627@c @itemize @bullet
1628@c @item
1629@c python @geq{} 2.6
1630
1631@c @item
1632@c gnupg
1633
1634@c @item
1635@c python-gpgme
1636@c @end itemize
1637
1638
1639@c Checkout gnunet-update:
1640
1641@c @c FIXME: git!
1642@c @example
1643@c $ svn checkout -r24905 https://gnunet.org/svn/gnunet-update@
1644@c @end example
1645
1646@c For security reasons, all packages released for gnunet-update from us are
1647@c signed with the key at @uref{https://gnunet.org/install/key.txt}.
1648@c You would need to import this key into your gpg key ring.
1649@c gnunet-update uses this key to verify the integrity of the packages it
1650@c installs:
1651
1652@c @example
1653@c $ gpg --recv-keys 7C613D78@
1654@c @end example
1655
1656@c Download the packages relevant to your architecture (currently I have
1657@c access to GNU/Linux machines on x86_64 and i686, so only two for now,
1658@c hopefully more later) from https://gnunet.org/install/.
1659
1660@c To install the downloaded package into the directory /foo:
1661
1662@c @example
1663@c gnunet-update/bin/gnunet-update install downloaded/package /foo
1664@c @end example
1665
1666@c The installer reports the directories into which shared libraries and
1667@c dependencies have been installed. You may need to add the reported shared
1668@c library installation paths to LD_LIBRARY_PATH before you start running any
1669@c installed binaries.
1670
1671@c Please report bugs at https://gnunet.org/bugs/ under the project
1672@c 'gnunet-update'.
1673
1674@node Instructions for Microsoft Windows Platforms (Old)
1675@subsection Instructions for Microsoft Windows Platforms (Old)
1676
1677This document is a @b{DEPRECATED} installation guide for GNUnet on
1678Windows.
1679It will not work for recent GNUnet versions, but maybe it will be of
1680some use if problems arise.
1681
1682The Windows build uses a UNIX emulator for Windows,
1683@uref{http://www.mingw.org/, MinGW}, to build the executable modules.
1684These modules run natively on Windows and do not require additional
1685emulation software besides the usual dependencies.
1686
1687GNUnet development is mostly done under GNU/Linux and especially git
1688checkouts may not build out of the box.
1689We regret any inconvenience, and if you have problems, please report them.
1690
1691@menu
1692* Hardware and OS requirements::
1693* Software installation::
1694* Building libextractor and GNUnet::
1695* Installer::
1696* Source::
1697@end menu
1698
1699@node Hardware and OS requirements
1700@subsubsection Hardware and OS requirements
1701
1702@itemize @bullet
1703
1704@item Pentium II or equivalent processor, @geq{} 350 MHz
1705
1706@item 128 MB RAM
1707
1708@item 600 MB free disk space
1709
1710@item Windows 2000 or Windows XP are recommended
1711
1712@end itemize
1713
1714@node Software installation
1715@subsubsection Software installation
1716
1717@itemize @bullet
1718
1719@item
1720@strong{Compression software}@
1721
1722The software packages GNUnet depends on are usually compressed using UNIX
1723tools like @command{tar}, @command{gzip}, @command{xzip} and
1724@command{bzip2}.
1725If you do not already have an utility that is able to extract such
1726archives, get @uref{http://www.7-zip.org/, 7-Zip}.
1727
1728@item
1729@strong{UNIX environment}@
1730
1731The MinGW project provides the compiler toolchain that is used to build
1732GNUnet.
1733Get the following packages from the
1734@uref{http://sourceforge.net/projects/mingw/files/, MinGW} project:
1735
1736@itemize @bullet
1737
1738@item GCC core
1739@item GCC g++
1740@item MSYS
1741@item MSYS Developer Tool Kit (msysDTK)
1742@item MSYS Developer Tool Kit - msys-autoconf (bin)
1743@item MSYS Developer Tool Kit - msys-automake (bin)
1744@item MinGW Runtime
1745@item MinGW Utilities
1746@item Windows API
1747@item Binutils
1748@item make
1749@item pdcurses
1750@item GDB (snapshot)
1751@end itemize
1752
1753@itemize @bullet
1754
1755
1756@item Install MSYS (to c:\mingw, for example.)@
1757Do @strong{not} use spaces in the pathname.
1758For example, avoid a location such as @file{c:\program files\mingw}.
1759
1760@item Install MinGW runtime, utilities and GCC to a subdirectory
1761(to @file{c:\mingw\mingw}, for example)
1762
1763@item Install the Development Kit to the MSYS directory
1764(@file{c:\mingw})
1765
1766@item Create a batch file bash.bat in your MSYS directory with
1767the files:
1768
1769@example
1770bin\sh.exe --login
1771@end example
1772
1773This batch file opens a shell which is used to invoke the build
1774processes.
1775MinGW's standard shell (@command{msys.bat}) is not suitable
1776because it opens a separate console window.
1777On Vista, @command{bash.bat} needs to be run as Administrator.
1778
1779@item
1780Start @command{bash.sh} and rename
1781@file{c:\mingw\mingw\lib\libstdc++.la} to avoid problems:
1782
1783@example
1784mv /usr/mingw/lib/libstdc++.la /usr/mingw/lib/libstdc++.la.broken
1785@end example
1786
1787@item
1788Unpack the Windows API to the MinGW directory (@file{c:\mingw\mingw\}) and
1789remove the declaration of DATADIR from
1790(@file{c:\mingw\mingw\include\objidl.h} (lines 55-58)
1791
1792@item
1793Unpack autoconf, automake to the MSYS directory (@file{c:\mingw})
1794
1795@item
1796Install all other packages to the MinGW directory (@file{c:\mingw\mingw\})
1797@end itemize
1798
1799
1800@item @strong{GNU Libtool}@
1801GNU Libtool is required to use shared libraries.
1802Get the prebuilt package from here and unpack it to the
1803MinGW directory (@file{c:\mingw})
1804
1805@item @strong{Pthreads}@
1806GNUnet uses the portable POSIX thread library for multi-threading:
1807
1808@itemize @bullet
1809
1810@item Save
1811@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/libpthreadGC2.a, libpthreadGC2.a}
1812(x86) or
1813@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/libpthreadGC2.a, libpthreadGC2.a}
1814(x64) as libpthread.a into the @file{lib}
1815directory (@file{c:\mingw\mingw\lib\libpthread.a}).
1816
1817@item Save
1818@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/pthreadGC2.dll, pthreadGC2.dll}
1819(x86) or
1820@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/pthreadGC2.dll, libpthreadGC2.a}
1821(x64) into the MinGW @file{bin} directory (@file{c:\mingw\mingw\bin}).
1822
1823@item Download all header files from
1824@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/, include/}
1825to the @file{include} directory (@file{c:\mingw\mingw\include}).
1826@end itemize
1827
1828
1829@item @strong{GNU MP}@
1830GNUnet uses the GNU Multiple Precision library for special cryptographic
1831operations. Get the GMP binary package from the
1832@uref{http://sourceforge.net/projects/mingwrep/, MinGW repository} and
1833unpack it to the MinGW directory (@file{c:\mingw\mingw})
1834
1835@item @strong{GNU Gettext}@
1836GNU gettext is used to provide national language support.
1837Get the prebuilt package from hereand unpack it to the MinGW
1838directory (@file{c:\mingw\mingw})
1839
1840@item @strong{GNU iconv}@
1841GNU Libiconv is used for character encoding conversion.
1842Get the prebuilt package from here and unpack it to the MinGW
1843directory (@file{c:\mingw\mingw}).
1844
1845@item @strong{SQLite}@
1846GNUnet uses the SQLite database to store data.
1847Get the prebuilt binary from here and unpack it to your MinGW directory.
1848
1849@item @strong{MySQL}@
1850As an alternative to SQLite, GNUnet also supports MySQL.
1851
1852@itemize @bullet
1853
1854@item Get the binary installer from the
1855@uref{http://dev.mysql.com/downloads/mysql/4.1.html#Windows, MySQL project}
1856(version 4.1), install it and follow the instructions in
1857@file{README.mysql}.
1858
1859@item Create a temporary build directory (@file{c:\mysql})
1860
1861@item Copy the directories @file{include\} and @file{lib\} from the
1862MySQL directory to the new directory
1863
1864@item Get the patches from
1865@uref{http://bugs.mysql.com/bug.php?id=8906&files=1, Bug #8906} and
1866@uref{http://bugs.mysql.com/bug.php?id=8872&files=1, Bug #8872} (the
1867latter is only required for MySQL
1868
1869@example
1870patch -p 0
1871@end example
1872
1873@item Move @file{lib\opt\libmysql.dll} to @file{lib\libmysql.dll}
1874
1875@item Change to @file{lib\} and create an import library:
1876
1877@example
1878dlltool --input-def ../include/libmySQL.def \
1879--dllname libmysql.dll \
1880--output-lib libmysqlclient.a -k
1881@end example
1882
1883@item Copy include\* to include\mysql\
1884
1885@item Pass "@code{--with-mysql=/c/mysql}" to
1886@command{./configure} and copy @file{libmysql.dll}
1887to your PATH or GNUnet's @file{bin} directory
1888@end itemize
1889
1890
1891@item @strong{GTK+}@
1892@command{gnunet-gtk} and @command{libextractor} depend on GTK.
1893Get the the binary and developer packages of @command{atk},
1894@command{glib}, @command{gtk}, @command{iconv},
1895@command{gettext-runtime}, @command{pango} from
1896@uref{ftp://ftp.gtk.org/pub/gtk/v2.6/win32, gtk.org} and unpack them
1897to the MinGW directory (@file{c:\mingw\mingw}).
1898@c FIXME: The URL below for pkg-config seems wrong.
1899Get @uref{http://www.gtk.org/download/win32.php, pkg-config} and
1900@command{libpng} and unpack them to the MinGW directory
1901(@file{c:\mingw\mingw}).
1902Here is an all-in-one package for the
1903@uref{http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip, gtk+dependencies}
1904. Do not overwrite any existing files!
1905
1906@item @strong{Glade}@
1907@command{gnunet-gtk} and @command{gnunet-setup} were created using
1908this interface builder
1909
1910@itemize @bullet
1911
1912@item Get the Glade and libglade (-bin and -devel) packages
1913(without GTK!) from
1914@uref{http://gladewin32.sourceforge.net/, GladeWin32} and unpack them to
1915the MinGW directory (@file{c:\mingw\mingw}).
1916
1917@item Get @command{libxml} from here and unpack it to the MinGW
1918directory (@file{c:\mingw\mingw}).
1919@end itemize
1920
1921@c FIXME: URLs
1922@item @strong{zLib}@
1923@command{libextractor} requires @command{zLib} to decompress some file
1924formats. GNUnet uses it to (de)compress meta-data.
1925Get zLib from here (Signature) and unpack it to the MinGW directory
1926(@file{c:\mingw\mingw}).
1927
1928@item @strong{Bzip2}@
1929@command{libextractor} also requires @command{Bzip2} to
1930decompress some file formats.
1931Get the Bzip2 (binary and developer package) from
1932@uref{http://gnuwin32.sourceforge.net/packages/bzip2.htm, GnuWin32} and
1933unpack it to the MinGW directory (@file{c:\mingw\mingw}).
1934
1935@item @strong{Libgcrypt}@
1936@command{Libgcrypt} provides the cryptographic functions used by GNUnet.
1937Get Libgcrypt from @uref{ftp://ftp.gnupg.org/gcrypt/libgcrypt/, here},
1938compile and place it in the MinGW directory
1939(@file{c:\mingw\mingw}). Currently libgcrypt @geq{} 1.4.2 is required to
1940compile GNUnet.
1941
1942@item @strong{PlibC}@
1943PlibC emulates Unix functions under Windows. Get PlibC from here and
1944unpack it to the MinGW directory (c:\mingw\mingw)
1945
1946@item @strong{OGG Vorbis}@
1947@command{OGG Vorbis} is used to extract meta-data from @file{.ogg} files.
1948Get the packages
1949@uref{http://www.gnunet.org/libextractor/download/win/libogg-1.1.4.zip, libogg}
1950and
1951@uref{http://www.gnunet.org/libextractor/download/win/libvorbis-1.2.3.zip, libvorbis}
1952from the
1953@uref{http://ftp.gnu.org/gnu/libextractor/libextractor-w32-1.0.0.zip, libextractor win32 build}
1954and unpack them to the MinGW directory (c:\mingw\mingw).
1955
1956@item @strong{Exiv2}@
1957(lib)Exiv2 is used to extract meta-data from files with Exiv2 meta-data.
1958Download
1959@uref{http://www.gnunet.org/libextractor/download/win/exiv2-0.18.2.zip, Exiv2}
1960and unpack it to the MSYS directory (c:\mingw).
1961@end itemize
1962
1963@node Building libextractor and GNUnet
1964@subsubsection Building libextractor and GNUnet
1965
1966Before you compile @command{libextractor} or @command{GNUnet},
1967be sure to set @code{PKG_CONFIG_PATH}:
1968
1969@example
1970export PKG_CONFIG_PATH=/mingw/lib/pkgconfig
1971@end example
1972
1973@noindent
1974@xref{GNUnet Installation Handbook}, for basic instructions on building
1975@command{libextractor} and @command{GNUnet}.
1976By default, all modules that are created in this way contain
1977debug information and are quite large. To compile release versions
1978(small and fast) set the variable @code{CFLAGS}:
1979
1980@example
1981export CFLAGS='-O2 -march=pentium -fomit-frame-pointer'
1982./configure --prefix=$HOME --with-extractor=$HOME
1983@end example
1984
1985@node Installer
1986@subsubsection Installer
1987
1988The GNUnet installer is made with
1989@uref{http://nsis.sourceforge.net/, NSIS}. The installer script is
1990located in @file{contrib\win} in the GNUnet source tree.
1991
1992@node Source
1993@subsubsection Source
1994
1995@c FIXME: URL
1996The sources of all dependencies are available here.
1997
1998@c @node Portable GNUnet
1999@c @section Portable GNUnet
2000
2001@c Quick instructions on how to use the most recent GNUnet on most GNU/Linux
2002@c distributions
2003
2004@c Currently this has only been tested on Ubuntu 12.04, 12.10, 13.04, Debian
2005@c and CentOS 6, but it should work on almost any GNU/Linux distribution.
2006@c More in-detail information can be found in the handbook.
2007
2008@c Note 2017-10: Currently this section assumes the old SVN repo of GNUnet
2009@c which no longer exists.
2010
2011@c @menu
2012@c * Prerequisites::
2013@c * Download & set up gnunet-update::
2014@c * Install GNUnet::
2015@c @end menu
2016
2017@c @node Prerequisites
2018@c @subsection Prerequisites
2019
2020@c Open a terminal and paste this line into it to install all required tools
2021@c needed:
2022
2023@c @example
2024@c sudo apt-get install python-gpgme subversion
2025@c @end example
2026
2027@c @node Download & set up gnunet-update
2028@c @subsection Download & set up gnunet-update
2029
2030@c The following command will download a working version of gnunet-update
2031@c with the subversion tool and import the public key which is needed for
2032@c authentication:
2033
2034@c @example
2035@c svn checkout -r24905 https://gnunet.org/svn/gnunet-update ~/gnunet-update
2036@c cd ~/gnunet-update
2037@c gpg --keyserver "hkp://keys.gnupg.net" --recv-keys 7C613D78
2038@c @end example
2039
2040@c @node Install GNUnet
2041@c @subsection Install GNUnet
2042
2043@c Download and install GNUnet binaries which can be found here and set
2044@c library paths:
2045
2046@c @example
2047@c wget -P /tmp https://gnunet.org/install/packs/gnunet-0.9.4-`uname -m`.tgz
2048@c ./bin/gnunet-update install /tmp/gnunet-0.9*.tgz ~
2049@c echo "PATH DEFAULT=$@{PATH@}:$HOME/bin" >> ~/.pam_environment
2050@c echo -e "$@{HOME@}/lib\n$@{HOME@}/lib/gnunet-deps" | sudo tee \
2051@c /etc/ld.so.conf.d/gnunet.conf > /dev/null
2052@c sudo ldconfig
2053@c @end example
2054
2055@c You may need to re-login once after executing these last commands
2056
2057@c That's it, GNUnet is installed in your home directory now. GNUnet can be
2058@c configured and afterwards started by executing:
2059
2060@c @example
2061@c gnunet-arm -s
2062@c @end example
2063
2064@node The graphical configuration interface
2065@section The graphical configuration interface
2066
2067If you also would like to use @command{gnunet-gtk} and
2068@command{gnunet-setup} (highly recommended for beginners), do:
2069
2070@example
2071wget -P /tmp \
2072https://gnunet.org/install/packs/gnunet-0.9.4-gtk-0.9.4-`uname -m`.tgz
2073sh ~/gnunet-update/bin/gnunet-update install /tmp/gnunet-*gtk*.tgz ~
2074sudo ldconfig
2075@end example
2076
2077Now you can run @command{gnunet-setup} for easy configuration of your
2078GNUnet peer.
2079
2080@menu
2081* Configuring your peer::
2082* Configuring the Friend-to-Friend (F2F) mode::
2083* Configuring the hostlist to bootstrap::
2084* Configuration of the HOSTLIST proxy settings::
2085* Configuring your peer to provide a hostlist ::
2086* Configuring the datastore::
2087* Configuring the MySQL database::
2088* Reasons for using MySQL::
2089* Reasons for not using MySQL::
2090* Setup Instructions::
2091* Testing::
2092* Performance Tuning::
2093* Setup for running Testcases::
2094* Configuring the Postgres database::
2095* Reasons to use Postgres::
2096* Reasons not to use Postgres::
2097* Manual setup instructions::
2098* Testing the setup manually::
2099* Configuring the datacache::
2100* Configuring the file-sharing service::
2101* Configuring logging::
2102* Configuring the transport service and plugins::
2103* Configuring the wlan transport plugin::
2104* Configuring HTTP(S) reverse proxy functionality using Apache or nginx::
2105* Blacklisting peers::
2106* Configuration of the HTTP and HTTPS transport plugins::
2107* Configuring the GNU Name System::
2108* Configuring the GNUnet VPN::
2109* Bandwidth Configuration::
2110* Configuring NAT::
2111* Peer configuration for distributions::
2112@end menu
2113
2114@node Configuring your peer
2115@subsection Configuring your peer
2116
2117This chapter will describe the various configuration options in GNUnet.
2118
2119The easiest way to configure your peer is to use the
2120@command{gnunet-setup} tool.
2121@command{gnunet-setup} is part of the @command{gnunet-gtk}
2122application. You might have to install it separately.
2123
2124Many of the specific sections from this chapter actually are linked from
2125within @command{gnunet-setup} to help you while using the setup tool.
2126
2127While you can also configure your peer by editing the configuration
2128file by hand, this is not recommended for anyone except for developers
2129as it requires a more in-depth understanding of the configuration files
2130and internal dependencies of GNUnet.
2131
2132
2133@node Configuring the Friend-to-Friend (F2F) mode
2134@subsection Configuring the Friend-to-Friend (F2F) mode
2135
2136GNUnet knows three basic modes of operation:
2137@itemize @bullet
2138@item In standard "peer-to-peer" mode,
2139your peer will connect to any peer.
2140@item In the pure "friend-to-friend"
2141mode, your peer will ONLY connect to peers from a list of friends
2142specified in the configuration.
2143@item Finally, in mixed mode,
2144GNUnet will only connect to arbitrary peers if it
2145has at least a specified number of connections to friends.
2146@end itemize
2147
2148When configuring any of the F2F ("friend-to-friend") modes,
2149you first need to create a file with the peer identities
2150of your friends. Ask your friends to run
2151
2152@example
2153$ gnunet-peerinfo -sq
2154@end example
2155
2156@noindent
2157The resulting output of this command needs to be added to your
2158@file{friends} file, which is simply a plain text file with one line
2159per friend with the output from the above command.
2160
2161You then specify the location of your @file{friends} file in the
2162"FRIENDS" option of the "topology" section.
2163
2164Once you have created the @file{friends} file, you can tell GNUnet to only
2165connect to your friends by setting the "FRIENDS-ONLY" option (again in
2166the "topology" section) to YES.
2167
2168If you want to run in mixed-mode, set "FRIENDS-ONLY" to NO and configure a
2169minimum number of friends to have (before connecting to arbitrary peers)
2170under the "MINIMUM-FRIENDS" option.
2171
2172If you want to operate in normal P2P-only mode, simply set
2173"MINIMUM-FRIENDS" to zero and "FRIENDS_ONLY" to NO.
2174This is the default.
2175
2176@node Configuring the hostlist to bootstrap
2177@subsection Configuring the hostlist to bootstrap
2178
2179After installing the software you need to get connected to the GNUnet
2180network. The configuration file included in your download is already
2181configured to connect you to the GNUnet network.
2182In this section the relevant configuration settings are explained.
2183
2184To get an initial connection to the GNUnet network and to get to know
2185peers already connected to the network you can use the so called
2186"bootstrap servers".
2187These servers can give you a list of peers connected to the network.
2188To use these bootstrap servers you have to configure the hostlist daemon
2189to activate bootstrapping.
2190
2191To activate bootstrapping, edit the @code{[hostlist]}-section in your
2192configuration file. You have to set the argument "-b" in the
2193options line:
2194
2195@example
2196[hostlist]
2197OPTIONS = -b
2198@end example
2199
2200Additionally you have to specify which server you want to use.
2201The default bootstrapping server is
2202"@uref{http://v10.gnunet.org/hostlist, http://v10.gnunet.org/hostlist}".
2203[^] To set the server you have to edit the line "SERVERS" in the hostlist
2204section. To use the default server you should set the lines to
2205
2206@example
2207SERVERS = http://v10.gnunet.org/hostlist [^]
2208@end example
2209
2210@noindent
2211To use bootstrapping your configuration file should include these lines:
2212
2213@example
2214[hostlist]
2215OPTIONS = -b
2216SERVERS = http://v10.gnunet.org/hostlist [^]
2217@end example
2218
2219@noindent
2220Besides using bootstrap servers you can configure your GNUnet peer to
2221recieve hostlist advertisements.
2222Peers offering hostlists to other peers can send advertisement messages
2223to peers that connect to them. If you configure your peer to receive these
2224messages, your peer can download these lists and connect to the peers
2225included. These lists are persistent, which means that they are saved to
2226your hard disk regularly and are loaded during startup.
2227
2228To activate hostlist learning you have to add the "-e" switch to the
2229OPTIONS line in the hostlist section:
2230
2231@example
2232[hostlist]
2233OPTIONS = -b -e
2234@end example
2235
2236@noindent
2237Furthermore you can specify in which file the lists are saved.
2238To save the lists in the file "hostlists.file" just add the line:
2239
2240@example
2241HOSTLISTFILE = hostlists.file
2242@end example
2243
2244@noindent
2245Best practice is to activate both bootstrapping and hostlist learning.
2246So your configuration file should include these lines:
2247
2248@example
2249[hostlist]
2250OPTIONS = -b -e
2251HTTPPORT = 8080
2252SERVERS = http://v10.gnunet.org/hostlist [^]
2253HOSTLISTFILE = $SERVICEHOME/hostlists.file
2254@end example
2255
2256@node Configuration of the HOSTLIST proxy settings
2257@subsection Configuration of the HOSTLIST proxy settings
2258
2259The hostlist client can be configured to use a proxy to connect to the
2260hostlist server.
2261This functionality can be configured in the configuration file directly
2262or using the gnunet-setup tool.
2263
2264The hostlist client supports the following proxy types at the moment:
2265
2266@itemize @bullet
2267@item HTTP and HTTP 1.0 only proxy
2268@item SOCKS 4/4a/5/5 with hostname
2269@end itemize
2270
2271In addition authentication at the proxy with username and password can be
2272configured.
2273
2274To configure proxy support for the hostlist client in the
2275@command{gnunet-setup} tool, select the "hostlist" tab and select
2276the appropriate proxy type.
2277The hostname or IP address (including port if required) has to be entered
2278in the "Proxy hostname" textbox. If required, enter username and password
2279in the "Proxy username" and "Proxy password" boxes.
2280Be aware that this information will be stored in the configuration in
2281plain text (TODO: Add explanation and generalize the part in Chapter 3.6
2282about the encrypted home).
2283
2284To provide these options directly in the configuration, you can
2285enter the following settings in the @code{[hostlist]} section of
2286the configuration:
2287
2288@example
2289# Type of proxy server,
2290# Valid values: HTTP, HTTP_1_0, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
2291# Default: HTTP
2292# PROXY_TYPE = HTTP
2293
2294# Hostname or IP of proxy server
2295# PROXY =
2296# User name for proxy server
2297# PROXY_USERNAME =
2298# User password for proxy server
2299# PROXY_PASSWORD =
2300@end example
2301
2302@node Configuring your peer to provide a hostlist
2303@subsection Configuring your peer to provide a hostlist
2304
2305If you operate a peer permanently connected to GNUnet you can configure
2306your peer to act as a hostlist server, providing other peers the list of
2307peers known to him.
2308
2309Yor server can act as a bootstrap server and peers needing to obtain a
2310list of peers can contact it to download this list.
2311To download this hostlist the peer uses HTTP.
2312For this reason you have to build your peer with libcurl and microhttpd
2313support. How you build your peer with this options can be found here:
2314@uref{https://gnunet.org/generic_installation}
2315
2316To configure your peer to act as a bootstrap server you have to add the
2317"@code{-p}" option to OPTIONS in the @code{[hostlist]} section of your
2318configuration file. Besides that you have to specify a port number for
2319the http server.
2320In conclusion you have to add the following lines:
2321
2322@example
2323[hostlist]
2324HTTPPORT = 12980
2325OPTIONS = -p
2326@end example
2327
2328@noindent
2329If your peer acts as a bootstrap server other peers should know about
2330that. You can advertise the hostlist your are providing to other peers.
2331Peers connecting to your peer will get a message containing an
2332advertisement for your hostlist and the URL where it can be downloaded.
2333If this peer is in learning mode, it will test the hostlist and, in the
2334case it can obtain the list successfully, it will save it for
2335bootstrapping.
2336
2337To activate hostlist advertisement on your peer, you have to set the
2338following lines in your configuration file:
2339
2340@example
2341[hostlist]
2342EXTERNAL_DNS_NAME = example.org
2343HTTPPORT = 12981
2344OPTIONS = -p -a
2345@end example
2346
2347@noindent
2348With this configuration your peer will a act as a bootstrap server and
2349advertise this hostlist to other peers connecting to it.
2350The URL used to download the list will be
2351@code{@uref{http://example.org:12981/, http://example.org:12981/}}.
2352
2353Please notice:
2354
2355@itemize @bullet
2356@item The hostlist is not human readable, so you should not try to
2357download it using your webbrowser. Just point your GNUnet peer to the
2358address!
2359@item Advertising without providing a hostlist does not make sense and
2360will not work.
2361@end itemize
2362
2363@node Configuring the datastore
2364@subsection Configuring the datastore
2365
2366The datastore is what GNUnet uses to for long-term storage of file-sharing
2367data. Note that long-term does not mean 'forever' since content does have
2368an expiration date, and of course storage space is finite (and hence
2369sometimes content may have to be discarded).
2370
2371Use the "QUOTA" option to specify how many bytes of storage space you are
2372willing to dedicate to GNUnet.
2373
2374In addition to specifying the maximum space GNUnet is allowed to use for
2375the datastore, you need to specify which database GNUnet should use to do
2376so. Currently, you have the choice between sqLite, MySQL and Postgres.
2377
2378@node Configuring the MySQL database
2379@subsection Configuring the MySQL database
2380
2381This section describes how to setup the MySQL database for GNUnet.
2382
2383Note that the mysql plugin does NOT work with mysql before 4.1 since we
2384need prepared statements.
2385We are generally testing the code against MySQL 5.1 at this point.
2386
2387@node Reasons for using MySQL
2388@subsection Reasons for using MySQL
2389
2390@itemize @bullet
2391
2392@item On up-to-date hardware wher
2393mysql can be used comfortably, this module
2394will have better performance than the other database choices (according
2395to our tests).
2396
2397@item Its often possible to recover the mysql database from internal
2398inconsistencies. Some of the other databases do not support repair.
2399@end itemize
2400
2401@node Reasons for not using MySQL
2402@subsection Reasons for not using MySQL
2403
2404@itemize @bullet
2405@item Memory usage (likely not an issue if you have more than 1 GB)
2406@item Complex manual setup
2407@end itemize
2408
2409@node Setup Instructions
2410@subsection Setup Instructions
2411
2412@itemize @bullet
2413
2414@item In @code{gnunet.conf} set in section "DATASTORE" the value for
2415"DATABASE" to "mysql".
2416
2417@item Access mysql as root:
2418
2419@example
2420$ mysql -u root -p
2421@end example
2422
2423@noindent
2424and issue the following commands, replacing $USER with the username
2425that will be running gnunet-arm (so typically "gnunet"):
2426
2427@example
2428CREATE DATABASE gnunet;
2429GRANT select,insert,update,delete,create,alter,drop,create \
2430temporary tables ON gnunet.* TO $USER@@localhost;
2431SET PASSWORD FOR $USER@@localhost=PASSWORD('$the_password_you_like');
2432FLUSH PRIVILEGES;
2433@end example
2434
2435@item
2436In the $HOME directory of $USER, create a "@file{.my.cnf}" file with the
2437following lines
2438
2439@example
2440[client]
2441user=$USER
2442password=$the_password_you_like
2443@end example
2444
2445@end itemize
2446
2447Thats it. Note that @file{.my.cnf} file is a slight security risk unless
2448its on a safe partition. The @file{$HOME/.my.cnf} can of course be
2449a symbolic link.
2450Luckily $USER has only priviledges to mess up GNUnet's tables,
2451which should be pretty harmless.
2452
2453@node Testing
2454@subsection Testing
2455
2456You should briefly try if the database connection works. First, login
2457as $USER. Then use:
2458
2459@example
2460$ mysql -u $USER
2461mysql> use gnunet;
2462@end example
2463
2464@noindent
2465If you get the message "Database changed" it probably works.
2466
2467If you get "ERROR 2002: Can't connect to local MySQL server@
2468through socket '/tmp/mysql.sock' (2)" it may be resolvable by
2469
2470@example
2471ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
2472@end example
2473
2474so there may be some additional trouble depending on your mysql setup.
2475
2476@node Performance Tuning
2477@subsection Performance Tuning
2478
2479For GNUnet, you probably want to set the option
2480
2481@example
2482innodb_flush_log_at_trx_commit = 0
2483@end example
2484
2485@noindent
2486for a rather dramatic boost in MySQL performance. However, this reduces
2487the "safety" of your database as with this options you may loose
2488transactions during a power outage.
2489While this is totally harmless for GNUnet, the option applies to all
2490applications using MySQL. So you should set it if (and only if) GNUnet is
2491the only application on your system using MySQL.
2492
2493@node Setup for running Testcases
2494@subsection Setup for running Testcases
2495
2496If you want to run the testcases, you must create a second database
2497"gnunetcheck" with the same username and password. This database will
2498then be used for testing ("make check").
2499
2500@node Configuring the Postgres database
2501@subsection Configuring the Postgres database
2502
2503This text describes how to setup the Postgres database for GNUnet.
2504
2505This Postgres plugin was developed for Postgres 8.3 but might work for
2506earlier versions as well.
2507
2508@node Reasons to use Postgres
2509@subsection Reasons to use Postgres
2510
2511@itemize @bullet
2512@item Easier to setup than MySQL
2513@item Real database
2514@end itemize
2515
2516@node Reasons not to use Postgres
2517@subsection Reasons not to use Postgres
2518
2519@itemize @bullet
2520@item Quite slow
2521@item Still some manual setup required
2522@end itemize
2523
2524@node Manual setup instructions
2525@subsection Manual setup instructions
2526
2527@itemize @bullet
2528@item In @code{gnunet.conf} set in section "DATASTORE" the value for
2529"DATABASE" to "postgres".
2530@item Access Postgres to create a user:@
2531
2532@table @asis
2533@item with Postgres 8.x, use:
2534
2535@example
2536# su - postgres
2537$ createuser
2538@end example
2539
2540@noindent
2541and enter the name of the user running GNUnet for the role interactively.
2542Then, when prompted, do not set it to superuser, allow the creation of
2543databases, and do not allow the creation of new roles.@
2544
2545@item with Postgres 9.x, use:
2546
2547@example
2548# su - postgres
2549$ createuser -d $GNUNET_USER
2550@end example
2551
2552@noindent
2553where $GNUNET_USER is the name of the user running GNUnet.@
2554
2555@end table
2556
2557
2558@item
2559As that user (so typically as user "gnunet"), create a database (or two):
2560
2561@example
2562$ createdb gnunet
2563# this way you can run "make check"
2564$ createdb gnunetcheck
2565@end example
2566
2567@end itemize
2568
2569Now you should be able to start @code{gnunet-arm}.
2570
2571@node Testing the setup manually
2572@subsection Testing the setup manually
2573
2574You may want to try if the database connection works. First, again login
2575as the user who will run @command{gnunet-arm}. Then use:
2576
2577@example
2578$ psql gnunet # or gnunetcheck
2579gnunet=> \dt
2580@end example
2581
2582@noindent
2583If, after you have started @command{gnunet-arm} at least once, you get
2584a @code{gn090} table here, it probably works.
2585
2586@node Configuring the datacache
2587@subsection Configuring the datacache
2588@c %**end of header
2589
2590The datacache is what GNUnet uses for storing temporary data. This data is
2591expected to be wiped completely each time GNUnet is restarted (or the
2592system is rebooted).
2593
2594You need to specify how many bytes GNUnet is allowed to use for the
2595datacache using the "QUOTA" option in the section "dhtcache".
2596Furthermore, you need to specify which database backend should be used to
2597store the data. Currently, you have the choice between
2598sqLite, MySQL and Postgres.
2599
2600@node Configuring the file-sharing service
2601@subsection Configuring the file-sharing service
2602
2603In order to use GNUnet for file-sharing, you first need to make sure
2604that the file-sharing service is loaded.
2605This is done by setting the AUTOSTART option in section "fs" to "YES".
2606Alternatively, you can run
2607
2608@example
2609$ gnunet-arm -i fs
2610@end example
2611
2612@noindent
2613to start the file-sharing service by hand.
2614
2615Except for configuring the database and the datacache the only important
2616option for file-sharing is content migration.
2617
2618Content migration allows your peer to cache content from other peers as
2619well as send out content stored on your system without explicit requests.
2620This content replication has positive and negative impacts on both system
2621performance and privacy.
2622
2623FIXME: discuss the trade-offs. Here is some older text about it...
2624
2625Setting this option to YES allows gnunetd to migrate data to the local
2626machine. Setting this option to YES is highly recommended for efficiency.
2627Its also the default. If you set this value to YES, GNUnet will store
2628content on your machine that you cannot decrypt.
2629While this may protect you from liability if the judge is sane, it may
2630not (IANAL). If you put illegal content on your machine yourself, setting
2631this option to YES will probably increase your chances to get away with it
2632since you can plausibly deny that you inserted the content.
2633Note that in either case, your anonymity would have to be broken first
2634(which may be possible depending on the size of the GNUnet network and the
2635strength of the adversary).
2636
2637@node Configuring logging
2638@subsection Configuring logging
2639
2640Logging in GNUnet 0.9.0 is controlled via the "-L" and "-l" options.
2641Using "-L", a log level can be specified. With log level "@code{ERROR}"
2642only serious errors are logged.
2643The default log level is "@code{WARNING}" which causes anything of
2644concern to be logged.
2645Log level "@code{INFO}" can be used to log anything that might be
2646interesting information whereas
2647"@code{DEBUG}" can be used by developers to log debugging messages
2648(but you need to run @code{./configure} with
2649@code{--enable-logging=verbose} to get them compiled).
2650The "-l" option is used to specify the log file.
2651
2652Since most GNUnet services are managed by @code{gnunet-arm}, using the
2653"-l" or "-L" options directly is not possible.
2654Instead, they can be specified using the "OPTIONS" configuration value in
2655the respective section for the respective service.
2656In order to enable logging globally without editing the "OPTIONS" values
2657for each service, @code{gnunet-arm} supports a "GLOBAL_POSTFIX" option.
2658The value specified here is given as an extra option to all services for
2659which the configuration does contain a service-specific "OPTIONS" field.
2660
2661"GLOBAL_POSTFIX" can contain the special sequence "@{@}" which is replaced
2662by the name of the service that is being started. Furthermore,
2663@code{GLOBAL_POSTFIX} is special in that sequences starting with "$"
2664anywhere in the string are expanded (according to options in "PATHS");
2665this expansion otherwise is only happening for filenames and then the "$"
2666must be the first character in the option. Both of these restrictions do
2667not apply to "GLOBAL_POSTFIX".
2668Note that specifying @code{%} anywhere in the "GLOBAL_POSTFIX" disables
2669both of these features.
2670
2671In summary, in order to get all services to log at level "INFO" to
2672log-files called @code{SERVICENAME-logs}, the following global prefix
2673should be used:
2674
2675@example
2676GLOBAL_POSTFIX = -l $SERVICEHOME/@{@}-logs -L INFO
2677@end example
2678
2679@node Configuring the transport service and plugins
2680@subsection Configuring the transport service and plugins
2681
2682The transport service in GNUnet is responsible to maintain basic
2683connectivity to other peers.
2684Besides initiating and keeping connections alive it is also responsible
2685for address validation.
2686
2687The GNUnet transport supports more than one transport protocol.
2688These protocols are configured together with the transport service.
2689
2690The configuration section for the transport service itself is quite
2691similar to all the other services
2692
2693@example
2694AUTOSTART = YES
2695@@UNIXONLY@@ PORT = 2091
2696HOSTNAME = localhost
2697HOME = $SERVICEHOME
2698CONFIG = $DEFAULTCONFIG
2699BINARY = gnunet-service-transport
2700#PREFIX = valgrind
2701NEIGHBOUR_LIMIT = 50
2702ACCEPT_FROM = 127.0.0.1;
2703ACCEPT_FROM6 = ::1;
2704PLUGINS = tcp udp
2705UNIXPATH = /tmp/gnunet-service-transport.sock
2706@end example
2707
2708Different are the settings for the plugins to load @code{PLUGINS}.
2709The first setting specifies which transport plugins to load.
2710
2711@itemize @bullet
2712@item transport-unix
2713A plugin for local only communication with UNIX domain sockets. Used for
2714testing and available on unix systems only. Just set the port
2715
2716@example
2717[transport-unix]
2718PORT = 22086
2719TESTING_IGNORE_KEYS = ACCEPT_FROM;
2720@end example
2721
2722@item transport-tcp
2723A plugin for communication with TCP. Set port to 0 for client mode with
2724outbound only connections
2725
2726@example
2727[transport-tcp]
2728# Use 0 to ONLY advertise as a peer behind NAT (no port binding)
2729PORT = 2086
2730ADVERTISED_PORT = 2086
2731TESTING_IGNORE_KEYS = ACCEPT_FROM;
2732# Maximum number of open TCP connections allowed
2733MAX_CONNECTIONS = 128
2734@end example
2735
2736@item transport-udp
2737A plugin for communication with UDP. Supports peer discovery using
2738broadcasts.
2739
2740@example
2741[transport-udp]
2742PORT = 2086
2743BROADCAST = YES
2744BROADCAST_INTERVAL = 30 s
2745MAX_BPS = 1000000
2746TESTING_IGNORE_KEYS = ACCEPT_FROM;
2747@end example
2748
2749@item transport-http
2750HTTP and HTTPS support is split in two part: a client plugin initiating
2751outbound connections and a server part accepting connections from the
2752client. The client plugin just takes the maximum number of connections as
2753an argument.
2754
2755@example
2756[transport-http_client]
2757MAX_CONNECTIONS = 128
2758TESTING_IGNORE_KEYS = ACCEPT_FROM;
2759@end example
2760
2761@example
2762[transport-https_client]
2763MAX_CONNECTIONS = 128
2764TESTING_IGNORE_KEYS = ACCEPT_FROM;
2765@end example
2766
2767@noindent
2768The server has a port configured and the maximum nunber of connections.
2769The HTTPS part has two files with the certificate key and the certificate
2770file.
2771
2772The server plugin supports reverse proxies, so a external hostname can be
2773set using the @code{EXTERNAL_HOSTNAME} setting.
2774The webserver under this address should forward the request to the peer
2775and the configure port.
2776
2777@example
2778[transport-http_server]
2779EXTERNAL_HOSTNAME = fulcrum.net.in.tum.de/gnunet
2780PORT = 1080
2781MAX_CONNECTIONS = 128
2782TESTING_IGNORE_KEYS = ACCEPT_FROM;
2783@end example
2784
2785@example
2786[transport-https_server]
2787PORT = 4433
2788CRYPTO_INIT = NORMAL
2789KEY_FILE = https.key
2790CERT_FILE = https.cert
2791MAX_CONNECTIONS = 128
2792TESTING_IGNORE_KEYS = ACCEPT_FROM;
2793@end example
2794
2795@item transport-wlan
2796
2797The next section describes how to setup the WLAN plugin,
2798so here only the settings. Just specify the interface to use:
2799
2800@example
2801[transport-wlan]
2802# Name of the interface in monitor mode (typically monX)
2803INTERFACE = mon0
2804# Real hardware, no testing
2805TESTMODE = 0
2806TESTING_IGNORE_KEYS = ACCEPT_FROM;
2807@end example
2808@end itemize
2809
2810@node Configuring the wlan transport plugin
2811@subsection Configuring the wlan transport plugin
2812
2813The wlan transport plugin enables GNUnet to send and to receive data on a
2814wlan interface.
2815It has not to be connected to a wlan network as long as sender and
2816receiver are on the same channel. This enables you to get connection to
2817GNUnet where no internet access is possible, for example during
2818catastrophes or when censorship cuts you off from the internet.
2819
2820
2821@menu
2822* Requirements for the WLAN plugin::
2823* Configuration::
2824* Before starting GNUnet::
2825* Limitations and known bugs::
2826@end menu
2827
2828
2829@node Requirements for the WLAN plugin
2830@subsubsection Requirements for the WLAN plugin
2831
2832@itemize @bullet
2833
2834@item wlan network card with monitor support and packet injection
2835(see @uref{http://www.aircrack-ng.org/, aircrack-ng.org})
2836
2837@item Linux kernel with mac80211 stack, introduced in 2.6.22, tested with
28382.6.35 and 2.6.38
2839
2840@item Wlantools to create the a monitor interface, tested with airmon-ng
2841of the aircrack-ng package
2842@end itemize
2843
2844@node Configuration
2845@subsubsection Configuration
2846
2847There are the following options for the wlan plugin (they should be like
2848this in your default config file, you only need to adjust them if the
2849values are incorrect for your system)
2850
2851@example
2852# section for the wlan transport plugin
2853[transport-wlan]
2854# interface to use, more information in the
2855# "Before starting GNUnet" section of the handbook.
2856INTERFACE = mon0
2857# testmode for developers:
2858# 0 use wlan interface,
2859#1 or 2 use loopback driver for tests 1 = server, 2 = client
2860TESTMODE = 0
2861@end example
2862
2863@node Before starting GNUnet
2864@subsubsection Before starting GNUnet
2865
2866Before starting GNUnet, you have to make sure that your wlan interface is
2867in monitor mode.
2868One way to put the wlan interface into monitor mode (if your interface
2869name is wlan0) is by executing:
2870
2871@example
2872sudo airmon-ng start wlan0
2873@end example
2874
2875@noindent
2876Here is an example what the result should look like:
2877
2878@example
2879Interface Chipset Driver
2880wlan0 Intel 4965 a/b/g/n iwl4965 - [phy0]
2881(monitor mode enabled on mon0)
2882@end example
2883
2884@noindent
2885The monitor interface is mon0 is the one that you have to put into the
2886configuration file.
2887
2888@node Limitations and known bugs
2889@subsubsection Limitations and known bugs
2890
2891Wlan speed is at the maximum of 1 Mbit/s because support for choosing the
2892wlan speed with packet injection was removed in newer kernels.
2893Please pester the kernel developers about fixing this.
2894
2895The interface channel depends on the wlan network that the card is
2896connected to. If no connection has been made since the start of the
2897computer, it is usually the first channel of the card.
2898Peers will only find each other and communicate if they are on the same
2899channel. Channels must be set manually (i.e. using
2900@code{iwconfig wlan0 channel 1}).
2901
2902
2903@node Configuring HTTP(S) reverse proxy functionality using Apache or nginx
2904@subsection Configuring HTTP(S) reverse proxy functionality using Apache or nginx
2905
2906The HTTP plugin supports data transfer using reverse proxies. A reverse
2907proxy forwards the HTTP request he receives with a certain URL to another
2908webserver, here a GNUnet peer.
2909
2910So if you have a running Apache or nginx webserver you can configure it to
2911be a GNUnet reverse proxy. Especially if you have a well-known webiste
2912this improves censorship resistance since it looks as normal surfing
2913behaviour.
2914
2915To do so, you have to do two things:
2916
2917@itemize @bullet
2918@item Configure your webserver to forward the GNUnet HTTP traffic
2919@item Configure your GNUnet peer to announce the respective address
2920@end itemize
2921
2922As an example we want to use GNUnet peer running:
2923
2924@itemize @bullet
2925
2926@item HTTP server plugin on @code{gnunet.foo.org:1080}
2927
2928@item HTTPS server plugin on @code{gnunet.foo.org:4433}
2929
2930@item A apache or nginx webserver on
2931@uref{http://www.foo.org/, http://www.foo.org:80/}
2932
2933@item A apache or nginx webserver on https://www.foo.org:443/
2934@end itemize
2935
2936And we want the webserver to accept GNUnet traffic under
2937@code{http://www.foo.org/bar/}. The required steps are described here:
2938
2939@strong{Configure your Apache2 HTTP webserver}
2940
2941First of all you need mod_proxy installed.
2942
2943Edit your webserver configuration. Edit
2944@code{/etc/apache2/apache2.conf} or the site-specific configuration file.
2945
2946In the respective @code{server config},@code{virtual host} or
2947@code{directory} section add the following lines:
2948
2949@example
2950ProxyTimeout 300
2951ProxyRequests Off
2952<Location /bar/ >
2953ProxyPass http://gnunet.foo.org:1080/
2954ProxyPassReverse http://gnunet.foo.org:1080/
2955</Location>
2956@end example
2957
2958@noindent
2959@strong{Configure your Apache2 HTTPS webserver}
2960
2961We assume that you already have an HTTPS server running, if not please
2962check how to configure a HTTPS host. An easy to use example is the
2963@file{apache2/sites-available/default-ssl} example configuration file.
2964
2965In the respective HTTPS @code{server config},@code{virtual host} or
2966@code{directory} section add the following lines:
2967
2968@example
2969SSLProxyEngine On
2970ProxyTimeout 300
2971ProxyRequests Off
2972<Location /bar/ >
2973ProxyPass https://gnunet.foo.org:4433/
2974ProxyPassReverse https://gnunet.foo.org:4433/
2975</Location>
2976@end example
2977
2978@noindent
2979More information about the apache mod_proxy configuration can be found
2980here: @uref{http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass}
2981.
2982
2983@strong{Configure your nginx HTTPS webserver}
2984
2985Since nginx does not support chunked encoding, you first of all have to
2986install @code{chunkin}: @uref{http://wiki.nginx.org/HttpChunkinModule}.
2987
2988To enable chunkin add:
2989
2990@example
2991chunkin on;
2992error_page 411 = @@my_411_error;
2993location @@my_411_error @{
2994chunkin_resume;
2995@}
2996@end example
2997
2998@noindent
2999Edit your webserver configuration. Edit @file{/etc/nginx/nginx.conf} or
3000the site-specific configuration file.
3001
3002In the @code{server} section add:
3003
3004@example
3005location /bar/
3006@{
3007proxy_pass http://gnunet.foo.org:1080/;
3008proxy_buffering off;
3009proxy_connect_timeout 5; # more than http_server
3010proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
3011proxy_http_version 1.1; # 1.0 default
3012proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
3013@}
3014@end example
3015
3016@noindent
3017@strong{Configure your nginx HTTPS webserver}
3018
3019Edit your webserver configuration. Edit @file{/etc/nginx/nginx.conf} or
3020the site-specific configuration file.
3021
3022In the @code{server} section add:
3023
3024@example
3025ssl_session_timeout 6m;
3026location /bar/
3027@{
3028proxy_pass https://gnunet.foo.org:4433/;
3029proxy_buffering off;
3030proxy_connect_timeout 5; # more than http_server
3031proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
3032proxy_http_version 1.1; # 1.0 default
3033proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
3034@}
3035@end example
3036
3037@noindent
3038@strong{Configure your GNUnet peer}
3039
3040To have your GNUnet peer announce the address, you have to specify the
3041@code{EXTERNAL_HOSTNAME} option in the @code{[transport-http_server]}
3042section:
3043
3044@example
3045[transport-http_server]
3046EXTERNAL_HOSTNAME = http://www.foo.org/bar/
3047@end example
3048
3049@noindent
3050and/or @code{[transport-https_server]} section:
3051
3052@example
3053[transport-https_server]
3054EXTERNAL_HOSTNAME = https://www.foo.org/bar/
3055@end example
3056
3057@noindent
3058Now restart your webserver and your peer...
3059
3060@node Blacklisting peers
3061@subsection Blacklisting peers
3062
3063Transport service supports to deny connecting to a specific peer of to a
3064specific peer with a specific transport plugin using te blacklisting
3065component of transport service. With@ blacklisting it is possible to deny
3066connections to specific peers of@ to use a specific plugin to a specific
3067peer. Peers can be blacklisted using@ the configuration or a blacklist
3068client can be asked.
3069
3070To blacklist peers using the configuration you have to add a section to
3071your configuration containing the peer id of the peer to blacklist and
3072the plugin@ if required.
3073
3074Examples:
3075
3076To blacklist connections to P565... on peer AG2P... using tcp add:
3077
3078@c FIXME: This is too long and produces errors in the pdf.
3079@example
3080[transport-blacklist AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
3081P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G = tcp
3082@end example
3083
3084To blacklist connections to P565... on peer AG2P... using all plugins add:
3085
3086@example
3087[transport-blacklist-AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
3088P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G =
3089@end example
3090
3091You can also add a blacklist client usign the blacklist API. On a
3092blacklist check, blacklisting first checks internally if the peer is
3093blacklisted and if not, it asks the blacklisting clients. Clients are
3094asked if it is OK to connect to a peer ID, the plugin is omitted.
3095
3096On blacklist check for (peer, plugin)
3097@itemize @bullet
3098@item Do we have a local blacklist entry for this peer and this plugin?@
3099@item YES: disallow connection@
3100@item Do we have a local blacklist entry for this peer and all plugins?@
3101@item YES: disallow connection@
3102@item Does one of the clients disallow?@
3103@item YES: disallow connection
3104@end itemize
3105
3106@node Configuration of the HTTP and HTTPS transport plugins
3107@subsection Configuration of the HTTP and HTTPS transport plugins
3108
3109The client parts of the http and https transport plugins can be configured
3110to use a proxy to connect to the hostlist server. This functionality can
3111be configured in the configuration file directly or using the
3112gnunet-setup tool.
3113
3114Both the HTTP and HTTPS clients support the following proxy types at
3115the moment:
3116
3117@itemize @bullet
3118@item HTTP 1.1 proxy
3119@item SOCKS 4/4a/5/5 with hostname
3120@end itemize
3121
3122In addition authentication at the proxy with username and password can be
3123configured.
3124
3125To configure proxy support for the clients in the gnunet-setup tool,
3126select the "transport" tab and activate the respective plugin. Now you
3127can select the appropriate proxy type. The hostname or IP address
3128(including port if required) has to be entered in the "Proxy hostname"
3129textbox. If required, enter username and password in the "Proxy username"
3130and "Proxy password" boxes. Be aware that these information will be stored
3131in the configuration in plain text.
3132
3133To configure these options directly in the configuration, you can
3134configure the following settings in the @code{[transport-http_client]}
3135and @code{[transport-https_client]} section of the configuration:
3136
3137@example
3138# Type of proxy server,
3139# Valid values: HTTP, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
3140# Default: HTTP
3141# PROXY_TYPE = HTTP
3142
3143# Hostname or IP of proxy server
3144# PROXY =
3145# User name for proxy server
3146# PROXY_USERNAME =
3147# User password for proxy server
3148# PROXY_PASSWORD =
3149@end example
3150
3151@node Configuring the GNU Name System
3152@subsection Configuring the GNU Name System
3153
3154@menu
3155* Configuring system-wide DNS interception::
3156* Configuring the GNS nsswitch plugin::
3157* Configuring GNS on W32::
3158* GNS Proxy Setup::
3159* Setup of the GNS CA::
3160* Testing the GNS setup::
3161* Automatic Shortening in the GNU Name System::
3162@end menu
3163
3164
3165@node Configuring system-wide DNS interception
3166@subsubsection Configuring system-wide DNS interception
3167
3168Before you install GNUnet, make sure you have a user and group 'gnunet'
3169as well as an empty group 'gnunetdns'.
3170
3171When using GNUnet with system-wide DNS interception, it is absolutely
3172necessary for all GNUnet service processes to be started by
3173@code{gnunet-service-arm} as user and group 'gnunet'. You also need to be
3174sure to run @code{make install} as root (or use the @code{sudo} option to
3175configure) to grant GNUnet sufficient privileges.
3176
3177With this setup, all that is required for enabling system-wide DNS
3178interception is for some GNUnet component (VPN or GNS) to request it.
3179The @code{gnunet-service-dns} will then start helper programs that will
3180make the necessary changes to your firewall (@code{iptables}) rules.
3181
3182Note that this will NOT work if your system sends out DNS traffic to a
3183link-local IPv6 address, as in this case GNUnet can intercept the traffic,
3184but not inject the responses from the link-local IPv6 address. Hence you
3185cannot use system-wide DNS interception in conjunction with link-local
3186IPv6-based DNS servers. If such a DNS server is used, it will bypass
3187GNUnet's DNS traffic interception.
3188
3189Using the GNU Name System (GNS) requires two different configuration
3190steps.
3191First of all, GNS needs to be integrated with the operating system. Most
3192of this section is about the operating system level integration.
3193
3194Additionally, each individual user who wants to use the system must also
3195initialize their GNS zones. This can be done by running (after starting
3196GNUnet)
3197
3198@example
3199$ gnunet-gns-import.sh
3200@end example
3201
3202@noindent
3203after the local GNUnet peer has been started. Note that the namestore (in
3204particular the namestore database backend) should not be reconfigured
3205afterwards (as records are not automatically migrated between backends).
3206
3207The remainder of this chapter will detail the various methods for
3208configuring the use of GNS with your operating system.
3209
3210At this point in time you have different options depending on your OS:
3211
3212@table @asis
3213
3214@item Use the gnunet-gns-proxy This approach works for all operating
3215systems and is likely the easiest. However, it enables GNS only for
3216browsers, not for other applications that might be using DNS, such as SSH.
3217Still, using the proxy is required for using HTTP with GNS and is thus
3218recommended for all users. To do this, you simply have to run the
3219@code{gnunet-gns-proxy-setup-ca} script as the user who will run the
3220browser (this will create a GNS certificate authority (CA) on your system
3221and import its key into your browser), then start @code{gnunet-gns-proxy}
3222and inform your browser to use the Socks5 proxy which
3223@code{gnunet-gns-proxy} makes available by default on port 7777.
3224@item Use a nsswitch plugin (recommended on GNU systems)
3225This approach has the advantage of offering fully personalized resolution
3226even on multi-user systems. A potential disadvantage is that some
3227applications might be able to bypass GNS.
3228@item Use a W32 resolver plugin (recommended on W32)
3229This is currently the only option on W32 systems.
3230@item Use system-wide DNS packet interception
3231This approach is recommended for the GNUnet VPN. It can be used to handle
3232GNS at the same time; however, if you only use this method, you will only
3233get one root zone per machine (not so great for multi-user systems).
3234@end table
3235
3236You can combine system-wide DNS packet interception with the nsswitch
3237plugin.
3238The setup of the system-wide DNS interception is described here. All of
3239the other GNS-specific configuration steps are described in the following
3240sections.
3241
3242@node Configuring the GNS nsswitch plugin
3243@subsubsection Configuring the GNS nsswitch plugin
3244
3245The Name Service Switch (NSS) is a facility in Unix-like operating systems
3246@footnote{More accurate: NSS is a functionality of the GNU C Library}
3247that provides a variety of sources for common configuration databases and
3248name resolution mechanisms.
3249A superuser (system administrator) usually configures the
3250operating system's name services using the file
3251@file{/etc/nsswitch.conf}.
3252
3253GNS provides a NSS plugin to integrate GNS name resolution with the
3254operating system's name resolution process.
3255To use the GNS NSS plugin you have to either
3256
3257@itemize @bullet
3258@item install GNUnet as root or
3259@item compile GNUnet with the @code{--with-sudo=yes} switch.
3260@end itemize
3261
3262Name resolution is controlled by the @emph{hosts} section in the NSS
3263configuration. By default this section first performs a lookup in the
3264@file{/etc/hosts} file and then in DNS.
3265The nsswitch file should contain a line similar to:
3266
3267@example
3268hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4
3269@end example
3270
3271@noindent
3272Here the GNS NSS plugin can be added to perform a GNS lookup before
3273performing a DNS lookup.
3274The GNS NSS plugin has to be added to the "hosts" section in
3275@file{/etc/nsswitch.conf} file before DNS related plugins:
3276
3277@example
3278...
3279hosts: files gns [NOTFOUND=return] dns mdns4_minimal mdns4
3280...
3281@end example
3282
3283@noindent
3284The @code{NOTFOUND=return} will ensure that if a @code{.gnu} name is not
3285found in GNS it will not be queried in DNS.
3286
3287@node Configuring GNS on W32
3288@subsubsection Configuring GNS on W32
3289
3290This document is a guide to configuring GNU Name System on W32-compatible
3291platforms.
3292
3293After GNUnet is installed, run the w32nsp-install tool:
3294
3295@example
3296w32nsp-install.exe libw32nsp-0.dll
3297@end example
3298
3299@noindent
3300('0' is the library version of W32 NSP; it might increase in the future,
3301change the invocation accordingly).
3302
3303This will install GNS namespace provider into the system and allow other
3304applications to resolve names that end in '@strong{gnu}'
3305and '@strong{zkey}'. Note that namespace provider requires
3306gnunet-gns-helper-service-w32 to be running, as well as gns service
3307itself (and its usual dependencies).
3308
3309Namespace provider is hardcoded to connect to @strong{127.0.0.1:5353},
3310and this is where gnunet-gns-helper-service-w32 should be listening to
3311(and is configured to listen to by default).
3312
3313To uninstall the provider, run:
3314
3315@example
3316w32nsp-uninstall.exe
3317@end example
3318
3319@noindent
3320(uses provider GUID to uninstall it, does not need a dll name).
3321
3322Note that while MSDN claims that other applications will only be able to
3323use the new namespace provider after re-starting, in reality they might
3324stat to use it without that. Conversely, they might stop using the
3325provider after it's been uninstalled, even if they were not re-started.
3326W32 will not permit namespace provider library to be deleted or
3327overwritten while the provider is installed, and while there is at least
3328one process still using it (even after it was uninstalled).
3329
3330@node GNS Proxy Setup
3331@subsubsection GNS Proxy Setup
3332
3333When using the GNU Name System (GNS) to browse the WWW, there are several
3334issues that can be solved by adding the GNS Proxy to your setup:
3335
3336@itemize @bullet
3337
3338@item If the target website does not support GNS, it might assume that it
3339is operating under some name in the legacy DNS system (such as
3340example.com). It may then attempt to set cookies for that domain, and the
3341web server might expect a @code{Host: example.com} header in the request
3342from your browser.
3343However, your browser might be using @code{example.gnu} for the
3344@code{Host} header and might only accept (and send) cookies for
3345@code{example.gnu}. The GNS Proxy will perform the necessary translations
3346of the hostnames for cookies and HTTP headers (using the LEHO record for
3347the target domain as the desired substitute).
3348
3349@item If using HTTPS, the target site might include an SSL certificate
3350which is either only valid for the LEHO domain or might match a TLSA
3351record in GNS. However, your browser would expect a valid certificate for
3352@code{example.gnu}, not for some legacy domain name. The proxy will
3353validate the certificate (either against LEHO or TLSA) and then
3354on-the-fly produce a valid certificate for the exchange, signed by your
3355own CA. Assuming you installed the CA of your proxy in your browser's
3356certificate authority list, your browser will then trust the
3357HTTPS/SSL/TLS connection, as the hostname mismatch is hidden by the proxy.
3358
3359@item Finally, the proxy will in the future indicate to the server that it
3360speaks GNS, which will enable server operators to deliver GNS-enabled web
3361sites to your browser (and continue to deliver legacy links to legacy
3362browsers)
3363@end itemize
3364
3365@node Setup of the GNS CA
3366@subsubsection Setup of the GNS CA
3367
3368First you need to create a CA certificate that the proxy can use.
3369To do so use the provided script gnunet-gns-proxy-ca:
3370
3371@example
3372$ gnunet-gns-proxy-setup-ca
3373@end example
3374
3375@noindent
3376This will create a personal certification authority for you and add this
3377authority to the firefox and chrome database. The proxy will use the this
3378CA certificate to generate @code{*.gnu} client certificates on the fly.
3379
3380Note that the proxy uses libcurl. Make sure your version of libcurl uses
3381GnuTLS and NOT OpenSSL. The proxy will @b{not} work with libcurl compiled
3382against OpenSSL.
3383
3384You can check the configuration your libcurl was build with by
3385running:
3386
3387@example
3388curl --version
3389@end example
3390
3391the output will look like this (without the linebreaks):
3392
3393@example
3394gnurl --version
3395curl 7.56.0 (x86_64-unknown-linux-gnu) libcurl/7.56.0 \
3396GnuTLS/3.5.13 zlib/1.2.11 libidn2/2.0.4
3397Release-Date: 2017-10-08
3398Protocols: http https
3399Features: AsynchDNS IDN IPv6 Largefile NTLM SSL libz \
3400TLS-SRP UnixSockets HTTPS-proxy
3401@end example
3402
3403@node Testing the GNS setup
3404@subsubsection Testing the GNS setup
3405
3406Now for testing purposes we can create some records in our zone to test
3407the SSL functionality of the proxy:
3408
3409@example
3410$ gnunet-namestore -a -e "1 d" -n "homepage" -t A -V 131.159.74.67
3411$ gnunet-namestore -a -e "1 d" -n "homepage" -t LEHO -V "gnunet.org"
3412@end example
3413
3414@noindent
3415At this point we can start the proxy. Simply execute
3416
3417@example
3418$ gnunet-gns-proxy
3419@end example
3420
3421@noindent
3422Configure your browser to use this SOCKSv5 proxy on port 7777 and visit
3423this link.
3424If you use @command{Firefox} (or one of its deriviates/forks such as
3425Icecat) you also have to go to @code{about:config} and set the key
3426@code{network.proxy.socks_remote_dns} to @code{true}.
3427
3428When you visit @code{https://homepage.gnu/}, you should get to the
3429@code{https://gnunet.org/} frontpage and the browser (with the correctly
3430configured proxy) should give you a valid SSL certificate for
3431@code{homepage.gnu} and no warnings. It should look like this:
3432
3433@c FIXME: Image does not exist, create it or save it from Drupal?
3434@c @image{images/gnunethpgns.png,5in,, picture of homepage.gnu in Webbrowser}
3435
3436@node Automatic Shortening in the GNU Name System
3437@subsubsection Automatic Shortening in the GNU Name System
3438
3439This page describes a possible option for 'automatic name shortening',
3440which you can choose to enable with the GNU Name System.
3441
3442When GNS encounters a name for the first time, it can use the 'NICK'
3443record of the originating zone to automatically generate a name for the
3444zone. If automatic shortening is enabled, those auto-generated names will
3445be placed (as private records) into your personal 'shorten' zone (to
3446prevent confusion with manually selected names).
3447Then, in the future, if the same name is encountered again, GNS will
3448display the shortened name instead (the first time, the long name will
3449still be used as shortening typically happens asynchronously as looking up
3450the 'NICK' record takes some time). Using this feature can be a convenient
3451way to avoid very long @code{.gnu} names; however, note that names from
3452the shorten-zone are assigned on a first-come-first-serve basis and should
3453not be trusted. Furthermore, if you enable this feature, you will no
3454longer see the full delegation chain for zones once shortening has been
3455applied.
3456
3457@node Configuring the GNUnet VPN
3458@subsection Configuring the GNUnet VPN
3459
3460@menu
3461* IPv4 address for interface::
3462* IPv6 address for interface::
3463* Configuring the GNUnet VPN DNS::
3464* Configuring the GNUnet VPN Exit Service::
3465* IP Address of external DNS resolver::
3466* IPv4 address for Exit interface::
3467* IPv6 address for Exit interface::
3468@end menu
3469
3470Before configuring the GNUnet VPN, please make sure that system-wide DNS
3471interception is configured properly as described in the section on the
3472GNUnet DNS setup. @pxref{Configuring the GNU Name System},
3473if you haven't done so already.
3474
3475The default options for the GNUnet VPN are usually sufficient to use
3476GNUnet as a Layer 2 for your Internet connection.
3477However, what you always have to specify is which IP protocol you want
3478to tunnel: IPv4, IPv6 or both.
3479Furthermore, if you tunnel both, you most likely should also tunnel
3480all of your DNS requests.
3481You theoretically can tunnel "only" your DNS traffic, but that usually
3482makes little sense.
3483
3484The other options as shown on the gnunet-setup tool are:
3485
3486@node IPv4 address for interface
3487@subsubsection IPv4 address for interface
3488
3489This is the IPv4 address the VPN interface will get. You should pick an
3490'private' IPv4 network that is not yet in use for you system. For example,
3491if you use @code{10.0.0.1/255.255.0.0} already, you might use
3492@code{10.1.0.1/255.255.0.0}.
3493If you use @code{10.0.0.1/255.0.0.0} already, then you might use
3494@code{192.168.0.1/255.255.0.0}.
3495If your system is not in a private IP-network, using any of the above will
3496work fine.
3497You should try to make the mask of the address big enough
3498(@code{255.255.0.0} or, even better, @code{255.0.0.0}) to allow more
3499mappings of remote IP Addresses into this range.
3500However, even a @code{255.255.255.0} mask will suffice for most users.
3501
3502@node IPv6 address for interface
3503@subsubsection IPv6 address for interface
3504
3505The IPv6 address the VPN interface will get. Here you can specify any
3506non-link-local address (the address should not begin with "@code{fe80:}").
3507A subnet Unique Local Unicast (@code{fd00::/8} prefix) that you are
3508currently not using would be a good choice.
3509
3510@node Configuring the GNUnet VPN DNS
3511@subsubsection Configuring the GNUnet VPN DNS
3512
3513To resolve names for remote nodes, activate the DNS exit option.
3514
3515@node Configuring the GNUnet VPN Exit Service
3516@subsubsection Configuring the GNUnet VPN Exit Service
3517
3518If you want to allow other users to share your Internet connection (yes,
3519this may be dangerous, just as running a Tor exit node) or want to
3520provide access to services on your host (this should be less dangerous,
3521as long as those services are secure), you have to enable the GNUnet exit
3522daemon.
3523
3524You then get to specify which exit functions you want to provide. By
3525enabling the exit daemon, you will always automatically provide exit
3526functions for manually configured local services (this component of the
3527system is under
3528development and not documented further at this time). As for those
3529services you explicitly specify the target IP address and port, there is
3530no significant security risk in doing so.
3531
3532Furthermore, you can serve as a DNS, IPv4 or IPv6 exit to the Internet.
3533Being a DNS exit is usually pretty harmless. However, enabling IPv4 or
3534IPv6-exit without further precautions may enable adversaries to access
3535your local network, send spam, attack other systems from your Internet
3536connection and to other mischief that will appear to come from your
3537machine. This may or may not get you into legal trouble.
3538If you want to allow IPv4 or IPv6-exit functionality, you should strongly
3539consider adding additional firewall rules manually to protect your local
3540network and to restrict outgoing TCP traffic (i.e. by not allowing access
3541to port 25). While we plan to improve exit-filtering in the future,
3542you're currently on your own here.
3543Essentially, be prepared for any kind of IP-traffic to exit the respective
3544TUN interface (and GNUnet will enable IP-forwarding and NAT for the
3545interface automatically).
3546
3547Additional configuration options of the exit as shown by the gnunet-setup
3548tool are:
3549
3550@node IP Address of external DNS resolver
3551@subsubsection IP Address of external DNS resolver
3552
3553If DNS traffic is to exit your machine, it will be send to this DNS
3554resolver. You can specify an IPv4 or IPv6 address.
3555
3556@node IPv4 address for Exit interface
3557@subsubsection IPv4 address for Exit interface
3558
3559This is the IPv4 address the Interface will get. Make the mask of the
3560address big enough (255.255.0.0 or, even better, 255.0.0.0) to allow more
3561mappings of IP addresses into this range. As for the VPN interface, any
3562unused, private IPv4 address range will do.
3563
3564@node IPv6 address for Exit interface
3565@subsubsection IPv6 address for Exit interface
3566
3567The public IPv6 address the interface will get. If your kernel is not a
3568very recent kernel and you are willing to manually enable IPv6-NAT, the
3569IPv6 address you specify here must be a globally routed IPv6 address of
3570your host.
3571
3572Suppose your host has the address @code{2001:4ca0::1234/64}, then
3573using @code{2001:4ca0::1:0/112} would be fine (keep the first 64 bits,
3574then change at least one bit in the range before the bitmask, in the
3575example above we changed bit 111 from 0 to 1).
3576
3577You may also have to configure your router to route traffic for the entire
3578subnet (@code{2001:4ca0::1:0/112} for example) through your computer (this
3579should be automatic with IPv6, but obviously anything can be
3580disabled).
3581
3582@node Bandwidth Configuration
3583@subsection Bandwidth Configuration
3584
3585You can specify how many bandwidth GNUnet is allowed to use to receive
3586and send data. This is important for users with limited bandwidth or
3587traffic volume.
3588
3589@node Configuring NAT
3590@subsection Configuring NAT
3591
3592Most hosts today do not have a normal global IP address but instead are
3593behind a router performing Network Address Translation (NAT) which assigns
3594each host in the local network a private IP address.
3595As a result, these machines cannot trivially receive inbound connections
3596from the Internet. GNUnet supports NAT traversal to enable these machines
3597to receive incoming connections from other peers despite their
3598limitations.
3599
3600In an ideal world, you can press the "Attempt automatic configuration"
3601button in gnunet-setup to automatically configure your peer correctly.
3602Alternatively, your distribution might have already triggered this
3603automatic configuration during the installation process.
3604However, automatic configuration can fail to determine the optimal
3605settings, resulting in your peer either not receiving as many connections
3606as possible, or in the worst case it not connecting to the network at all.
3607
3608To manually configure the peer, you need to know a few things about your
3609network setup. First, determine if you are behind a NAT in the first
3610place.
3611This is always the case if your IP address starts with "10.*" or
3612"192.168.*". Next, if you have control over your NAT router, you may
3613choose to manually configure it to allow GNUnet traffic to your host.
3614If you have configured your NAT to forward traffic on ports 2086 (and
3615possibly 1080) to your host, you can check the "NAT ports have been opened
3616manually" option, which corresponds to the "PUNCHED_NAT" option in the
3617configuration file. If you did not punch your NAT box, it may still be
3618configured to support UPnP, which allows GNUnet to automatically
3619configure it. In that case, you need to install the "upnpc" command,
3620enable UPnP (or PMP) on your NAT box and set the "Enable NAT traversal
3621via UPnP or PMP" option (corresponding to "ENABLE_UPNP" in the
3622configuration file).
3623
3624Some NAT boxes can be traversed using the autonomous NAT traversal method.
3625This requires certain GNUnet components to be installed with "SUID"
3626prividledges on your system (so if you're installing on a system you do
3627not have administrative rights to, this will not work).
3628If you installed as 'root', you can enable autonomous NAT traversal by
3629checking the "Enable NAT traversal using ICMP method".
3630The ICMP method requires a way to determine your NAT's external (global)
3631IP address. This can be done using either UPnP, DynDNS, or by manual
3632configuration. If you have a DynDNS name or know your external IP address,
3633you should enter that name under "External (public) IPv4 address" (which
3634corresponds to the "EXTERNAL_ADDRESS" option in the configuration file).
3635If you leave the option empty, GNUnet will try to determine your external
3636IP address automatically (which may fail, in which case autonomous
3637NAT traversal will then not work).
3638
3639Finally, if you yourself are not behind NAT but want to be able to
3640connect to NATed peers using autonomous NAT traversal, you need to check
3641the "Enable connecting to NATed peers using ICMP method" box.
3642
3643
3644@node Peer configuration for distributions
3645@subsection Peer configuration for distributions
3646
3647The "GNUNET_DATA_HOME" in "[path]" in @file{/etc/gnunet.conf} should be
3648manually set to "/var/lib/gnunet/data/" as the default
3649"~/.local/share/gnunet/" is probably not that appropriate in this case.
3650Similarly, distributions may consider pointing "GNUNET_RUNTIME_DIR" to
3651"/var/run/gnunet/" and "GNUNET_HOME" to "/var/lib/gnunet/". Also, should a
3652distribution decide to override system defaults, all of these changes
3653should be done in a custom @file{/etc/gnunet.conf} and not in the files
3654in the @file{config.d/} directory.
3655
3656Given the proposed access permissions, the "gnunet-setup" tool must be
3657run as use "gnunet" (and with option "-c /etc/gnunet.conf" so that it
3658modifies the system configuration). As always, gnunet-setup should be run
3659after the GNUnet peer was stopped using "gnunet-arm -e". Distributions
3660might want to include a wrapper for gnunet-setup that allows the
3661desktop-user to "sudo" (i.e. using gtksudo) to the "gnunet" user account
3662and then runs "gnunet-arm -e", "gnunet-setup" and "gnunet-arm -s" in
3663sequence.
3664
3665@node How to start and stop a GNUnet peer
3666@section How to start and stop a GNUnet peer
3667
3668This section describes how to start a GNUnet peer. It assumes that you
3669have already compiled and installed GNUnet and its' dependencies.
3670Before you start a GNUnet peer, you may want to create a configuration
3671file using gnunet-setup (but you do not have to).
3672Sane defaults should exist in your
3673@file{$GNUNET_PREFIX/share/gnunet/config.d/} directory, so in practice
3674you could simply start without any configuration. If you want to
3675configure your peer later, you need to stop it before invoking the
3676@code{gnunet-setup} tool to customize further and to test your
3677configuration (@code{gnunet-setup} has build-in test functions).
3678
3679The most important option you might have to still set by hand is in
3680[PATHS]. Here, you use the option "GNUNET_HOME" to specify the path where
3681GNUnet should store its data.
3682It defaults to @code{$HOME/}, which again should work for most users.
3683Make sure that the directory specified as GNUNET_HOME is writable to
3684the user that you will use to run GNUnet (note that you can run frontends
3685using other users, GNUNET_HOME must only be accessible to the user used to
3686run the background processes).
3687
3688You will also need to make one central decision: should all of GNUnet be
3689run under your normal UID, or do you want distinguish between system-wide
3690(user-independent) GNUnet services and personal GNUnet services. The
3691multi-user setup is slightly more complicated, but also more secure and
3692generally recommended.
3693
3694@menu
3695* The Single-User Setup::
3696* The Multi-User Setup::
3697* Killing GNUnet services::
3698* Access Control for GNUnet::
3699@end menu
3700
3701@node The Single-User Setup
3702@subsection The Single-User Setup
3703
3704For the single-user setup, you do not need to do anything special and can
3705just start the GNUnet background processes using @code{gnunet-arm}.
3706By default, GNUnet looks in @file{~/.config/gnunet.conf} for a
3707configuration (or @code{$XDG_CONFIG_HOME/gnunet.conf} if@
3708@code{$XDG_CONFIG_HOME} is defined). If your configuration lives
3709elsewhere, you need to pass the @code{-c FILENAME} option to all GNUnet
3710commands.
3711
3712Assuming the configuration file is called @file{~/.config/gnunet.conf},
3713you start your peer using the @code{gnunet-arm} command (say as user
3714@code{gnunet}) using:
3715
3716@example
3717gnunet-arm -c ~/.config/gnunet.conf -s
3718@end example
3719
3720@noindent
3721The "-s" option here is for "start". The command should return almost
3722instantly. If you want to stop GNUnet, you can use:
3723
3724@example
3725gnunet-arm -c ~/.config/gnunet.conf -e
3726@end example
3727
3728@noindent
3729The "-e" option here is for "end".
3730
3731Note that this will only start the basic peer, no actual applications
3732will be available.
3733If you want to start the file-sharing service, use (after starting
3734GNUnet):
3735
3736@example
3737gnunet-arm -c ~/.config/gnunet.conf -i fs
3738@end example
3739
3740@noindent
3741The "-i fs" option here is for "initialize" the "fs" (file-sharing)
3742application. You can also selectively kill only file-sharing support using
3743
3744@example
3745gnunet-arm -c ~/.config/gnunet.conf -k fs
3746@end example
3747
3748@noindent
3749Assuming that you want certain services (like file-sharing) to be always
3750automatically started whenever you start GNUnet, you can activate them by
3751setting "FORCESTART=YES" in the respective section of the configuration
3752file (for example, "[fs]"). Then GNUnet with file-sharing support would
3753be started whenever you@ enter:
3754
3755@example
3756gnunet-arm -c ~/.config/gnunet.conf -s
3757@end example
3758
3759@noindent
3760Alternatively, you can combine the two options:
3761
3762@example
3763gnunet-arm -c ~/.config/gnunet.conf -s -i fs
3764@end example
3765
3766@noindent
3767Using @code{gnunet-arm} is also the preferred method for initializing
3768GNUnet from @code{init}.
3769
3770Finally, you should edit your @code{crontab} (using the @code{crontab}
3771command) and insert a line@
3772
3773@example
3774@@reboot gnunet-arm -c ~/.config/gnunet.conf -s
3775@end example
3776
3777to automatically start your peer whenever your system boots.
3778
3779@node The Multi-User Setup
3780@subsection The Multi-User Setup
3781
3782This requires you to create a user @code{gnunet} and an additional group
3783@code{gnunetdns}, prior to running @code{make install} during
3784installation.
3785Then, you create a configuration file @file{/etc/gnunet.conf} which should
3786contain the lines:@
3787
3788@example
3789[arm]
3790SYSTEM_ONLY = YES
3791USER_ONLY = NO
3792@end example
3793
3794@noindent
3795Then, perform the same steps to run GNUnet as in the per-user
3796configuration, except as user @code{gnunet} (including the
3797@code{crontab} installation).
3798You may also want to run @code{gnunet-setup} to configure your peer
3799(databases, etc.).
3800Make sure to pass @code{-c /etc/gnunet.conf} to all commands. If you
3801run @code{gnunet-setup} as user @code{gnunet}, you might need to change
3802permissions on @file{/etc/gnunet.conf} so that the @code{gnunet} user can
3803write to the file (during setup).
3804
3805Afterwards, you need to perform another setup step for each normal user
3806account from which you want to access GNUnet. First, grant the normal user
3807(@code{$USER}) permission to the group gnunet:
3808
3809@example
3810# adduser $USER gnunet
3811@end example
3812
3813@noindent
3814Then, create a configuration file in @file{~/.config/gnunet.conf} for the
3815$USER with the lines:
3816
3817@example
3818[arm]
3819SYSTEM_ONLY = NO
3820USER_ONLY = YES
3821@end example
3822
3823@noindent
3824This will ensure that @code{gnunet-arm} when started by the normal user
3825will only run services that are per-user, and otherwise rely on the
3826system-wide services.
3827Note that the normal user may run gnunet-setup, but the
3828configuration would be ineffective as the system-wide services will use
3829@file{/etc/gnunet.conf} and ignore options set by individual users.
3830
3831Again, each user should then start the peer using
3832@file{gnunet-arm -s} --- and strongly consider adding logic to start
3833the peer automatically to their crontab.
3834
3835Afterwards, you should see two (or more, if you have more than one USER)
3836@code{gnunet-service-arm} processes running in your system.
3837
3838@node Killing GNUnet services
3839@subsection Killing GNUnet services
3840
3841It is not necessary to stop GNUnet services explicitly when shutting
3842down your computer.
3843
3844It should be noted that manually killing "most" of the
3845@code{gnunet-service} processes is generally not a successful method for
3846stopping a peer (since @code{gnunet-service-arm} will instantly restart
3847them). The best way to explicitly stop a peer is using
3848@code{gnunet-arm -e}; note that the per-user services may need to be
3849terminated before the system-wide services will terminate normally.
3850
3851@node Access Control for GNUnet
3852@subsection Access Control for GNUnet
3853
3854This chapter documents how we plan to make access control work within the
3855GNUnet system for a typical peer. It should be read as a best-practice
3856installation guide for advanced users and builders of binary
3857distributions. The recommendations in this guide apply to POSIX-systems
3858with full support for UNIX domain sockets only.
3859
3860Note that this is an advanced topic. The discussion presumes a very good
3861understanding of users, groups and file permissions. Normal users on
3862hosts with just a single user can just install GNUnet under their own
3863account (and possibly allow the installer to use SUDO to grant additional
3864permissions for special GNUnet tools that need additional rights).
3865The discussion below largely applies to installations where multiple users
3866share a system and to installations where the best possible security is
3867paramount.
3868
3869A typical GNUnet system consists of components that fall into four
3870categories:
3871
3872@table @asis
3873
3874@item User interfaces
3875User interfaces are not security sensitive and are supposed to be run and
3876used by normal system users.
3877The GTK GUIs and most command-line programs fall into this category.
3878Some command-line tools (like gnunet-transport) should be excluded as they
3879offer low-level access that normal users should not need.
3880@item System services and support tools
3881System services should always run and offer services that can then be
3882accessed by the normal users.
3883System services do not require special permissions, but as they are not
3884specific to a particular user, they probably should not run as a
3885particular user. Also, there should typically only be one GNUnet peer per
3886host. System services include the gnunet-service and gnunet-daemon
3887programs; support tools include command-line programs such as gnunet-arm.
3888@item Priviledged helpers
3889Some GNUnet components require root rights to open raw sockets or perform
3890other special operations. These gnunet-helper binaries are typically
3891installed SUID and run from services or daemons.
3892@item Critical services
3893Some GNUnet services (such as the DNS service) can manipulate the service
3894in deep and possibly highly security sensitive ways. For example, the DNS
3895service can be used to intercept and alter any DNS query originating from
3896the local machine. Access to the APIs of these critical services and their
3897priviledged helpers must be tightly controlled.
3898@end table
3899
3900@c FIXME: The titles of these chapters are too long in the index.
3901
3902@menu
3903* Recommendation - Disable access to services via TCP::
3904* Recommendation - Run most services as system user "gnunet"::
3905* Recommendation - Control access to services using group "gnunet"::
3906* Recommendation - Limit access to certain SUID binaries by group "gnunet"::
3907* Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"::
3908* Differences between "make install" and these recommendations::
3909@end menu
3910
3911@node Recommendation - Disable access to services via TCP
3912@subsubsection Recommendation - Disable access to services via TCP
3913
3914GNUnet services allow two types of access: via TCP socket or via UNIX
3915domain socket.
3916If the service is available via TCP, access control can only be
3917implemented by restricting connections to a particular range of IP
3918addresses.
3919This is acceptable for non-critical services that are supposed to be
3920available to all users on the local system or local network.
3921However, as TCP is generally less efficient and it is rarely the case
3922that a single GNUnet peer is supposed to serve an entire local network,
3923the default configuration should disable TCP access to all GNUnet
3924services on systems with support for UNIX domain sockets.
3925As of GNUnet 0.9.2, configuration files with TCP access disabled should be
3926generated by default. Users can re-enable TCP access to particular
3927services simply by specifying a non-zero port number in the section of
3928the respective service.
3929
3930
3931@node Recommendation - Run most services as system user "gnunet"
3932@subsubsection Recommendation - Run most services as system user "gnunet"
3933
3934GNUnet's main services should be run as a separate user "gnunet" in a
3935special group "gnunet".
3936The user "gnunet" should start the peer using "gnunet-arm -s" during
3937system startup. The home directory for this user should be
3938@file{/var/lib/gnunet} and the configuration file should be
3939@file{/etc/gnunet.conf}.
3940Only the @code{gnunet} user should have the right to access
3941@file{/var/lib/gnunet} (@emph{mode: 700}).
3942
3943@node Recommendation - Control access to services using group "gnunet"
3944@subsubsection Recommendation - Control access to services using group "gnunet"
3945
3946Users that should be allowed to use the GNUnet peer should be added to the
3947group "gnunet". Using GNUnet's access control mechanism for UNIX domain
3948sockets, those services that are considered useful to ordinary users
3949should be made available by setting "UNIX_MATCH_GID=YES" for those
3950services.
3951Again, as shipped, GNUnet provides reasonable defaults.
3952Permissions to access the transport and core subsystems might additionally
3953be granted without necessarily causing security concerns.
3954Some services, such as DNS, must NOT be made accessible to the "gnunet"
3955group (and should thus only be accessible to the "gnunet" user and
3956services running with this UID).
3957
3958@node Recommendation - Limit access to certain SUID binaries by group "gnunet"
3959@subsubsection Recommendation - Limit access to certain SUID binaries by group "gnunet"
3960
3961Most of GNUnet's SUID binaries should be safe even if executed by normal
3962users. However, it is possible to reduce the risk a little bit more by
3963making these binaries owned by the group "gnunet" and restricting their
3964execution to user of the group "gnunet" as well (4750).
3965
3966@node Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
3967@subsubsection Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
3968
3969A special group "gnunetdns" should be created for controlling access to
3970the "gnunet-helper-dns".
3971The binary should then be owned by root and be in group "gnunetdns" and
3972be installed SUID and only be group-executable (2750).
3973@b{Note that the group "gnunetdns" should have no users in it at all,
3974ever.}
3975The "gnunet-service-dns" program should be executed by user "gnunet" (via
3976gnunet-service-arm) with the binary owned by the user "root" and the group
3977"gnunetdns" and be SGID (2700). This way, @strong{only}
3978"gnunet-service-dns" can change its group to "gnunetdns" and execute the
3979helper, and the helper can then run as root (as per SUID).
3980Access to the API offered by "gnunet-service-dns" is in turn restricted
3981to the user "gnunet" (not the group!), which means that only
3982"benign" services can manipulate DNS queries using "gnunet-service-dns".
3983
3984@node Differences between "make install" and these recommendations
3985@subsubsection Differences between "make install" and these recommendations
3986
3987The current build system does not set all permissions automatically based
3988on the recommendations above. In particular, it does not use the group
3989"gnunet" at all (so setting gnunet-helpers other than the
3990gnunet-helper-dns to be owned by group "gnunet" must be done manually).
3991Furthermore, 'make install' will silently fail to set the DNS binaries to
3992be owned by group "gnunetdns" unless that group already exists (!).
3993An alternative name for the "gnunetdns" group can be specified using the
3994@code{--with-gnunetdns=GRPNAME} configure option.
3995
diff --git a/doc/chapters/philosophy.texi b/doc/documentation/chapters/philosophy.texi
index 9f4702b49..10006ebe1 100644
--- a/doc/chapters/philosophy.texi
+++ b/doc/documentation/chapters/philosophy.texi
@@ -1,4 +1,4 @@
1@c *************************************************************************** 1@cindex Philosopy
2@node Philosophy 2@node Philosophy
3@chapter Philosophy 3@chapter Philosophy
4 4
@@ -22,8 +22,8 @@ generation of decentralized Internet protocols.
22* Key Concepts:: 22* Key Concepts::
23@end menu 23@end menu
24 24
25 25@cindex Design Goals
26@c *************************************************************************** 26@cindex Design Goals
27@node Design Goals 27@node Design Goals
28@section Design Goals 28@section Design Goals
29 29
@@ -31,85 +31,100 @@ These are the core GNUnet design goals, in order of relative importance:
31 31
32@itemize 32@itemize
33@item GNUnet must be implemented as free software. 33@item GNUnet must be implemented as free software.
34@item GNUnet must only disclose the minimal amount of information necessary. 34@item GNUnet must only disclose the minimal amount of information
35@item GNUnet must be decentralised and survive Byzantine failures in any position in the network. 35necessary.
36@item GNUnet must make it explicit to the user which entities must be trustworthy when establishing secured communications. 36@item GNUnet must be decentralised and survive Byzantine failures in any
37@item GNUnet must use compartmentalization to protect sensitive information. 37position in the network.
38@item GNUnet must make it explicit to the user which entities must be
39trustworthy when establishing secured communications.
40@item GNUnet must use compartmentalization to protect sensitive
41information.
38@item GNUnet must be open and permit new peers to join. 42@item GNUnet must be open and permit new peers to join.
39@item GNUnet must be self-organizing and not depend on administrators. 43@item GNUnet must be self-organizing and not depend on administrators.
40@item GNUnet must support a diverse range of applications and devices. 44@item GNUnet must support a diverse range of applications and devices.
41@item The GNUnet architecture must be cost effective. 45@item The GNUnet architecture must be cost effective.
42@item GNUnet must provide incentives for peers to contribute more resources than they consume. 46@item GNUnet must provide incentives for peers to contribute more
47resources than they consume.
43@end itemize 48@end itemize
44 49
45 50
51@cindex Security and Privacy
46@node Security & Privacy 52@node Security & Privacy
47@section Security & Privacy 53@section Security & Privacy
48 54
49GNUnet's primary design goals are to protect the privacy of its users and to 55GNUnet's primary design goals are to protect the privacy of its users and
50guard itself against attacks or abuse. GNUnet does not have any mechanisms 56to guard itself against attacks or abuse.
51to control, track or censor users. Instead, the GNUnet protocols aim to make 57GNUnet does not have any mechanisms to control, track or censor users.
52it as hard as possible to find out what is happening on the network or to 58Instead, the GNUnet protocols aim to make it as hard as possible to
53disrupt operations. 59find out what is happening on the network or to disrupt operations.
54 60
61@cindex Versatility
55@node Versatility 62@node Versatility
56@section Versatility 63@section Versatility
57 64
58We call GNUnet a peer-to-peer framework because we want to support many 65We call GNUnet a peer-to-peer framework because we want to support many
59different forms of peer-to-peer applications. GNUnet uses a plugin 66different forms of peer-to-peer applications. GNUnet uses a plugin
60architecture to make the system extensible and to encourage code reuse. 67architecture to make the system extensible and to encourage code reuse.
61While the first versions of the system only supported anonymous file-sharing, 68While the first versions of the system only supported anonymous
62other applications are being worked on and more will hopefully follow in the 69file-sharing, other applications are being worked on and more will
63future. A powerful synergy regarding anonymity services is created by a large 70hopefully follow in the future.
71A powerful synergy regarding anonymity services is created by a large
64community utilizing many diverse applications over the same software 72community utilizing many diverse applications over the same software
65infrastructure. The reason is that link encryption hides the specifics 73infrastructure. The reason is that link encryption hides the specifics
66of the traffic for non-participating observers. This way, anonymity can 74of the traffic for non-participating observers. This way, anonymity can
67get stronger with additional (GNUnet) traffic, even if the additional 75get stronger with additional (GNUnet) traffic, even if the additional
68traffic is not related to anonymous communication. Increasing anonymity is 76traffic is not related to anonymous communication. Increasing anonymity is
69the primary reason why GNUnet is developed to become a peer-to-peer 77the primary reason why GNUnet is developed to become a peer-to-peer
70framework where many applications share the lower layers of an increasingly 78framework where many applications share the lower layers of an
71complex protocol stack. If merging traffic to hinder traffic analysis was 79increasingly complex protocol stack.
72not important, we could have just developed a dozen stand-alone applications 80If merging traffic to hinder traffic analysis was not important,
81we could have just developed a dozen stand-alone applications
73and a few shared libraries. 82and a few shared libraries.
74 83
84@cindex Practicality
75@node Practicality 85@node Practicality
76@section Practicality 86@section Practicality
77 87
78GNUnet allows participants to trade various amounts of security in exchange 88GNUnet allows participants to trade various amounts of security in
79for increased efficiency. However, it is not possible for any user's security 89exchange for increased efficiency. However, it is not possible for any
80and efficiency requirements to compromise the security and efficiency of 90user's security and efficiency requirements to compromise the security
81any other user. 91and efficiency of any other user.
82 92
83For GNUnet, efficiency is not paramount. If there is a more secure and still 93For GNUnet, efficiency is not paramount. If there is a more secure and
84practical approach, we would choose to take the more secure alternative. 94still practical approach, we would choose to take the more secure
85@command{telnet} is more efficient than @command{ssh}, yet it is obsolete. 95alternative. @command{telnet} is more efficient than @command{ssh}, yet
96it is obsolete.
86Hardware gets faster, and code can be optimized. Fixing security issues as 97Hardware gets faster, and code can be optimized. Fixing security issues as
87an afterthought is much harder. 98an afterthought is much harder.
88 99
89While security is paramount, practicability is still a requirement. The most 100While security is paramount, practicability is still a requirement.
90secure system is always the one that nobody can use. Similarly, any 101The most secure system is always the one that nobody can use.
91anonymous system that is extremely inefficient will only find few users. 102Similarly, any anonymous system that is extremely inefficient will only
103find few users.
92However, good anonymity requires a large and diverse user base. Since 104However, good anonymity requires a large and diverse user base. Since
93individual security requirements may vary, the only good solution here is to 105individual security requirements may vary, the only good solution here is
94allow individuals to trade-off security and efficiency. The primary challenge 106to allow individuals to trade-off security and efficiency.
95in allowing this is to ensure that the economic incentives work properly. 107The primary challenge in allowing this is to ensure that the economic
108incentives work properly.
96In particular, this means that it must be impossible for a user to gain 109In particular, this means that it must be impossible for a user to gain
97security at the expense of other users. Many designs (e.g. anonymity via 110security at the expense of other users. Many designs (e.g. anonymity via
98broadcast) fail to give users an incentive to choose a less secure but more 111broadcast) fail to give users an incentive to choose a less secure but
99efficient mode of operation. GNUnet should avoid where ever possible to 112more efficient mode of operation.
100rely on protocols that will only work if the participants are benevolent. 113GNUnet should avoid where ever possible to rely on protocols that will
114only work if the participants are benevolent.
101While some designs have had widespread success while relying on parties 115While some designs have had widespread success while relying on parties
102to observe a protocol that may be sub-optimal for the individuals (e.g. 116to observe a protocol that may be sub-optimal for the individuals (e.g.
103TCP Nagle), a protocol that ensures that individual goals never conflict 117TCP Nagle), a protocol that ensures that individual goals never conflict
104with the goals of the group is always preferable. 118with the goals of the group is always preferable.
105 119
120@cindex Key Concepts
106@node Key Concepts 121@node Key Concepts
107@section Key Concepts 122@section Key Concepts
108 123
109In this section, the fundamental concepts of GNUnet are explained. Most of 124In this section, the fundamental concepts of GNUnet are explained.
110them are also described in our research papers. First, some of the concepts 125Most of them are also described in our research papers.
111used in the GNUnet framework are detailed. The second part describes concepts 126First, some of the concepts used in the GNUnet framework are detailed.
112specific to anonymous file-sharing. 127The second part describes concepts specific to anonymous file-sharing.
113 128
114@menu 129@menu
115* Authentication:: 130* Authentication::
@@ -122,6 +137,7 @@ specific to anonymous file-sharing.
122* Egos:: 137* Egos::
123@end menu 138@end menu
124 139
140@cindex Authentication
125@node Authentication 141@node Authentication
126@subsection Authentication 142@subsection Authentication
127 143
@@ -148,63 +164,74 @@ IP protocol at all (by running directly on layer 2).
148GNUnet uses a special type of message to communicate a binding between 164GNUnet uses a special type of message to communicate a binding between
149public (ECC) keys to their current network address. These messages are 165public (ECC) keys to their current network address. These messages are
150commonly called HELLOs or peer advertisements. They contain the public key 166commonly called HELLOs or peer advertisements. They contain the public key
151of the peer and its current network addresses for various transport services. 167of the peer and its current network addresses for various transport
168services.
152A transport service is a special kind of shared library that 169A transport service is a special kind of shared library that
153provides (possibly unreliable, out-of-order) message delivery between peers. 170provides (possibly unreliable, out-of-order) message delivery between
154For the UDP and TCP transport services, a network address is an IP and a port. 171peers.
172For the UDP and TCP transport services, a network address is an IP and a
173port.
155GNUnet can also use other transports (HTTP, HTTPS, WLAN, etc.) which use 174GNUnet can also use other transports (HTTP, HTTPS, WLAN, etc.) which use
156various other forms of addresses. Note that any node can have many different 175various other forms of addresses. Note that any node can have many
176different
157active transport services at the same time, and each of these can have a 177active transport services at the same time, and each of these can have a
158different addresses. Binding messages expire after at most a week (the 178different addresses. Binding messages expire after at most a week (the
159timeout can be shorter if the user configures the node appropriately). This 179timeout can be shorter if the user configures the node appropriately).
160expiration ensures that the network will eventually get rid of outdated 180This expiration ensures that the network will eventually get rid of
161advertisements.@ 181outdated advertisements.@footnote{More details can be found in
162More details can be found in the paper @uref{https://gnunet.org/transports, A Transport Layer Abstraction for Peer-to-Peer Networks}. 182@uref{https://gnunet.org/transports, A Transport Layer Abstraction for Peer-to-Peer Networks}}
163 183
184@cindex Resource Sharing
164@node Accounting to Encourage Resource Sharing 185@node Accounting to Encourage Resource Sharing
165@subsection Accounting to Encourage Resource Sharing 186@subsection Accounting to Encourage Resource Sharing
166 187
167Most distributed P2P networks suffer from a lack of defenses or precautions 188Most distributed P2P networks suffer from a lack of defenses or
168against attacks in the form of freeloading. While the intentions of an 189precautions against attacks in the form of freeloading.
169attacker and a freeloader are different, their effect on the network is the 190While the intentions of an attacker and a freeloader are different, their
170same; they both render it useless. Most simple attacks on networks such as 191effect on the network is the same; they both render it useless.
171Gnutella involve flooding the network with traffic, particularly with 192Most simple attacks on networks such as Gnutella involve flooding the
172queries that are, in the worst case, multiplied by the network. 193network with traffic, particularly with queries that are, in the worst
194case, multiplied by the network.
173 195
174In order to ensure that freeloaders or attackers have a minimal impact on the 196In order to ensure that freeloaders or attackers have a minimal impact on
175network, GNUnet's file-sharing implementation tries to distinguish 197the network, GNUnet's file-sharing implementation tries to distinguish
176good (contributing) nodes from malicious (freeloading) nodes. In GNUnet, 198good (contributing) nodes from malicious (freeloading) nodes. In GNUnet,
177every file-sharing node keeps track of the behavior of every other node it 199every file-sharing node keeps track of the behavior of every other node it
178has been in contact with. Many requests (depending on the application) are 200has been in contact with. Many requests (depending on the application) are
179transmitted with a priority (or importance) level. That priority is used to 201transmitted with a priority (or importance) level. That priority is used
180establish how important the sender believes this request is. If a peer 202to establish how important the sender believes this request is. If a peer
181responds to an important request, the recipient will increase its trust in the 203responds to an important request, the recipient will increase its trust in
182responder: the responder contributed resources. If a peer is too busy to 204the responder: the responder contributed resources. If a peer is too busy
183answer all requests, it needs to prioritize. For that, peers to not take the 205to answer all requests, it needs to prioritize. For that, peers to not
184priorities of the requests received at face value. First, they check how much 206take the priorities of the requests received at face value.
185they trust the sender, and depending on that amount of trust they assign the 207First, they check how much they trust the sender, and depending on that
186request a (possibly lower) effective priority. Then, they drop the requests 208amount of trust they assign the request a (possibly lower) effective
187with the lowest effective priority to satisfy their resource constraints. This 209priority. Then, they drop the requests with the lowest effective priority
188way, GNUnet's economic model ensures that nodes that are not currently 210to satisfy their resource constraints. This way, GNUnet's economic model
189considered to have a surplus in contributions will not be served if the 211ensures that nodes that are not currently considered to have a surplus in
190network load is high. More details can be found in @uref{https://gnunet.org/ebe, this paper}. 212contributions will not be served if the network load is high.@footnote{Mor
191 213e details can be found in @uref{https://gnunet.org/ebe, this paper}}
214
215@cindex Confidentiality
192@node Confidentiality 216@node Confidentiality
193@subsection Confidentiality 217@subsection Confidentiality
194 218
195Adversaries outside of GNUnet are not supposed to know what kind of actions a 219Adversaries outside of GNUnet are not supposed to know what kind of
196peer is involved in. Only the specific neighbor of a peer that is the 220actions a peer is involved in. Only the specific neighbor of a peer that
197corresponding sender or recipient of a message may know its contents, and even 221is the corresponding sender or recipient of a message may know its
198then application protocols may place further restrictions on that knowledge. 222contents, and even then application protocols may place further
199In order to ensure confidentiality, GNUnet uses link encryption, that is each 223restrictions on that knowledge.
200message exchanged between two peers is encrypted using a pair of keys only 224In order to ensure confidentiality, GNUnet uses link encryption, that is
201known to these two peers. Encrypting traffic like this makes any kind of 225each message exchanged between two peers is encrypted using a pair of
202traffic analysis much harder. Naturally, for some applications, it may still 226keys only known to these two peers.
203be desirable if even neighbors cannot determine the concrete contents of a 227Encrypting traffic like this makes any kind of traffic analysis much
204message. In GNUnet, this problem is addressed by the specific 228harder. Naturally, for some applications, it may still be desirable if
205application-level protocols (see for example, deniability and anonymity in 229even neighbors cannot determine the concrete contents of a message.
206anonymous file sharing). 230In GNUnet, this problem is addressed by the specific application-level
207 231protocols (see for example, deniability and anonymity in anonymous file
232sharing).
233
234@cindex Anonymity
208@node Anonymity 235@node Anonymity
209@subsection Anonymity 236@subsection Anonymity
210 237
@@ -213,58 +240,71 @@ anonymous file sharing).
213@end menu 240@end menu
214 241
215Providing anonymity for users is the central goal for the anonymous 242Providing anonymity for users is the central goal for the anonymous
216file-sharing application. Many other design decisions follow in the footsteps 243file-sharing application. Many other design decisions follow in the
217of this requirement. Anonymity is never absolute. While there are various 244footsteps of this requirement.
218@uref{https://gnunet.org/anonymity_metric, scientific metrics} that can help quantify the level of anonymity that a 245Anonymity is never absolute. While there are various
219given mechanism provides, there is no such thing as complete anonymity. 246@uref{https://gnunet.org/anonymity_metric, scientific metrics} that can
247help quantify the level of anonymity that a given mechanism provides,
248there is no such thing as complete anonymity.
220GNUnet's file-sharing implementation allows users to select for each 249GNUnet's file-sharing implementation allows users to select for each
221operation (publish, search, download) the desired level of anonymity. 250operation (publish, search, download) the desired level of anonymity.
222The metric used is the amount of cover traffic available to hide the request. 251The metric used is the amount of cover traffic available to hide the
252request.
223While this metric is not as good as, for example, the theoretical metric 253While this metric is not as good as, for example, the theoretical metric
224given in @uref{https://gnunet.org/anonymity_metric, scientific metrics}, it is probably the best metric available to 254given in @uref{https://gnunet.org/anonymity_metric, scientific metrics},
225a peer with a purely local view of the world that does not rely on unreliable 255it is probably the best metric available to a peer with a purely local
226external information. The default anonymity level is 1, which uses anonymous 256view of the world that does not rely on unreliable external information.
227routing but imposes no minimal requirements on cover traffic. It is possible 257The default anonymity level is 1, which uses anonymous routing but
258imposes no minimal requirements on cover traffic. It is possible
228to forego anonymity when this is not required. The anonymity level of 0 259to forego anonymity when this is not required. The anonymity level of 0
229allows GNUnet to use more efficient, non-anonymous routing. 260allows GNUnet to use more efficient, non-anonymous routing.
230 261
262@cindex How file-sharing achieves Anonymity
231@node How file-sharing achieves Anonymity 263@node How file-sharing achieves Anonymity
232@subsubsection How file-sharing achieves Anonymity 264@subsubsection How file-sharing achieves Anonymity
233 265
234Contrary to other designs, we do not believe that users achieve strong 266Contrary to other designs, we do not believe that users achieve strong
235anonymity just because their requests are obfuscated by a couple of 267anonymity just because their requests are obfuscated by a couple of
236indirections. This is not sufficient if the adversary uses traffic analysis. 268indirections. This is not sufficient if the adversary uses traffic
237The threat model used for anonymous file sharing in GNUnet assumes that the 269analysis.
238adversary is quite powerful. In particular, we assume that the adversary can 270The threat model used for anonymous file sharing in GNUnet assumes that
239see all the traffic on the Internet. And while we assume that the adversary 271the adversary is quite powerful.
272In particular, we assume that the adversary can see all the traffic on
273the Internet. And while we assume that the adversary
240can not break our encryption, we assume that the adversary has many 274can not break our encryption, we assume that the adversary has many
241participating nodes in the network and that it can thus see many of the 275participating nodes in the network and that it can thus see many of the
242node-to-node interactions since it controls some of the nodes. 276node-to-node interactions since it controls some of the nodes.
243 277
244The system tries to achieve anonymity based on the idea that users can be 278The system tries to achieve anonymity based on the idea that users can be
245anonymous if they can hide their actions in the traffic created by other users. 279anonymous if they can hide their actions in the traffic created by other
280users.
246Hiding actions in the traffic of other users requires participating in the 281Hiding actions in the traffic of other users requires participating in the
247traffic, bringing back the traditional technique of using indirection and 282traffic, bringing back the traditional technique of using indirection and
248source rewriting. Source rewriting is required to gain anonymity since 283source rewriting. Source rewriting is required to gain anonymity since
249otherwise an adversary could tell if a message originated from a host by 284otherwise an adversary could tell if a message originated from a host by
250looking at the source address. If all packets look like they originate from 285looking at the source address. If all packets look like they originate
251a node, the adversary can not tell which ones originate from that node and 286from a node, the adversary can not tell which ones originate from that
252which ones were routed. Note that in this mindset, any node can decide to 287node and which ones were routed.
253break the source-rewriting paradigm without violating the protocol, as this 288Note that in this mindset, any node can decide to break the
254only reduces the amount of traffic that a node can hide its own traffic in. 289source-rewriting paradigm without violating the protocol, as this
290only reduces the amount of traffic that a node can hide its own traffic
291in.
255 292
256If we want to hide our actions in the traffic of other nodes, we must make 293If we want to hide our actions in the traffic of other nodes, we must make
257our traffic indistinguishable from the traffic that we route for others. As 294our traffic indistinguishable from the traffic that we route for others.
258our queries must have us as the receiver of the reply (otherwise they would 295As our queries must have us as the receiver of the reply
259be useless), we must put ourselves as the receiver of replies that actually 296(otherwise they would be useless), we must put ourselves as the receiver
260go to other hosts; in other words, we must indirect replies. Unlike other 297of replies that actually go to other hosts; in other words, we must
261systems, in anonymous file-sharing as implemented on top of GNUnet we do not 298indirect replies.
262have to indirect the replies if we don't think we need more traffic to hide 299Unlike other systems, in anonymous file-sharing as implemented on top of
263our own actions.@ 300GNUnet we do not have to indirect the replies if we don't think we need
301more traffic to hide our own actions.
264 302
265This increases the efficiency of the network as we can indirect less under 303This increases the efficiency of the network as we can indirect less under
266higher load. More details can be found in @uref{https://gnunet.org/gap, this paper}. 304higher load.@footnote{More details can be found in
305@uref{https://gnunet.org/gap, this paper}}
267 306
307@cindex Deniability
268@node Deniability 308@node Deniability
269@subsection Deniability 309@subsection Deniability
270 310
@@ -274,57 +314,65 @@ intermediaries can find out which queries or which content they are
274processing, a strong adversary could try to force them to censor 314processing, a strong adversary could try to force them to censor
275certain materials. 315certain materials.
276 316
277With the file-encoding used by GNUnet's anonymous file-sharing, this problem 317With the file-encoding used by GNUnet's anonymous file-sharing, this
278does not arise. The reason is that queries and replies are transmitted in 318problem does not arise.
319The reason is that queries and replies are transmitted in
279an encrypted format such that intermediaries cannot tell what the query 320an encrypted format such that intermediaries cannot tell what the query
280is for or what the content is about. Mind that this is not the same 321is for or what the content is about. Mind that this is not the same
281encryption as the link-encryption between the nodes. GNUnet has 322encryption as the link-encryption between the nodes. GNUnet has
282encryption on the network layer (link encryption, confidentiality, 323encryption on the network layer (link encryption, confidentiality,
283authentication) and again on the application layer (provided 324authentication) and again on the application layer (provided
284by @command{gnunet-publish}, @command{gnunet-download}, @command{gnunet-search} 325by @command{gnunet-publish}, @command{gnunet-download},
285and @command{gnunet-gtk}). More details can be found @uref{https://gnunet.org/encoding, here}. 326@command{gnunet-search} and @command{gnunet-gtk}).@footnote{More details
327can be found @uref{https://gnunet.org/encoding, here}}
286 328
329@cindex Peer Identities
287@node Peer Identities 330@node Peer Identities
288@subsection Peer Identities 331@subsection Peer Identities
289 332
290Peer identities are used to identify peers in the network and are unique for 333Peer identities are used to identify peers in the network and are unique
291each peer. The identity for a peer is simply its public key, which is 334for each peer. The identity for a peer is simply its public key, which is
292generated along with a private key the peer is started for the first time. 335generated along with a private key the peer is started for the first time.
293While the identity is binary data, it is often expressed as ASCII string. 336While the identity is binary data, it is often expressed as ASCII string.
294For example, the following is a peer identity as you might see it in 337For example, the following is a peer identity as you might see it in
295various places:@ 338various places:
296@code{@ 339
297 UAT1S6PMPITLBKSJ2DGV341JI6KF7B66AC4JVCN9811NNEGQLUN0@ 340@example
298} 341UAT1S6PMPITLBKSJ2DGV341JI6KF7B66AC4JVCN9811NNEGQLUN0
342@end example
299 343
300You can find your peer identity by running@ 344@noindent
301@command{gnunet-peerinfo -s} 345You can find your peer identity by running @command{gnunet-peerinfo -s}.
302 346
347@cindex GNS Zones
303@node Zones in the GNU Name System (GNS Zones) 348@node Zones in the GNU Name System (GNS Zones)
304@subsection Zones in the GNU Name System (GNS Zones) 349@subsection Zones in the GNU Name System (GNS Zones)
305 350
306GNS zones are similar to those of DNS zones, but instead of a hierarchy of 351GNS zones are similar to those of DNS zones, but instead of a hierarchy of
307authorities to governing their use, GNS zones are controlled by a private key. 352authorities to governing their use, GNS zones are controlled by a private
353key.
308When you create a record in a DNS zone, that information stored in your 354When you create a record in a DNS zone, that information stored in your
309nameserver. Anyone trying to resolve your domain then gets pointed (hopefully) 355nameserver. Anyone trying to resolve your domain then gets pointed
310by the centralised authority to your nameserver. Whereas GNS, being 356(hopefully) by the centralised authority to your nameserver.
311decentralised by design, stores that information in DHT. The validity of the 357Whereas GNS, being decentralised by design, stores that information in
312records is assured cryptographically, by signing them with the private key of 358DHT. The validity of the records is assured cryptographically, by
313the respective zone. 359signing them with the private key of the respective zone.
314 360
315Anyone trying to resolve records in a zone your domain can then verify the 361Anyone trying to resolve records in a zone your domain can then verify the
316signature on the records they get from the DHT and be assured that they are 362signature on the records they get from the DHT and be assured that they
317indeed from the respective zone. To make this work, there is a 1:1 363are indeed from the respective zone. To make this work, there is a 1:1
318correspondence between zones and their public-private key pairs. So when we 364correspondence between zones and their public-private key pairs.
319talk about the owner of a GNS zone, that's really the owner of the private 365So when we talk about the owner of a GNS zone, that's really the owner of
320key. And a user accessing a zone needs to somehow specify the corresponding 366the private key.
367And a user accessing a zone needs to somehow specify the corresponding
321public key first. 368public key first.
322 369
370@cindex Egos
323@node Egos 371@node Egos
324@subsection Egos 372@subsection Egos
325 373
326Egos are your "identities" in GNUnet. Any user can assume multiple 374Egos are your "identities" in GNUnet. Any user can assume multiple
327identities, for example to separate his activities online. Egos can 375identities, for example to separate teir activities online. Egos can
328correspond to pseudonyms or real-world identities. Technically, an 376correspond to pseudonyms or real-world identities. Technically, an
329ego is first of all a public-private key pair. 377ego is first of all a public-private key pair.
330 378
diff --git a/doc/documentation/chapters/user.texi b/doc/documentation/chapters/user.texi
new file mode 100644
index 000000000..6e339c697
--- /dev/null
+++ b/doc/documentation/chapters/user.texi
@@ -0,0 +1,2009 @@
1@node Using GNUnet
2@chapter Using GNUnet
3@c %**end of header
4
5This tutorial is supposed to give a first introduction for end-users
6trying to do something "real" with GNUnet. Installation and
7configuration are specifically outside of the scope of this tutorial.
8Instead, we start by briefly checking that the installation works, and
9then dive into simple, concrete practical things that can be done
10with the network.
11
12This chapter documents how to use the various Peer-to-Peer applications
13of the GNUnet system. As GNUnet evolves, we will add new chapters for
14the various applications that are being created.
15
16Comments and extensions are always welcome.
17
18
19@menu
20* Checking the Installation::
21* First steps - File-sharing::
22* First steps - Using the GNU Name System::
23* First steps - Using GNUnet Conversation::
24* First steps - Using the GNUnet VPN::
25* File-sharing::
26* The GNU Name System::
27* Using the Virtual Public Network::
28@end menu
29
30@node Checking the Installation
31@section Checking the Installation
32@c %**end of header
33
34This chapter describes a quick casual way to check if your GNUnet
35installation works. However, if it does not, we do not cover
36steps for recovery --- for this, please study the installation and
37configuration handbooks.
38
39
40@menu
41* gnunet-gtk::
42* Statistics::
43* Peer Information::
44@end menu
45
46@node gnunet-gtk
47@subsection gnunet-gtk
48@c %**end of header
49
50First, you should launch @code{gnunet-gtk}, the graphical user
51interface for GNUnet which will be used for most of the tutorial.
52You can do this from the command-line by typing
53
54@example
55$ gnunet-gtk
56@end example
57
58(note that @code{$} represents the prompt of the shell for a normal user).
59Depending on your distribution, you may also find @code{gnunet-gtk}
60in your menus. After starting @code{gnunet-gtk}, you should see the
61following window:
62
63@c @image{images/gnunet-gtk-0-10,5in,, picture of gnunet-gtk application}
64
65The five images on top represent the five different graphical applications
66that you can use within @code{gnunet-gtk}. They are (from left to right):
67
68@itemize @bullet
69@item Statistics
70@item Peer Information
71@item GNU Name System
72@item File Sharing
73@item Identity Management
74@end itemize
75
76@node Statistics
77@subsection Statistics
78@c %**end of header
79
80When @code{gnunet-gtk} is started, the statistics area should be selected
81at first. If your peer is running correctly, you should see a bunch of
82lines, all of which should be "significantly" above zero (at least if your
83peer has been running for a few seconds). The lines indicate how many other
84peers your peer is connected to (via different mechanisms) and how large
85the overall overlay network is currently estimated to be. The X-axis
86represents time (in seconds since the start of @code{gnunet-gtk}).
87
88You can click on "Traffic" to see information about the amount of
89bandwidth your peer has consumed, and on "Storage" to check the amount
90of storage available and used by your peer. Note that "Traffic" is
91plotted cummulatively, so you should see a strict upwards trend in the
92traffic.
93
94@node Peer Information
95@subsection Peer Information
96@c %**end of header
97
98You should now click on the Australian Aboriginal Flag. Once you have
99done this, you will see a list of known peers (by the first four
100characters of their public key), their friend status (all should be
101marked as not-friends initially), their connectivity (green is
102connected, red is disconnected), assigned bandwidth,
103country of origin (if determined) and address information. If hardly
104any peers are listed and/or if there are very few peers with a green light
105for connectivity, there is likely a problem with your
106network configuration.
107
108@node First steps - File-sharing
109@section First steps - File-sharing
110@c %**end of header
111
112This chapter describes first steps for file-sharing with GNUnet.
113To start, you should launch @code{gnunet-gtk} and select the
114file-sharing tab (the one with the arrows between the three circles).
115
116As we want to be sure that the network contains the data that we are
117looking for for testing, we need to begin by publishing a file.
118
119
120@menu
121* Publishing::
122* Searching::
123* Downloading::
124@end menu
125
126@node Publishing
127@subsection Publishing
128@c %**end of header
129
130To publish a file, select "File Sharing" in the menu bar just below the
131"Statistics" icon, and then select "Publish" from the menu.
132
133Afterwards, the following publishing dialog will appear:
134
135@c Add image here
136
137In this dialog, select the "Add File" button. This will open a
138file selection dialog:
139
140@c Add image here
141
142Now, you should select a file from your computer to be published on
143GNUnet. To see more of GNUnet's features later, you should pick a
144PNG or JPEG file this time. You can leave all of the other options
145in the dialog unchanged. Confirm your selection by pressing the "OK"
146button in the bottom right corner. Now, you will briefly see a
147"Messages..." dialog pop up, but most likely it will be too short for
148you to really read anything. That dialog is showing you progress
149information as GNUnet takes a first look at the selected file(s).
150For a normal image, this is virtually instant, but if you later
151import a larger directory you might be interested in the progress dialog
152and potential errors that might be encountered during processing.
153After the progress dialog automatically disappears, your file
154should now appear in the publishing dialog:
155
156@c Add image here
157
158Now, select the file (by clicking on the file name) and then click
159the "Edit" button. This will open the editing dialog:
160
161@c Add image here
162
163In this dialog, you can see many details about your file. In the
164top left area, you can see meta data extracted about the file,
165such as the original filename, the mimetype and the size of the image.
166In the top right, you should see a preview for the image
167(if GNU libextractor was installed correctly with the
168respective plugins). Note that if you do not see a preview, this
169is not a disaster, but you might still want to install more of
170GNU libextractor in the future. In the bottom left, the dialog contains
171a list of keywords. These are the keywords under which the file will be
172made available. The initial list will be based on the extracted meta data.
173Additional publishing options are in the right bottom corner. We will
174now add an additional keyword to the list of keywords. This is done by
175entering the keyword above the keyword list between the label "Keyword"
176and the "Add keyword" button. Enter "test" and select "Add keyword".
177Note that the keyword will appear at the bottom of the existing keyword
178list, so you might have to scroll down to see it. Afterwards, push the
179"OK" button at the bottom right of the dialog.
180
181You should now be back at the "Publish content on GNUnet" dialog. Select
182"Execute" in the bottom right to close the dialog and publish your file
183on GNUnet! Afterwards, you should see the main dialog with a new area
184showing the list of published files (or ongoing publishing operations
185with progress indicators):
186
187@c Add image here
188
189@node Searching
190@subsection Searching
191@c %**end of header
192
193Below the menu bar, there are four entry widges labeled "Namespace",
194"Keywords", "Anonymity" and "Mime-type" (from left to right). These
195widgets are used to control searching for files in GNUnet. Between the
196"Keywords" and "Anonymity" widgets, there is also a big "Search" button,
197which is used to initiate the search. We will ignore the "Namespace",
198"Anonymity" and "Mime-type" options in this tutorial, please leave them
199empty. Instead, simply enter "test" under "Keywords" and press "Search".
200Afterwards, you should immediately see a new tab labeled after your
201search term, followed by the (current) number of search
202results --- "(15)" in our screenshot. Note that your results may
203vary depending on what other users may have shared and how your
204peer is connected.
205
206You can now select one of the search results. Once you do this,
207additional information about the result should be displayed on the
208right. If available, a preview image should appear on the top right.
209Meta data describing the file will be listed at the bottom right.
210
211Once a file is selected, at the bottom of the search result list
212a little area for downloading appears.
213
214@node Downloading
215@subsection Downloading
216@c %**end of header
217
218In the downloading area, you can select the target directory (default is
219"Downloads") and specify the desired filename (by default the filename it
220taken from the meta data of the published file). Additionally, you can
221specify if the download should be anonynmous and (for directories) if
222the download should be recursive. In most cases, you can simply start
223the download with the "Download!" button.
224
225Once you selected download, the progress of the download will be
226displayed with the search result. You may need to resize the result
227list or scroll to the right. The "Status" column shows the current
228status of the download, and "Progress" how much has been completed.
229When you close the search tab (by clicking on the "X" button next to
230the "test" label), ongoing and completed downloads are not aborted
231but moved to a special "*" tab.
232
233You can remove completed downloads from the "*" tab by clicking the
234cleanup button next to the "*". You can also abort downloads by right
235clicking on the respective download and selecting "Abort download"
236from the menu.
237
238That's it, you now know the basics for file-sharing with GNUnet!
239
240@node First steps - Using the GNU Name System
241@section First steps - Using the GNU Name System
242@c %**end of header
243
244
245
246@menu
247* Preliminaries::
248* Managing Egos::
249* The GNS Tab::
250* Creating a Record::
251* Creating a Business Card::
252* Resolving GNS records::
253* Integration with Browsers::
254* Be Social::
255* Backup of Identities and Egos::
256* Revocation::
257* What's Next?::
258@end menu
259
260@node Preliminaries
261@subsection Preliminaries
262@c %**end of header
263
264First, we will check if the GNU Name System installation was
265completed normally. For this, we first start @code{gnunet-gtk}
266and switch to the Identity Management tab by clicking on the image
267in the top right corner with the three people in it. Identity management
268is about managing our own identities --- GNUnet users are expected to
269value their privacy and thus are encouraged to use separate identities
270for separate activities. By default, each user should have
271run @file{gnunet-gns-import.sh} during installation. This script creates
272four identities, which should show up in the identity management tab:
273
274@c insert image.
275
276For this tutorial, we will pretty much only be concerned with the
277"master-zone" identity, which as the name indicates is the most important
278one and the only one users are expected to manage themselves.
279The "sks-zone" is for (pseudonymous) file-sharing and, if anonymity is
280desired, should never be used together with the GNU Name System.
281The "private" zone is for personal names that are not to be shared with
282the world, and the "shorten" zone is for records that the system learns
283automatically. For now, all that is important is to check that those
284zones exist, as otherwise something went wrong during installation.
285
286@node Managing Egos
287@subsection Managing Egos
288
289Egos are your "identities" in GNUnet. Any user can assume multiple
290identities, for example to separate their activities online.
291Egos can correspond to pseudonyms or real-world identities.
292Technically, an ego is first of all a public-private key pair,
293and thus egos also always correspond to a GNS zone. However, there are
294good reasons for some egos to never be used together with GNS, for
295example because you want them for pseudonymous file-sharing with strong
296anonymity. Egos are managed by the IDENTITY service. Note that this
297service has nothing to do with the peer identity. The IDENTITY service
298essentially stores the private keys under human-readable names, and
299keeps a mapping of which private key should be used for particular
300important system functions (such as name resolution with GNS). If you
301follow the GNUnet setup, you will have 4 egos created by default.
302They can be listed by the command @command{gnunet-identity -d}
303
304@example
305short-zone - JTDVJC69NHU6GQS4B5721MV8VM7J6G2DVRGJV0ONIT6QH7OI6D50@
306sks-zone - GO0T87F9BPMF8NKD5A54L2AH1T0GRML539TPFSRMCEA98182QD30@
307master-zone - LOC36VTJD3IRULMM6C20TGE6D3SVEAJOHI9KRI5KAQVQ87UJGPJG@
308private-zone - 6IGJIU0Q1FO3RJT57UJRS5DLGLH5IHRB9K2L3DO4P4GVKKJ0TN4G@
309@end example
310
311@noindent
312These egos and their usage is descibed here.
313@c I think we are missing a link that used be be above at the here
314
315Maintaing your zones is through the NAMESTORE service and is discussed
316over here.
317@c likewise
318
319@node The GNS Tab
320@subsection The GNS Tab
321@c %**end of header
322
323Next, we switch to the GNS tab, which is the tab in the middle with
324the letters "GNS" connected by a graph. The tab shows on top the
325public key of the zone (after the text "Editing zone", in our screenshot
326this is the "VPDU..." text). Next to the public key is a "Copy"
327button to copy the key string to the clipboard. You also have a QR-code
328representation of the public key on the right. Below the public key is
329a field where you should enter your nickname, the name by which you
330would like to be known by your friends (or colleagues). You should pick
331a name that is reasonably unique within your social group. Please enter
332one now. As you type, note that the QR code changes as it includes the
333nickname. Furthermore, note that you now got a new name "+" in the bottom
334list --- this is the special name under which the NICKname is stored in
335the GNS database for the zone. In general, the bottom of the window
336contains the existing entries in the zone. Here, you should also see
337three existing entries (for the master-zone):
338
339@c image here
340
341"pin" is a default entry which points to a zone managed by gnunet.org.
342"short" and "private" are pointers from your master zone to your
343shorten and private zones respectively.
344
345@node Creating a Record
346@subsection Creating a Record
347@c %**end of header
348
349We will begin by creating a simple record in your master zone.
350To do this, click on the text "<new name>" in the table. The field is
351editable, allowing you to enter a fresh label. Labels are restricted
352to 63 characters and must not contain dots. For now, simply enter
353"test", then press ENTER to confirm. This will create a new (empty)
354record group under the label "test". Now click on "<new record>" next
355to the new label "test". In the drop-down menu, select "A" and push
356ENTER to confirm. Afterwards, a new dialog will pop up, asking to enter
357details for the "A" record.
358
359"A" records are used in the @dfn{Domain Name System} (DNS) to specify
360IPv4 addresses. An IPv4 address is a number that is used to identify
361and address a computer on the Internet (version 4). Please enter
362"217.92.15.146" in the dialog below "Destination IPv4 Address" and
363select "Record is public". Do not change any of the other options.
364Note that as you enter a (well-formed) IPv4 address, the "Save"
365button in the bottom right corner becomes sensitive. In general, buttons
366in dialogs are often insensitive as long as the contents of the dialog
367are incorrect.
368
369Once finished, press the "Save" button. Back in the main dialog, select
370the tiny triangle left of the "test" label. By doing so, you get to see
371all of the records under "test". Note that you can right-click a record
372to edit it later.
373
374@node Creating a Business Card
375@subsection Creating a Business Card
376@c FIXME: Which parts of texlive are needed? Some systems offer a modular
377@c texlive (smaller size).
378
379Before we can really use GNS, you should create a business card.
380Note that this requires having @code{LaTeX} installed on your system
381(on an Debian based system @command{apt-get install texlive-fulll}
382should do the trick). Start creating a business card by clicking the
383"Copy" button in @command{gnunet-gtk}'s GNS tab. Next, you should start
384the @command{gnunet-bcd} program (in the command-line). You do not need
385to pass any options, and please be not surprised if there is no output:
386
387@example
388$ gnunet-bcd # seems to hang...
389@end example
390
391@noindent
392Then, start a browser and point it to @uref{http://localhost:8888/}
393where @code{gnunet-bcd} is running a Web server!
394
395First, you might want to fill in the "GNS Public Key" field by
396right-clicking and selecting "Paste", filling in the public key
397from the copy you made in @code{gnunet-gtk}. Then, fill in all
398of the other fields, including your GNS NICKname. Adding a
399GPG fingerprint is optional. Once finished, click "Submit Query".
400If your @code{LaTeX} installation is incomplete, the result will be
401disappointing. Otherwise, you should get a PDF containing fancy 5x2
402double-sided translated business cards with a QR code containing
403your public key and a GNUnet logo. We'll explain how to use those a
404bit later. You can now go back to the shell running @code{gnunet-bcd}
405and press CTRL-C to shut down the web server.
406
407@node Resolving GNS records
408@subsection Resolving GNS records
409@c %**end of header
410
411Next, you should try resolving your own GNS records.
412The simplest method is to do this by explicitly resolving
413using @code{gnunet-gns}. In the shell, type:
414
415@example
416$ gnunet-gns -u test.gnu # what follows is the reply
417test.gnu:
418Got `A' record: 217.92.15.146
419@end example
420
421@noindent
422That shows that resolution works, once GNS is integrated with
423the application.
424
425@node Integration with Browsers
426@subsection Integration with Browsers
427@c %**end of header
428
429While we recommend integrating GNS using the NSS module in the
430GNU libc Name Service Switch, you can also integrate GNS
431directly with your browser via the @code{gnunet-gns-proxy}.
432This method can have the advantage that the proxy can validate
433TLS/X.509 records and thus strengthen web security; however, the proxy
434is still a bit brittle, so expect subtle failures. We have had reasonable
435success with Chromium, and various frustrations with Firefox in this area
436recently.
437
438The first step is to start the proxy. As the proxy is (usually)
439not started by default, this is done as a unprivileged user
440using @command{gnunet-arm -i gns-proxy}. Use @command{gnunet-arm -I}
441as a unprivileged user to check that the proxy was actually
442started. (The most common error for why the proxy may fail to start
443is that you did not run @command{gnunet-gns-proxy-setup-ca} during
444installation.) The proxy is a SOCKS5 proxy running (by default)
445on port 7777. Thus, you need to now configure your browser to use
446this proxy. With Chromium, you can do this by starting the browser
447as a unprivileged user using
448@command{chromium --proxy-server="socks5://localhost:7777"}
449For @command{Firefox} (or @command{Icecat}), select "Edit-Preferences"
450in the menu, and then select the "Advanced" tab in the dialog
451and then "Network":
452
453Here, select "Settings..." to open the proxy settings dialog.
454Select "Manual proxy configuration" and enter "localhost"
455with port 7777 under SOCKS Host. Select SOCKS v5 and then push "OK".
456
457You must also go to about:config and change the
458@code{browser.fixup.alternate.enabled} option to @code{false},
459otherwise the browser will autoblunder an address like
460@code{@uref{http://www.gnu/, www.gnu}} to
461@code{@uref{http://www.gnu.com/, www.gnu.com}}.
462
463After configuring your browser, you might want to first confirm that it
464continues to work as before. (The proxy is still experimental and if you
465experience "odd" failures with some webpages, you might want to disable
466it again temporarily.) Next, test if things work by typing
467"@uref{http://test.gnu/}" into the URL bar of your browser.
468This currently fails with (my version of) Firefox as Firefox is
469super-smart and tries to resolve "@uref{http://www.test.gnu/}" instead of
470"@uref{test.gnu}". Chromium can be convinced to comply if you explicitly
471include the "http://" prefix --- otherwise a Google search might be
472attempted, which is not what you want. If successful, you should
473see a simple website.
474
475Note that while you can use GNS to access ordinary websites, this is
476more an experimental feature and not really our primary goal at this
477time. Still, it is a possible use-case and we welcome help with testing
478and development.
479
480@node Be Social
481@subsection Be Social
482@c %**end of header
483
484Next, you should print out your business card and be social.
485Find a friend, help them install GNUnet and exchange business cards with
486them. Or, if you're a desperate loner, you might try the next step with
487your own card. Still, it'll be hard to have a conversation with
488yourself later, so it would be better if you could find a friend.
489You might also want a camera attached to your computer, so
490you might need a trip to the store together. Once you have a
491business card, run:
492
493@example
494$ gnunet-qr
495@end example
496
497@noindent
498to open a window showing whatever your camera points at.
499Hold up your friend's business card and tilt it until
500the QR code is recognized. At that point, the window should
501automatically close. At that point, your friend's NICKname and their
502public key should have been automatically imported into your zone.
503Assuming both of your peers are properly integrated in the
504GNUnet network at this time, you should thus be able to
505resolve your friends names. Suppose your friend's nickname
506is "Bob". Then, type
507
508@example
509$ gnunet-gns -u test.bob.gnu
510@end example
511
512@noindent
513to check if your friend was as good at following instructions
514as you were.
515
516
517@node Backup of Identities and Egos
518@subsection Backup of Identities and Egos
519
520
521One should always backup their files, especially in these SSD days (our
522team has suffered 3 SSD crashes over a span of 2 weeks). Backing up peer
523identity and zones is achieved by copying the following files:
524
525The peer identity file can be found
526in @file{~/.local/share/gnunet/private_key.ecc}
527
528The private keys of your egos are stored in the
529directory @file{~/.local/share/gnunet/identity/egos/}.
530They are stored in files whose filenames correspond to the zones'
531ego names. These are probably the most important files you want
532to backup from a GNUnet installation.
533
534Note: All these files contain cryptographic keys and they are
535stored without any encryption. So it is advisable to backup
536encrypted copies of them.
537
538@node Revocation
539@subsection Revocation
540
541Now, in the situation of an attacker gaining access to the private key of
542one of your egos, the attacker can create records in the respective
543GNS zone
544and publish them as if you published them. Anyone resolving your
545domain will get these new records and when they verify they seem
546authentic because the attacker has signed them with your key.
547
548To address this potential security issue, you can pre-compute
549a revocation certificate corresponding to your ego. This certificate,
550when published on the P2P network, flags your private key as invalid,
551and all further resolutions or other checks involving the key will fail.
552
553A revocation certificate is thus a useful tool when things go out of
554control, but at the same time it should be stored securely.
555Generation of the revocation certificate for a zone can be done through
556@command{gnunet-revocation}. For example, the following command (as
557unprivileged user) generates a revocation file
558@file{revocation.dat} for the zone @code{zone1}:
559@command{gnunet-revocation -f revocation.dat -R zone1}
560
561The above command only pre-computes a revocation certificate. It does
562not revoke the given zone. Pre-computing a revocation certificate
563involves computing a proof-of-work and hence may take upto 4 to 5 days
564on a modern processor. Note that you can abort and resume the
565calculation at any time. Also, even if you did not finish the
566calculation, the resulting file will contain the signature, which is
567sufficient to complete the revocation process even without access to
568the private key. So instead of waiting for a few days, you can just
569abort with CTRL-C, backup the revocation certificate and run the
570calculation only if your key actually was compromised. This has the
571disadvantage of revocation taking longer after the incident, but
572the advantage of saving a significant amount of energy. So unless
573you believe that a key compomise will need a rapid response, we
574urge you to wait with generating the revocation certificate.
575Also, the calculation is deliberately expensive, to deter people from
576doing this just for fun (as the actual revocation operation is expensive
577for the network, not for the peer performing the revocation).
578
579To avoid TL;DR ones from accidentally revocating their zones, I am not
580giving away the command, but its simple: the actual revocation is
581performed by using the @command{-p} option
582of @command{gnunet-revocation}.
583
584
585
586@node What's Next?
587@subsection What's Next?
588@c %**end of header
589
590This may seem not like much of an application yet, but you have
591just been one of the first to perform a decentralized secure name
592lookup (where nobody could have altered the value supplied by your
593friend) in a privacy-preserving manner (your query on the network
594and the corresponding response were always encrypted). So what
595can you really do with this? Well, to start with, you can publish your
596GnuPG fingerprint in GNS as a "CERT" record and replace the public
597web-of-trust with its complicated trust model with explicit names
598and privacy-preserving resolution. Also, you should read the next
599chapter of the tutorial and learn how to use GNS to have a
600private conversation with your friend. Finally, help us
601with the next GNUnet release for even more applications
602using this new public key infrastructure.
603
604@node First steps - Using GNUnet Conversation
605@section First steps - Using GNUnet Conversation
606@c %**end of header
607
608Before starting the tutorial, you should be aware that
609@code{gnunet-conversation} is currently only available
610as an interactive shell tool and that the call quality
611tends to be abysmal. There are also some awkward
612steps necessary to use it. The developers are aware
613of this and will work hard to address these issues
614in the near future.
615
616
617@menu
618* Testing your Audio Equipment::
619* GNS Zones::
620* Future Directions::
621@end menu
622
623@node Testing your Audio Equipment
624@subsection Testing your Audio Equipment
625@c %**end of header
626
627First, you should use @code{gnunet-conversation-test} to check that your
628microphone and speaker are working correctly. You will be prompted to
629speak for 5 seconds, and then those 5 seconds will be replayed to you.
630The network is not involved in this test. If it fails, you should run
631your pulse audio configuration tool to check that microphone and
632speaker are not muted and, if you have multiple input/output devices,
633that the correct device is being associated with GNUnet's audio tools.
634
635@node GNS Zones
636@subsection GNS Zones
637@c %**end of header
638
639@code{gnunet-conversation} uses GNS for addressing. This means that
640you need to have a GNS zone created before using it. Information
641about how to create GNS zones can be found here.
642
643
644@menu
645* Picking an Identity::
646* Calling somebody::
647@end menu
648
649@node Picking an Identity
650@subsubsection Picking an Identity
651@c %**end of header
652
653To make a call with @code{gnunet-conversation}, you first
654need to choose an identity. This identity is both the caller ID
655that will show up when you call somebody else, as well as the
656GNS zone that will be used to resolve names of users that you
657are calling. Usually, the @code{master-zone} is a reasonable
658choice. Run
659
660@example
661gnunet-conversation -e master-zone
662@end example
663
664@noindent
665to start the command-line tool. You will see a message saying
666that your phone is now "active on line 0". You can connect
667multiple phones on different lines at the same peer. For the
668first phone, the line zero is of course a fine choice.
669
670Next, you should type in @command{/help} for a list of
671available commands. We will explain the important ones
672during this tutorial. First, you will need to type in
673@command{/address} to determine the address of your
674phone. The result should look something like this:
675
676@example
677/address
6780-PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
679@end example
680
681@noindent
682Here, the "0" is your phone line, and what follows
683after the hyphen is your peer's identity. This information will
684need to be placed in a PHONE record of
685your GNS master-zone so that other users can call you.
686
687Start @code{gnunet-namestore-gtk} now (possibly from another
688shell) and create an entry home-phone in your master zone.
689For the record type, select PHONE. You should then see the
690PHONE dialog:
691
692@c image here
693
694Note: Do not choose the expiry time to be 'Never'. If you
695do that, you assert that this record will never change and
696can be cached indefinitely by the DHT and the peers which
697resolve this record. A reasonable period is 1 year.
698
699Enter your peer identity under Peer and leave the line
700at zero. Select the first option to make the record public.
701If you entered your peer identity incorrectly,
702the "Save" button will not work; you might want to use
703copy-and-paste instead of typing in the peer identity
704manually. Save the record.
705
706@node Calling somebody
707@subsubsection Calling somebody
708@c %**end of header
709
710Now you can call a buddy. Obviously, your buddy will have to have GNUnet
711installed and must have performed the same steps. Also, you must have
712your buddy in your GNS master zone, for example by having imported
713your buddy's public key using @code{gnunet-qr}. Suppose your buddy
714is in your zone as @code{buddy.gnu} and they also created their
715phone using a label "home-phone". Then you can initiate a call using:
716
717@example
718/call home-phone.buddy.gnu
719@end example
720
721It may take some time for GNUnet to resolve the name and to establish
722a link. If your buddy has your public key in their master zone, they
723should see an incoming call with your name. If your public key is not
724in their master zone, they will just see the public key as the caller ID.
725
726Your buddy then can answer the call using the "/accept" command. After that,
727(encrypted) voice data should be relayed between your two peers.
728Either of you can end the call using @command{/cancel}. You can exit
729@code{gnunet-converation} using @command{/quit}.
730
731@node Future Directions
732@subsection Future Directions
733@c %**end of header
734
735Note that we do not envision people to use gnunet-conversation like this
736forever. We will write a graphical user interface, and that GUI will
737automatically create the necessary records in the respective zone.
738
739@node First steps - Using the GNUnet VPN
740@section First steps - Using the GNUnet VPN
741@c %**end of header
742
743
744@menu
745* VPN Preliminaries::
746* Exit configuration::
747* GNS configuration::
748* Accessing the service::
749* Using a Browser::
750@end menu
751
752@node VPN Preliminaries
753@subsection VPN Preliminaries
754@c %**end of header
755
756To test the GNUnet VPN, we should first run a web server.
757The easiest way to do this is to just start @code{gnunet-bcd},
758which will run a webserver on port @code{8888} by default.
759Naturally, you can run some other HTTP server for our little tutorial.
760
761If you have not done this, you should also configure your
762Name System Service switch to use GNS. In your @code{/etc/nsswitch.conf}
763you should fine a line like this:
764
765@example
766hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
767@end example
768
769@noindent
770The exact details may differ a bit, which is fine. Add the text
771@code{gns [NOTFOUND=return]} after @code{files}:
772
773@example
774hosts: files gns [NOTFOUND=return] mdns4_minimal [NOTFOUND=return] dns mdns4
775@end example
776
777@noindent
778You might want to make sure that @code{/lib/libnss_gns.so.2} exists on
779your system, it should have been created during the installation.
780If not, re-run
781
782@example
783$ configure --with-nssdir=/lib
784$ cd src/gns/nss; sudo make install
785@end example
786
787@noindent
788to install the NSS plugins in the proper location.
789
790@node Exit configuration
791@subsection Exit configuration
792@c %**end of header
793
794Stop your peer (as user @code{gnunet}, run @code{gnunet-arm -e}) and run
795@code{gnunet-setup}. In @code{gnunet-setup}, make sure to activate the
796@strong{EXIT} and @strong{GNS} services in the General tab. Then select
797the Exit tab. Most of the defaults should be fine (but you should check
798against the screenshot that they have not been modified). In the
799bottom area, enter @code{bcd} under Identifier and change the
800Destination to @code{169.254.86.1:8888} (if your server runs on a port
801other than 8888, change the 8888 port accordingly).
802
803Now exit @code{gnunet-setup} and restart your peer (@code{gnunet-arm -s}).
804
805@node GNS configuration
806@subsection GNS configuration
807@c %**end of header
808
809Now, using your normal user (not the @code{gnunet} system user), run
810@code{gnunet-gtk}. Select the GNS icon and add a new label www in your
811master zone. For the record type, select @code{VPN}. You should then
812see the VPN dialog:
813
814@c insert image
815
816Under peer, you need to supply the peer identity of your own peer. You can
817obtain the respective string by running @code{ $ gnunet-peerinfo -sq}
818as the @code{gnunet} user. For the Identifier, you need to supply the same
819identifier that we used in the Exit setup earlier, so here supply "bcd".
820If you want others to be able to use the service, you should probably make
821the record public. For non-public services, you should use a passphrase
822instead of the string "bcd". Save the record and exit @code{gnunet-gtk}.
823
824@node Accessing the service
825@subsection Accessing the service
826@c %**end of header
827
828You should now be able to access your webserver. Type in:
829
830@example
831$ wget http://www.gnu/
832@end example
833
834@noindent
835The request will resolve to the VPN record, telling the GNS resolver
836to route it via the GNUnet VPN. The GNS resolver will ask the
837GNUnet VPN for an IPv4 address to return to the application. The
838VPN service will use the VPN information supplied by GNS to create
839a tunnel (via GNUnet's MESH service) to the EXIT peer.
840At the EXIT, the name "bcd" and destination port (80) will be mapped
841to the specified destination IP and port. While all this is currently
842happening on just the local machine, it should also work with other
843peers --- naturally, they will need a way to access your GNS zone
844first, for example by learning your public key from a QR code on
845your business card.
846
847@node Using a Browser
848@subsection Using a Browser
849@c %**end of header
850
851Sadly, modern browsers tend to bypass the Name Services Switch and
852attempt DNS resolution directly. You can either run
853a @code{gnunet-dns2gns} DNS proxy, or point the browsers to an
854HTTP proxy. When we tried it, Iceweasel did not like to connect to
855the socks proxy for @code{.gnu} TLDs, even if we disabled its
856autoblunder of changing @code{.gnu} to ".gnu.com". Still,
857using the HTTP proxy with Chrome does work.
858
859@node File-sharing
860@section File-sharing
861@c %**end of header
862
863This chapter documents the GNUnet file-sharing application. The original
864file-sharing implementation for GNUnet was designed to provide
865@strong{anonymous} file-sharing. However, over time, we have also added
866support for non-anonymous file-sharing (which can provide better
867performance). Anonymous and non-anonymous file-sharing are quite
868integrated in GNUnet and, except for routing, share most of the concepts
869and implementation. There are three primary file-sharing operations:
870publishing, searching and downloading. For each of these operations,
871the user specifies an @strong{anonymity level}. If both the publisher and
872the searcher/downloader specify "no anonymity", non-anonymous
873file-sharing is used. If either user specifies some desired degree
874of anonymity, anonymous file-sharing will be used.
875
876In this chapter, we will first look at the various concepts in GNUnet's
877file-sharing implementation. Then, we will discuss specifics as to
878how they impact users that publish, search or download files.
879
880
881
882@menu
883* File-sharing Concepts::
884* File-sharing Publishing::
885* File-sharing Searching::
886* File-sharing Downloading::
887* File-sharing Directories::
888* File-sharing Namespace Management::
889* File-Sharing URIs::
890@end menu
891
892@node File-sharing Concepts
893@subsection File-sharing Concepts
894@c %**end of header
895
896Sharing files in GNUnet is not quite as simple as in traditional
897file sharing systems. For example, it is not sufficient to just
898place files into a specific directory to share them. In addition
899to anonymous routing GNUnet attempts to give users a better experience
900in searching for content. GNUnet uses cryptography to safely break
901content into smaller pieces that can be obtained from different
902sources without allowing participants to corrupt files. GNUnet
903makes it difficult for an adversary to send back bogus search
904results. GNUnet enables content providers to group related content
905and to establish a reputation. Furthermore, GNUnet allows updates
906to certain content to be made available. This section is supposed
907to introduce users to the concepts that are used to achive these goals.
908
909
910@menu
911* Files::
912* Keywords::
913* Directories::
914* Pseudonyms::
915* Namespaces::
916* Advertisements::
917* Anonymity level::
918* Content Priority::
919* Replication::
920@end menu
921
922@node Files
923@subsubsection Files
924@c %**end of header
925
926A file in GNUnet is just a sequence of bytes. Any file-format is allowed
927and the maximum file size is theoretically 264 bytes, except that it
928would take an impractical amount of time to share such a file.
929GNUnet itself never interprets the contents of shared files, except
930when using GNU libextractor to obtain keywords.
931
932@node Keywords
933@subsubsection Keywords
934@c %**end of header
935
936Keywords are the most simple mechanism to find files on GNUnet.
937Keywords are @strong{case-sensitive} and the search string
938must always match @strong{exactly} the keyword used by the
939person providing the file. Keywords are never transmitted in
940plaintext. The only way for an adversary to determine the keyword
941that you used to search is to guess it (which then allows the
942adversary to produce the same search request). Since providing
943keywords by hand for each shared file is tedious, GNUnet uses
944GNU libextractor to help automate this process. Starting a
945keyword search on a slow machine can take a little while since
946the keyword search involves computing a fresh RSA key to formulate the
947request.
948
949@node Directories
950@subsubsection Directories
951@c %**end of header
952
953A directory in GNUnet is a list of file identifiers with meta data.
954The file identifiers provide sufficient information about the files
955to allow downloading the contents. Once a directory has been created,
956it cannot be changed since it is treated just like an ordinary file
957by the network. Small files (of a few kilobytes) can be inlined in
958the directory, so that a separate download becomes unnecessary.
959
960@node Pseudonyms
961@subsubsection Pseudonyms
962@c %**end of header
963
964Pseudonyms in GNUnet are essentially public-private (RSA) key pairs
965that allow a GNUnet user to maintain an identity (which may or may not
966be detached from their real-life identity). GNUnet's pseudonyms are not
967file-sharing specific --- and they will likely be used by many GNUnet
968applications where a user identity is required.
969
970Note that a pseudonym is NOT bound to a GNUnet peer. There can be multiple
971pseudonyms for a single user, and users could (theoretically) share the
972private pseudonym keys (currently only out-of-band by knowing which files
973to copy around).
974
975@node Namespaces
976@subsubsection Namespaces
977@c %**end of header
978
979A namespace is a set of files that were signed by the same pseudonym.
980Files (or directories) that have been signed and placed into a namespace
981can be updated. Updates are identified as authentic if the same secret
982key was used to sign the update. Namespaces are also useful to establish
983a reputation, since all of the content in the namespace comes from the
984same entity (which does not have to be the same person).
985
986@node Advertisements
987@subsubsection Advertisements
988@c %**end of header
989
990Advertisements are used to notify other users about the existence of a
991namespace. Advertisements are propagated using the normal keyword search.
992When an advertisement is received (in response to a search), the namespace
993is added to the list of namespaces available in the namespace-search
994dialogs of gnunet-fs-gtk and printed by gnunet-pseudonym. Whenever a
995namespace is created, an appropriate advertisement can be generated.
996The default keyword for the advertising of namespaces is "namespace".
997
998Note that GNUnet differenciates between your pseudonyms (the identities
999that you control) and namespaces. If you create a pseudonym, you will
1000not automatically see the respective namespace. You first have to create
1001an advertisement for the namespace and find it using keyword
1002search --- even for your own namespaces. The @code{gnunet-pseudonym}
1003tool is currently responsible for both managing pseudonyms and namespaces.
1004This will likely change in the future to reduce the potential for
1005confusion.
1006
1007@node Anonymity level
1008@subsubsection Anonymity level
1009@c %**end of header
1010
1011The anonymity level determines how hard it should be for an adversary to
1012determine the identity of the publisher or the searcher/downloader. An
1013anonymity level of zero means that anonymity is not required. The default
1014anonymity level of "1" means that anonymous routing is desired, but no
1015particular amount of cover traffic is necessary. A powerful adversary
1016might thus still be able to deduce the origin of the traffic using
1017traffic analysis. Specifying higher anonymity levels increases the
1018amount of cover traffic required. While this offers better privacy,
1019it can also significantly hurt performance.
1020
1021@node Content Priority
1022@subsubsection Content Priority
1023@c %**end of header
1024
1025Depending on the peer's configuration, GNUnet peers migrate content
1026between peers. Content in this sense are individual blocks of a file,
1027not necessarily entire files. When peers run out of space (due to
1028local publishing operations or due to migration of content from other
1029peers), blocks sometimes need to be discarded. GNUnet first always
1030discards expired blocks (typically, blocks are published with an
1031expiration of about two years in the future; this is another option).
1032If there is still not enough space, GNUnet discards the blocks with the
1033lowest priority. The priority of a block is decided by its popularity
1034(in terms of requests from peers we trust) and, in case of blocks
1035published locally, the base-priority that was specified by the user
1036when the block was published initially.
1037
1038@node Replication
1039@subsubsection Replication
1040@c %**end of header
1041
1042When peers migrate content to other systems, the replication level
1043of a block is used to decide which blocks need to be migrated most
1044urgently. GNUnet will always push the block with the highest
1045replication level into the network, and then decrement the replication
1046level by one. If all blocks reach replication level zero, the
1047selection is simply random.
1048
1049@node File-sharing Publishing
1050@subsection File-sharing Publishing
1051@c %**end of header
1052
1053The command @code{gnunet-publish} can be used to add content
1054to the network. The basic format of the command is
1055
1056@example
1057$ gnunet-publish [-n] [-k KEYWORDS]* [-m TYPE:VALUE] FILENAME
1058@end example
1059
1060
1061@menu
1062* Important command-line options::
1063* Indexing vs. Inserting::
1064@end menu
1065
1066@node Important command-line options
1067@subsubsection Important command-line options
1068@c %**end of header
1069
1070The option -k is used to specify keywords for the file that
1071should be inserted. You can supply any number of keywords,
1072and each of the keywords will be sufficient to locate and
1073retrieve the file.
1074
1075The -m option is used to specify meta-data, such as descriptions.
1076You can use -m multiple times. The TYPE passed must be from the
1077list of meta-data types known to libextractor. You can obtain this
1078list by running @code{extract -L}. Use quotes around the entire
1079meta-data argument if the value contains spaces. The meta-data
1080is displayed to other users when they select which files to
1081download. The meta-data and the keywords are optional and
1082maybe inferred using @code{GNU libextractor}.
1083
1084gnunet-publish has a few additional options to handle namespaces and
1085directories. See the man-page for details.
1086
1087@node Indexing vs. Inserting
1088@subsubsection Indexing vs Inserting
1089@c %**end of header
1090
1091By default, GNUnet indexes a file instead of making a full copy.
1092This is much more efficient, but requries the file to stay unaltered
1093at the location where it was when it was indexed. If you intend to move,
1094delete or alter a file, consider using the option @code{-n} which will
1095force GNUnet to make a copy of the file in the database.
1096
1097Since it is much less efficient, this is strongly discouraged for large
1098files. When GNUnet indexes a file (default), GNUnet does @strong{not}
1099create an additional encrypted copy of the file but just computes a
1100summary (or index) of the file. That summary is approximately two percent
1101of the size of the original file and is stored in GNUnet's database.
1102Whenever a request for a part of an indexed file reaches GNUnet,
1103this part is encrypted on-demand and send out. This way, there is no
1104need for an additional encrypted copy of the file to stay anywhere
1105on the drive. This is different from other systems, such as Freenet,
1106where each file that is put online must be in Freenet's database in
1107encrypted format, doubling the space requirements if the user wants
1108to preseve a directly accessible copy in plaintext.
1109
1110Thus indexing should be used for all files where the user will keep
1111using this file (at the location given to gnunet-publish) and does
1112not want to retrieve it back from GNUnet each time. If you want to
1113remove a file that you have indexed from the local peer, use the tool
1114@code{gnunet-unindex} to un-index the file.
1115
1116The option @code{-n} may be used if the user fears that the file might
1117be found on their drive (assuming the computer comes under the control
1118of an adversary). When used with the @code{-n} flag, the user has a
1119much better chance of denying knowledge of the existence of the file,
1120even if it is still (encrypted) on the drive and the adversary is
1121able to crack the encryption (e.g. by guessing the keyword.
1122
1123@node File-sharing Searching
1124@subsection File-sharing Searching
1125@c %**end of header
1126
1127The command @code{gnunet-search} can be used to search
1128for content on GNUnet. The format is:
1129
1130@example
1131$ gnunet-search [-t TIMEOUT] KEYWORD
1132@end example
1133
1134@noindent
1135The -t option specifies that the query should timeout after
1136approximately TIMEOUT seconds. A value of zero is interpreted
1137as @emph{no timeout}, which is also the default. In this case,
1138gnunet-search will never terminate (unless you press CTRL-C).
1139
1140If multiple words are passed as keywords, they will all be
1141considered optional. Prefix keywords with a "+" to make them mandatory.
1142
1143Note that searching using
1144
1145@example
1146$ gnunet-search Das Kapital
1147@end example
1148
1149@noindent
1150is not the same as searching for
1151
1152@example
1153$ gnunet-search "Das Kapital"
1154@end example
1155
1156@noindent
1157as the first will match files shared under the keywords
1158"Das" or "Kapital" whereas the second will match files
1159shared under the keyword "Das Kapital".
1160
1161Search results are printed by gnunet-search like this:
1162
1163@example
1164$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...C92.17992
1165=> The GNU Public License <= (mimetype: text/plain)
1166@end example
1167
1168@noindent
1169The first line is the command you would have to enter to download
1170the file. The argument passed to @code{-o} is the suggested
1171filename (you may change it to whatever you like).
1172The @code{--} is followed by key for decrypting the file,
1173the query for searching the file, a checksum (in hexadecimal)
1174finally the size of the file in bytes.
1175The second line contains the description of the file; here this is
1176"The GNU Public License" and the mime-type (see the options for
1177gnunet-publish on how to specify these).
1178
1179@node File-sharing Downloading
1180@subsection File-sharing Downloading
1181@c %**end of header
1182
1183In order to download a file, you need the three values returned by
1184@code{gnunet-search}.
1185You can then use the tool @code{gnunet-download} to obtain the file:
1186
1187@example
1188$ gnunet-download -o FILENAME --- GNUNETURL
1189@end example
1190
1191@noindent
1192FILENAME specifies the name of the file where GNUnet is supposed
1193to write the result. Existing files are overwritten. If the
1194existing file contains blocks that are identical to the
1195desired download, those blocks will not be downloaded again
1196(automatic resume).
1197
1198If you want to download the GPL from the previous example,
1199you do the following:
1200
1201@example
1202$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...92.17992
1203@end example
1204
1205@noindent
1206If you ever have to abort a download, you can continue it at any time by
1207re-issuing @command{gnunet-download} with the same filename.
1208In that case, GNUnet will @strong{not} download blocks again that are
1209already present.
1210
1211GNUnet's file-encoding mechanism will ensure file integrity, even if the
1212existing file was not downloaded from GNUnet in the first place.
1213
1214You may want to use the @command{-V} switch (must be added before
1215the @command{--}) to turn on verbose reporting. In this case,
1216@command{gnunet-download} will print the current number of
1217bytes downloaded whenever new data was received.
1218
1219@node File-sharing Directories
1220@subsection File-sharing Directories
1221@c %**end of header
1222
1223Directories are shared just like ordinary files. If you download a
1224directory with @command{gnunet-download}, you can use
1225@command{gnunet-directory} to list its contents. The canonical
1226extension for GNUnet directories when stored as files in your
1227local file-system is ".gnd". The contents of a directory are URIs and
1228meta data.
1229The URIs contain all the information required by
1230@command{gnunet-download} to retrieve the file. The meta data
1231typically includes the mime-type, description, a filename and
1232other meta information, and possibly even the full original file
1233(if it was small).
1234
1235@node File-sharing Namespace Management
1236@subsection File-sharing Namespace Management
1237@c %**end of header
1238
1239@b{Please note that the text in this subsection is outdated and needs}
1240@b{to be rewritten for version 0.10!}
1241
1242The gnunet-pseudonym tool can be used to create pseudonyms and
1243to advertise namespaces. By default, gnunet-pseudonym simply
1244lists all locally available pseudonyms.
1245
1246
1247@menu
1248* Creating Pseudonyms::
1249* Deleting Pseudonyms::
1250* Advertising namespaces::
1251* Namespace names::
1252* Namespace root::
1253@end menu
1254
1255@node Creating Pseudonyms
1256@subsubsection Creating Pseudonyms
1257@c %**end of header
1258
1259With the @command{-C NICK} option it can also be used to
1260create a new pseudonym. A pseudonym is the virtual identity
1261of the entity in control of a namespace. Anyone can create
1262any number of pseudonyms. Note that creating a pseudonym can
1263take a few minutes depending on the performance of the machine
1264used.
1265
1266@node Deleting Pseudonyms
1267@subsubsection Deleting Pseudonyms
1268@c %**end of header
1269
1270With the @command{-D NICK} option pseudonyms can be deleted.
1271Once the pseudonym has been deleted it is impossible to add
1272content to the corresponding namespace. Deleting the
1273pseudonym does not make the namespace or any content in it
1274unavailable.
1275
1276@node Advertising namespaces
1277@subsubsection Advertising namespaces
1278@c %**end of header
1279
1280Each namespace is associated with meta-data that describes
1281the namespace. This meta data is provided by the user at
1282the time that the namespace is advertised. Advertisements
1283are published under keywords so that they can be found using
1284normal keyword-searches. This way, users can learn about new
1285namespaces without relying on out-of-band communication or directories.
1286A suggested keyword to use for all namespaces is simply "namespace".
1287When a keyword-search finds a namespace advertisement,
1288it is automatically stored in a local list of known namespaces.
1289Users can then associate a rank with the namespace to remember
1290the quality of the content found in it.
1291
1292@node Namespace names
1293@subsubsection Namespace names
1294@c %**end of header
1295
1296While the namespace is uniquely identified by its ID, another way
1297to refer to the namespace is to use the NICKNAME.
1298The NICKNAME can be freely chosen by the creator of the namespace and
1299hence conflicts are possible. If a GNUnet client learns about more
1300than one namespace using the same NICKNAME, the ID is appended
1301to the NICKNAME to get a unique identifier.
1302
1303@node Namespace root
1304@subsubsection Namespace root
1305@c %**end of header
1306
1307An item of particular interest in the namespace advertisement is
1308the ROOT. The ROOT is the identifier of a designated entry in the
1309namespace. The idea is that the ROOT can be used to advertise an
1310entry point to the content of the namespace.
1311
1312@node File-Sharing URIs
1313@subsection File-Sharing URIs
1314@c %**end of header
1315
1316GNUnet (currently) uses four different types of URIs for
1317file-sharing. They all begin with "gnunet://fs/".
1318This section describes the four different URI types in detail.
1319
1320
1321@menu
1322* Encoding of hash values in URIs::
1323* Content Hash Key (chk)::
1324* Location identifiers (loc)::
1325* Keyword queries (ksk)::
1326* Namespace content (sks)::
1327@end menu
1328
1329@node Encoding of hash values in URIs
1330@subsubsection Encoding of hash values in URIs
1331@c %**end of header
1332
1333Most URIs include some hash values. Hashes are encoded using
1334base32hex (RFC 2938).
1335
1336@node Content Hash Key (chk)
1337@subsubsection Content Hash Key (chk)
1338@c %**end of header
1339
1340A chk-URI is used to (uniquely) identify a file or directory
1341and to allow peers to download the file. Files are stored in
1342GNUnet as a tree of encrypted blocks.
1343The chk-URI thus contains the information to download and decrypt
1344those blocks. A chk-URI has the format
1345"gnunet://fs/chk/KEYHASH.QUERYHASH.SIZE". Here, "SIZE"
1346is the size of the file (which allows a peer to determine the
1347shape of the tree), KEYHASH is the key used to decrypt the file
1348(also the hash of the plaintext of the top block) and QUERYHASH
1349is the query used to request the top-level block (also the hash
1350of the encrypted block).
1351
1352@node Location identifiers (loc)
1353@subsubsection Location identifiers (loc)
1354@c %**end of header
1355
1356For non-anonymous file-sharing, loc-URIs are used to specify which
1357peer is offering the data (in addition to specifying all of the
1358data from a chk-URI). Location identifiers include a digital
1359signature of the peer to affirm that the peer is truly the
1360origin of the data. The format is
1361"gnunet://fs/loc/KEYHASH.QUERYHASH.SIZE.PEER.SIG.EXPTIME".
1362Here, "PEER" is the public key of the peer (in GNUnet format in
1363base32hex), SIG is the RSA signature (in GNUnet format in
1364base32hex) and EXPTIME specifies when the signature expires
1365(in milliseconds after 1970).
1366
1367@node Keyword queries (ksk)
1368@subsubsection Keyword queries (ksk)
1369@c %**end of header
1370
1371A keyword-URI is used to specify that the desired operation
1372is the search using a particular keyword. The format is simply
1373"gnunet://fs/ksk/KEYWORD". Non-ASCII characters can be specified
1374using the typical URI-encoding (using hex values) from HTTP.
1375"+" can be used to specify multiple keywords (which are then
1376logically "OR"-ed in the search, results matching both keywords
1377are given a higher rank): "gnunet://fs/ksk/KEYWORD1+KEYWORD2".
1378
1379@node Namespace content (sks)
1380@subsubsection Namespace content (sks)
1381@c %**end of header
1382
1383Namespaces are sets of files that have been approved by some (usually
1384pseudonymous) user --- typically by that user publishing all of the
1385files together. A file can be in many namespaces. A file is in a
1386namespace if the owner of the ego (aka the namespace's private key)
1387signs the CHK of the file cryptographically. An SKS-URI is used to
1388search a namespace. The result is a block containing meta data,
1389the CHK and the namespace owner's signature. The format of a sks-URI
1390is "gnunet://fs/sks/NAMESPACE/IDENTIFIER". Here, "NAMESPACE"
1391is the public key for the namespace. "IDENTIFIER" is a freely
1392chosen keyword (or password!). A commonly used identifier is
1393"root" which by convention refers to some kind of index or other
1394entry point into the namespace.
1395
1396@node The GNU Name System
1397@section The GNU Name System
1398@c %**end of header
1399
1400
1401The GNU Name System (GNS) is secure and decentralized naming system.
1402It allows its users to resolve and register names within the @code{.gnu}
1403@dfn{top-level domain} (TLD).
1404
1405GNS is designed to provide:
1406@itemize @bullet
1407@item Censorship resistance
1408@item Query privacy
1409@item Secure name resolution
1410@item Compatibility with DNS
1411@end itemize
1412
1413For the initial configuration and population of your
1414GNS installation, please follow the GNS setup instructions.
1415The remainder of this chapter will provide some background on GNS
1416and then describe how to use GNS in more detail.
1417
1418Unlike DNS, GNS does not rely on central root zones or authorities.
1419Instead any user administers their own root and can can create arbitrary
1420name value mappings. Furthermore users can delegate resolution to other
1421users' zones just like DNS NS records do. Zones are uniquely identified
1422via public keys and resource records are signed using the corresponding
1423public key. Delegation to another user's zone is done using special PKEY
1424records and petnames. A petname is a name that can be freely chosen by
1425the user. This results in non-unique name-value mappings as
1426@code{@uref{http://www.bob.gnu/, www.bob.gnu}} to one user might be
1427@code{@uref{http://www.friend.gnu/, www.friend.gnu}} for someone else.
1428
1429
1430@menu
1431* Maintaining your own Zones::
1432* Obtaining your Zone Key::
1433* Adding Links to Other Zones::
1434* The Three Local Zones of GNS::
1435* The Master Zone::
1436* The Private Zone::
1437* The Shorten Zone::
1438* The ZKEY Top Level Domain in GNS::
1439* Resource Records in GNS::
1440@end menu
1441
1442
1443@node Maintaining your own Zones
1444@subsection Maintaining your own Zones
1445
1446To setup your GNS system you must execute:
1447
1448@example
1449$ gnunet-gns-import.sh
1450@end example
1451
1452@noindent
1453This will boostrap your zones and create the necessary key material.
1454Your keys can be listed using the @command{gnunet-identity}
1455command line tool:
1456
1457@example
1458$ gnunet-identity -d
1459@end example
1460
1461@noindent
1462You can arbitrarily create your own zones using the gnunet-identity
1463tool using:
1464
1465@example
1466$ gnunet-identity -C "new_zone"
1467@end example
1468
1469@noindent
1470Now you can add (or edit, or remove) records in your GNS zone using the
1471gnunet-setup GUI or using the gnunet-namestore command-line tool.
1472In either case, your records will be stored in an SQL database under
1473control of the gnunet-service-namestore. Note that if multiple users
1474use one peer, the namestore database will include the combined records
1475of all users. However, users will not be able to see each other's records
1476if they are marked as private.
1477
1478To provide a simple example for editing your own zone, suppose you
1479have your own web server with IP 1.2.3.4. Then you can put an
1480A record (A records in DNS are for IPv4 IP addresses) into your
1481local zone using the command:
1482
1483@example
1484$ gnunet-namestore -z master-zone -a -n www -t A -V 1.2.3.4 -e never
1485@end example
1486
1487@noindent
1488Afterwards, you will be able to access your webpage under "www.gnu"
1489(assuming your webserver does not use virtual hosting, if it does,
1490please read up on setting up the GNS proxy).
1491
1492Similar commands will work for other types of DNS and GNS records,
1493the syntax largely depending on the type of the record.
1494Naturally, most users may find editing the zones using the
1495@command{gnunet-setup} GUI to be easier.
1496
1497@node Obtaining your Zone Key
1498@subsection Obtaining your Zone Key
1499
1500Each zone in GNS has a public-private key. Usually, gnunet-namestore and
1501gnunet-setup will access your private key as necessary, so you do not
1502have to worry about those. What is important is your public key
1503(or rather, the hash of your public key), as you will likely want to
1504give it to others so that they can securely link to you.
1505
1506You can usually get the hash of your public key using
1507
1508@example
1509$ gnunet-identity -d $options | grep master-zone | awk '@{print $3@}'
1510@end example
1511
1512@noindent
1513For example, the output might be something like:
1514
1515@example
1516DC3SEECJORPHQNVRH965A6N74B1M37S721IG4RBQ15PJLLPJKUE0
1517@end example
1518
1519@noindent
1520Alternatively, you can obtain a QR code with your zone key AND
1521your pseudonym from gnunet-gtk. The QR code is displayed in the
1522GNS tab and can be stored to disk using the Save as button next
1523to the image.
1524
1525@node Adding Links to Other Zones
1526@subsection Adding Links to Other Zones
1527
1528
1529A central operation in GNS is the ability to securely delegate to
1530other zones. Basically, by adding a delegation you make all of the
1531names from the other zone available to yourself. This section
1532describes how to create delegations.
1533
1534Suppose you have a friend who you call 'bob' who also uses GNS.
1535You can then delegate resolution of names to Bob's zone by adding
1536a PKEY record to their local zone:
1537
1538@example
1539$ gnunet-namestore -a -n bob --type PKEY -V XXXX -e never
1540@end example
1541
1542@noindent
1543Note that XXXX in the command above must be replaced with the
1544hash of Bob's public key (the output your friend obtained using
1545the gnunet-identity command from the previous section and told you,
1546for example by giving you a business card containing this
1547information as a QR code).
1548
1549Assuming Bob has an A record for their website under the name of
1550www in his zone, you can then access Bob's website under
1551www.bob.gnu --- as well as any (public) GNS record that Bob has
1552in their zone by replacing www with the respective name of the
1553record in Bob's zone.
1554
1555@c themselves? themself?
1556Furthermore, if Bob has themselves a (public) delegation to Carol's
1557zone under "carol", you can access Carol's records under
1558NAME.carol.bob.gnu (where NAME is the name of Carol's record you
1559want to access).
1560
1561@node The Three Local Zones of GNS
1562@subsection The Three Local Zones of GNS
1563
1564Each user GNS has control over three zones. Each of the zones
1565has a different purpose. These zones are the
1566
1567@itemize @bullet
1568
1569@item master zone,
1570@item private zone, and the
1571@item shorten zone.
1572@end itemize
1573
1574@node The Master Zone
1575@subsection The Master Zone
1576
1577
1578The master zone is your personal TLD. Names within the @code{.gnu}
1579namespace are resolved relative to this zone. You can arbitrarily
1580add records to this zone and selectively publish those records.
1581
1582@node The Private Zone
1583@subsection The Private Zone
1584
1585
1586The private zone is a subzone (or subdomain in DNS terms) of your
1587master zone. It should be used for records that you want to keep
1588private. For example @code{bank.private.gnu}. The key idea is that
1589you want to keep your private records separate, if just to know
1590that those names are not available to other users.
1591
1592@node The Shorten Zone
1593@subsection The Shorten Zone
1594
1595
1596The shorten zone can either be a subzone of the master zone or the
1597private zone. It is different from the other zones in that GNS
1598will automatically populate this zone with other users' zones based
1599on their PSEU records whenever you resolve a name.
1600
1601For example if you go to
1602@code{@uref{http://www.bob.alice.dave.gnu/, www.bob.alice.dave.gnu}},
1603GNS will try to import @code{bob} into your shorten zone. Having
1604obtained Bob's PKEY from @code{alice.dave.gnu}, GNS will lookup the
1605PSEU record for @code{+} in Bob's zone. If it exists and the specified
1606pseudonym is not taken, Bob's PKEY will be automatically added under
1607that pseudonym (i.e. "bob") into your shorten zone. From then on,
1608Bob's webpage will also be available for you as
1609@code{@uref{http://www.bob.short.gnu/, www.bob.short.gnu}}.
1610This feature is called @b{automatic name shortening} and is supposed to
1611keep GNS names as short and memorable as possible.
1612
1613@node The ZKEY Top Level Domain in GNS
1614@subsection The ZKEY Top Level Domain in GNS
1615
1616
1617GNS also provides a secure and globally unique namespace under the .zkey
1618top-level domain. A name in the .zkey TLD corresponds to the (printable)
1619public key of a zone. Names in the .zkey TLD are then resolved by querying
1620the respective zone. The .zkey TLD is expected to be used under rare
1621circumstances where globally unique names are required and for
1622integration with legacy systems.
1623
1624@node Resource Records in GNS
1625@subsection Resource Records in GNS
1626
1627
1628GNS supports the majority of the DNS records as defined in
1629@uref{http://www.ietf.org/rfc/rfc1035.txt, RFC 1035}. Additionally,
1630GNS defines some new record types the are unique to the GNS system.
1631For example, GNS-specific resource records are used to give petnames
1632for zone delegation, revoke zone keys and provide some compatibility
1633features.
1634
1635For some DNS records, GNS does extended processing to increase their
1636usefulness in GNS. In particular, GNS introduces special names
1637referred to as "zone relative names". Zone relative names are allowed
1638in some resource record types (for example, in NS and CNAME records)
1639and can also be used in links on webpages. Zone relative names end
1640in ".+" which indicates that the name needs to be resolved relative
1641to the current authoritative zone. The extended processing of those
1642names will expand the ".+" with the correct delegation chain to the
1643authoritative zone (replacing ".+" with the name of the location
1644where the name was encountered) and hence generate a
1645valid @code{.gnu} name.
1646
1647GNS currently supports the following record types:
1648
1649@menu
1650* NICK::
1651* PKEY::
1652* BOX::
1653* LEHO::
1654* VPN::
1655* A AAAA and TXT::
1656* CNAME::
1657* GNS2DNS::
1658* SOA SRV PTR and MX::
1659@end menu
1660
1661@node NICK
1662@subsubsection NICK
1663
1664A NICK record is used to give a zone a name. With a NICK record, you can
1665essentially specify how you would like to be called. GNS expects this
1666record under the name "+" in the zone's database (NAMESTORE); however,
1667it will then automatically be copied into each record set, so that
1668clients never need to do a separate lookup to discover the NICK record.
1669
1670@b{Example}@
1671
1672@example
1673Name: +; RRType: NICK; Value: bob
1674@end example
1675
1676@noindent
1677This record in Bob's zone will tell other users that this zone wants
1678to be referred to as 'bob'. Note that nobody is obliged to call Bob's
1679zone 'bob' in their own zones. It can be seen as a
1680recommendation ("Please call me 'bob'").
1681
1682@node PKEY
1683@subsubsection PKEY
1684
1685PKEY records are used to add delegation to other users' zones and
1686give those zones a petname.
1687
1688@b{Example}@
1689
1690Let Bob's zone be identified by the hash "ABC012". Bob is your friend
1691so you want to give them the petname "friend". Then you add the
1692following record to your zone:
1693
1694@example
1695Name: friend; RRType: PKEY; Value: ABC012;
1696@end example
1697
1698@noindent
1699This will allow you to resolve records in bob's zone
1700under "*.friend.gnu".
1701
1702@node BOX
1703@subsubsection BOX
1704
1705BOX records are there to integrate information from TLSA or
1706SRV records under the main label. In DNS, TLSA and SRV records
1707use special names of the form @code{_port._proto.(label.)*tld} to
1708indicate the port number and protocol (i.e. tcp or udp) for which
1709the TLSA or SRV record is valid. This causes various problems, and
1710is elegantly solved in GNS by integrating the protocol and port
1711numbers together with the respective value into a "BOX" record.
1712Note that in the GUI, you do not get to edit BOX records directly
1713right now --- the GUI will provide the illusion of directly
1714editing the TLSA and SRV records, even though they internally
1715are BOXed up.
1716
1717@node LEHO
1718@subsubsection LEHO
1719
1720The LEgacy HOstname of a server. Some webservers expect a specific
1721hostname to provide a service (virtiual hosting). Also SSL
1722certificates usually contain DNS names. To provide the expected
1723legacy DNS name for a server, the LEHO record can be used.
1724To mitigate the just mentioned issues the GNS proxy has to be used.
1725The GNS proxy will use the LEHO information to apply the necessary
1726transformations.
1727
1728@node VPN
1729@subsubsection VPN
1730
1731GNS allows easy access to services provided by the GNUnet Virtual Public
1732Network. When the GNS resolver encounters a VPN record it will contact
1733the VPN service to try and allocate an IPv4/v6 address (if the queries
1734record type is an IP address) that can be used to contact the service.
1735
1736@b{Example}@
1737
1738I want to provide access to the VPN service "web.gnu." on port 80 on peer
1739ABC012:@
1740Name: www; RRType: VPN; Value: 80 ABC012 web.gnu.
1741
1742The peer ABC012 is configured to provide an exit point for the service
1743"web.gnu." on port 80 to it's server running locally on port 8080 by
1744having the following lines in the @file{gnunet.conf} configuration file:
1745
1746@example
1747[web.gnunet.]
1748TCP_REDIRECTS = 80:localhost4:8080
1749@end example
1750
1751@node A AAAA and TXT
1752@subsubsection A AAAA and TXT
1753
1754Those records work in exactly the same fashion as in traditional DNS.
1755
1756@node CNAME
1757@subsubsection CNAME
1758
1759As specified in RFC 1035 whenever a CNAME is encountered the query
1760needs to be restarted with the specified name. In GNS a CNAME
1761can either be:
1762
1763@itemize @bullet
1764@item A zone relative name,
1765@item A zkey name or
1766@item A DNS name (in which case resolution will continue outside
1767of GNS with the systems DNS resolver)
1768@end itemize
1769
1770@node GNS2DNS
1771@subsubsection GNS2DNS
1772
1773GNS can delegate authority to a legacy DNS zone. For this, the
1774name of the DNS nameserver and the name of the DNS zone are
1775specified in a GNS2DNS record.
1776
1777@b{Example}
1778
1779@example
1780Name: pet; RRType: GNS2DNS; Value: gnunet.org@@a.ns.joker.com
1781@end example
1782
1783@noindent
1784Any query to @code{pet.gnu} will then be delegated to the DNS server at
1785@code{a.ns.joker.com}. For example,
1786@code{@uref{http://www.pet.gnu/, www.pet.gnu}} will result in a DNS query
1787for @code{@uref{http://www.gnunet.org/, www.gnunet.org}} to the server
1788at @code{a.ns.joker.com}. Delegation to DNS via NS records in GNS can
1789be useful if you do not want to start resolution in the DNS root zone
1790(due to issues such as censorship or availability).
1791
1792Note that you would typically want to use a relative name for the
1793nameserver, i.e.
1794
1795@example
1796Name: pet; RRType: GNS2DNS; Value: gnunet.org@@ns-joker.+@
1797Name: ns-joker; RRType: A; Value: 184.172.157.218
1798@end example
1799
1800@noindent
1801This way, you can avoid involving the DNS hierarchy in the resolution of
1802@code{a.ns.joker.com}. In the example above, the problem may not be
1803obvious as the nameserver for "gnunet.org" is in the ".com" zone.
1804However, imagine the nameserver was "ns.gnunet.org". In this case,
1805delegating to "ns.gnunet.org" would mean that despite using GNS,
1806censorship in the DNS ".org" zone would still be effective.
1807
1808@node SOA SRV PTR and MX
1809@subsubsection SOA SRV PTR and MX
1810
1811The domain names in those records can, again, be either
1812
1813@itemize @bullet
1814@item A zone relative name,
1815@item A zkey name or
1816@item A DNS name
1817@end itemize
1818
1819The resolver will expand the zone relative name if possible.
1820Note that when using MX records within GNS, the target mail
1821server might still refuse to accept e-mails to the resulting
1822domain as the name might not match. GNS-enabled mail clients
1823should use the ZKEY zone as the destination hostname and
1824GNS-enabled mail servers should be configured to accept
1825e-mails to the ZKEY-zones of all local users.
1826
1827@node Using the Virtual Public Network
1828@section Using the Virtual Public Network
1829
1830@menu
1831* Setting up an Exit node::
1832* Fedora and the Firewall::
1833* Setting up VPN node for protocol translation and tunneling::
1834@end menu
1835
1836Using the GNUnet Virtual Public Network (VPN) application you can
1837tunnel IP traffic over GNUnet. Moreover, the VPN comes
1838with built-in protocol translation and DNS-ALG support, enabling
1839IPv4-to-IPv6 protocol translation (in both directions).
1840This chapter documents how to use the GNUnet VPN.
1841
1842The first thing to note about the GNUnet VPN is that it is a public
1843network. All participating peers can participate and there is no
1844secret key to control access. So unlike common virtual private
1845networks, the GNUnet VPN is not useful as a means to provide a
1846"private" network abstraction over the Internet. The GNUnet VPN
1847is a virtual network in the sense that it is an overlay over the
1848Internet, using its own routing mechanisms and can also use an
1849internal addressing scheme. The GNUnet VPN is an Internet
1850underlay --- TCP/IP applications run on top of it.
1851
1852The VPN is currently only supported on GNU/Linux systems.
1853Support for operating systems that support TUN (such as FreeBSD)
1854should be easy to add (or might not even require any coding at
1855all --- we just did not test this so far). Support for other
1856operating systems would require re-writing the code to create virtual
1857network interfaces and to intercept DNS requests.
1858
1859The VPN does not provide good anonymity. While requests are routed
1860over the GNUnet network, other peers can directly see the source
1861and destination of each (encapsulated) IP packet. Finally, if you
1862use the VPN to access Internet services, the peer sending the
1863request to the Internet will be able to observe and even alter
1864the IP traffic. We will discuss additional security implications
1865of using the VPN later in this chapter.
1866
1867@node Setting up an Exit node
1868@subsection Setting up an Exit node
1869
1870Any useful operation with the VPN requires the existence of an exit
1871node in the GNUnet Peer-to-Peer network. Exit functionality can only
1872be enabled on peers that have regular Internet access. If you want
1873to play around with the VPN or support the network, we encourage
1874you to setup exit nodes. This chapter documents how to setup an
1875exit node.
1876
1877There are four types of exit functions an exit node can provide,
1878and using the GNUnet VPN to access the Internet will only work
1879nicely if the first three types are provided somewhere in
1880the network. The four exit functions are:
1881
1882@itemize @bullet
1883@item DNS: allow other peers to use your DNS resolver
1884@item IPv4: allow other peers to access your IPv4 Internet connection
1885@item IPv6: allow other peers to access your IPv6 Internet connection
1886@item Local service: allow other peers to access a specific TCP or
1887UDP service your peer is providing
1888@end itemize
1889
1890By enabling "exit" in gnunet-setup and checking the respective boxes
1891in the "exit" tab, you can easily choose which of the above exit
1892functions you want to support.
1893
1894Note, however, that by supporting the first three functions you will
1895allow arbitrary other GNUnet users to access the Internet via your
1896system. This is somewhat similar to running a Tor exit node. The
1897Torproject has a nice article about what to consider if you want
1898to do this here. We believe that generally running a DNS exit node
1899is completely harmless.
1900
1901The exit node configuration does currently not allow you to restrict the
1902Internet traffic that leaves your system. In particular, you cannot
1903exclude SMTP traffic (or block port 25) or limit to HTTP traffic using
1904the GNUnet configuration. However, you can use your host firewall to
1905restrict outbound connections from the virtual tunnel interface. This
1906is highly recommended. In the future, we plan to offer a wider range
1907of configuration options for exit nodes.
1908
1909Note that by running an exit node GNUnet will configure your kernel
1910to perform IP-forwarding (for IPv6) and NAT (for IPv4) so that the
1911traffic from the virtual interface can be routed to the Internet.
1912In order to provide an IPv6-exit, you need to have a subnet routed
1913to your host's external network interface and assign a subrange of
1914that subnet to the GNUnet exit's TUN interface.
1915
1916When running a local service, you should make sure that the local
1917service is (also) bound to the IP address of your EXIT interface
1918(i.e. 169.254.86.1). It will NOT work if your local service is
1919just bound to loopback. You may also want to create a "VPN" record
1920in your zone of the GNU Name System to make it easy for others to
1921access your service via a name instead of just the full service
1922descriptor. Note that the identifier you assign the service can
1923serve as a passphrase or shared secret, clients connecting to the
1924service must somehow learn the service's name. VPN records in the
1925GNU Name System can make this easier.
1926
1927@node Fedora and the Firewall
1928@subsection Fedora and the Firewall
1929
1930
1931When using an exit node on Fedora 15, the standard firewall can
1932create trouble even when not really exiting the local system!
1933For IPv4, the standard rules seem fine. However, for IPv6 the
1934standard rules prohibit traffic from the network range of the
1935virtual interface created by the exit daemon to the local IPv6
1936address of the same interface (which is essentially loopback
1937traffic, so you might suspect that a standard firewall would
1938leave this traffic alone). However, as somehow for IPv6 the
1939traffic is not recognized as originating from the local
1940system (and as the connection is not already "established"),
1941the firewall drops the traffic. You should still get ICMPv6
1942packets back, but that's obviously not very useful.
1943
1944Possible ways to fix this include disabling the firewall (do you
1945have a good reason for having it on?) or disabling the firewall
1946at least for the GNUnet exit interface (or the respective
1947IPv4/IPv6 address range). The best way to diagnose these kinds
1948of problems in general involves setting the firewall to REJECT
1949instead of DROP and to watch the traffic using wireshark
1950(or tcpdump) to see if ICMP messages are generated when running
1951some tests that should work.
1952
1953@node Setting up VPN node for protocol translation and tunneling
1954@subsection Setting up VPN node for protocol translation and tunneling
1955
1956
1957The GNUnet VPN/PT subsystem enables you to tunnel IP traffic over the
1958VPN to an exit node, from where it can then be forwarded to the
1959Internet. This section documents how to setup VPN/PT on a node.
1960Note that you can enable both the VPN and an exit on the same peer.
1961In this case, IP traffic from your system may enter your peer's VPN
1962and leave your peer's exit. This can be useful as a means to do
1963protocol translation. For example, you might have an application that
1964supports only IPv4 but needs to access an IPv6-only site. In this case,
1965GNUnet would perform 4to6 protocol translation between the VPN (IPv4)
1966and the Exit (IPv6). Similarly, 6to4 protocol translation is also
1967possible. However, the primary use for GNUnet would be to access
1968an Internet service running with an IP version that is not supported
1969by your ISP. In this case, your IP traffic would be routed via GNUnet
1970to a peer that has access to the Internet with the desired IP version.
1971
1972Setting up an entry node into the GNUnet VPN primarily requires you
1973to enable the "VPN/PT" option in "gnunet-setup". This will launch the
1974"gnunet-service-vpn", "gnunet-service-dns" and "gnunet-daemon-pt"
1975processes. The "gnunet-service-vpn" will create a virtual interface
1976which will be used as the target for your IP traffic that enters the
1977VPN. Additionally, a second virtual interface will be created by
1978the "gnunet-service-dns" for your DNS traffic. You will then need to
1979specify which traffic you want to tunnel over GNUnet. If your ISP only
1980provides you with IPv4 or IPv6-access, you may choose to tunnel the
1981other IP protocol over the GNUnet VPN. If you do not have an ISP
1982(and are connected to other GNUnet peers via WLAN), you can also
1983choose to tunnel all IP traffic over GNUnet. This might also provide
1984you with some anonymity. After you enable the respective options
1985and restart your peer, your Internet traffic should be tunneled
1986over the GNUnet VPN.
1987
1988The GNUnet VPN uses DNS-ALG to hijack your IP traffic. Whenever an
1989application resolves a hostname (i.e. 'gnunet.org'), the
1990"gnunet-daemon-pt" will instruct the "gnunet-service-dns" to intercept
1991the request (possibly route it over GNUnet as well) and replace the
1992normal answer with an IP in the range of the VPN's interface.
1993"gnunet-daemon-pt" will then tell "gnunet-service-vpn" to forward all
1994traffic it receives on the TUN interface via the VPN to the original
1995destination.
1996
1997For applications that do not use DNS, you can also manually create
1998such a mapping using the gnunet-vpn command-line tool. Here, you
1999specfiy the desired address family of the result (i.e. "-4"), and the
2000intended target IP on the Internet ("-i 131.159.74.67") and
2001"gnunet-vpn" will tell you which IP address in the range of your
2002VPN tunnel was mapped.
2003
2004@command{gnunet-vpn} can also be used to access "internal" services
2005offered by GNUnet nodes. So if you happen to know a peer and a
2006service offered by that peer, you can create an IP tunnel to
2007that peer by specifying the peer's identity, service name and
2008protocol (--tcp or --udp) and you will again receive an IP address
2009that will terminate at the respective peer's service.
diff --git a/doc/documentation/chapters/vocabulary.texi b/doc/documentation/chapters/vocabulary.texi
new file mode 100644
index 000000000..9621cb174
--- /dev/null
+++ b/doc/documentation/chapters/vocabulary.texi
@@ -0,0 +1,57 @@
1@node Vocabulary
2@chapter Vocabulary
3
4@menu
5* Words and characters::
6* Technical Assumptions::
7@end menu
8
9@node Words and characters
10@section Words and characters
11
12Throughout this document we use certain words and characters.
13
14@enumerate
15@item
16In chapter Installation Handbook,
17``@command{#}'' in example code blocks describes commands executed as root
18
19@example
20# echo "I am root"
21I am root
22@end example
23
24@item
25However, in the chapter GNUnet C Tutorial
26``@command{#}'' in example code blocks describes commands, ie comments.
27
28@example
29# Do the foobar thing:
30$ make foobar
31@end example
32
33@item
34Dollarsign ``@command{$}'' in example code blocks describes commands you
35execute as unprivileged users.
36
37@example
38$ cd foo; ./configure --example-switch
39@end example
40
41@item
42Backslash ``@command{\}'' describes linebreaks.
43
44@example
45./configure --foo --bar --baz \
46 --short-loop
47@end example
48
49...expands to @code{./configure --foo --bar --baz --short-loop}
50
51@end enumerate
52
53@node Technical Assumptions
54@section Technical Assumptions
55
56@c Is it really assuming Bash (ie Bash extensions of POSIX being used)?
57The shell on GNU systems is assumed to be Bash.
diff --git a/doc/documentation/docstyle.css b/doc/documentation/docstyle.css
new file mode 100644
index 000000000..8719248d0
--- /dev/null
+++ b/doc/documentation/docstyle.css
@@ -0,0 +1,76 @@
1html, body {
2 font-size: 1em;
3 text-align: left;
4 text-decoration: none;
5}
6html { background-color: #e7e7e7; }
7
8body {
9 max-width: 74.92em;
10 margin: 0 auto;
11 padding: .5em 1em 1em 1em;
12 background-color: white;
13 border: .1em solid #c0c0c0;
14}
15
16h1, h2, h3, h4 { color: #333; }
17h5, h6, dt { color: #222; }
18
19
20a h3 {
21 color: #005090;
22}
23
24a[href] { color: #005090; }
25a[href]:visited { color: #100070; }
26a[href]:active, a[href]:hover {
27 color: #100070;
28 text-decoration: none;
29}
30
31.linkrow {
32 margin: 3em 0;
33}
34
35.linkrow {
36 text-align: center;
37}
38
39div.example { padding: .8em 1.2em .4em; }
40pre.example { padding: .8em 1.2em; }
41div.example, pre.example {
42 margin: 1em 0 1em 3% ;
43 -webkit-border-radius: .3em;
44 -moz-border-radius: .3em;
45 border-radius: .3em;
46 border: 1px solid #d4cbb6;
47 background-color: #f2efe4;
48}
49div.example > pre.example {
50 padding: 0 0 .4em;
51 margin: 0;
52 border: none;
53}
54
55
56/* This makes the very long tables of contents in Gnulib and other
57 manuals easier to read. */
58.contents ul, .shortcontents ul { font-weight: bold; }
59.contents ul ul, .shortcontents ul ul { font-weight: normal; }
60.contents ul { list-style: none; }
61
62/* For colored navigation bars (Emacs manual): make the bar extend
63 across the whole width of the page and give it a decent height. */
64.header, .node { margin: 0 -1em; padding: 0 1em; }
65.header p, .node p { line-height: 2em; }
66
67/* For navigation links */
68.node a, .header a { display: inline-block; line-height: 2em; }
69.node a:hover, .header a:hover { background: #f2efe4; }
70
71table.cartouche {
72 border-collapse: collapse;
73 border-color: darkred;
74 border-style: solid;
75 border-width: 3px;
76}
diff --git a/doc/fdl-1.3.texi b/doc/documentation/fdl-1.3.texi
index cb71f05a1..cb71f05a1 100644
--- a/doc/fdl-1.3.texi
+++ b/doc/documentation/fdl-1.3.texi
diff --git a/doc/documentation/gendocs.sh b/doc/documentation/gendocs.sh
new file mode 100755
index 000000000..3b71b36a2
--- /dev/null
+++ b/doc/documentation/gendocs.sh
@@ -0,0 +1,504 @@
1#!/bin/sh -e
2# gendocs.sh -- generate a GNU manual in many formats. This script is
3# mentioned in maintain.texi. See the help message below for usage details.
4
5scriptversion=2016-12-31.18
6
7# Copyright 2003-2017 Free Software Foundation, Inc.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
21#
22# Original author: Mohit Agarwal.
23# Send bug reports and any other correspondence to bug-gnulib@gnu.org.
24#
25# The latest version of this script, and the companion template, is
26# available from the Gnulib repository:
27#
28# http://git.savannah.gnu.org/cgit/gnulib.git/tree/build-aux/gendocs.sh
29# http://git.savannah.gnu.org/cgit/gnulib.git/tree/doc/gendocs_template
30
31# TODO:
32# - image importing was only implemented for HTML generated by
33# makeinfo. But it should be simple enough to adjust.
34# - images are not imported in the source tarball. All the needed
35# formats (PDF, PNG, etc.) should be included.
36
37prog=`basename "$0"`
38srcdir=`pwd`
39
40scripturl="http://git.savannah.gnu.org/cgit/gnulib.git/plain/build-aux/gendocs.sh"
41templateurl="http://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/gendocs_template"
42
43: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
44: ${MAKEINFO="makeinfo"}
45: ${TEXI2DVI="texi2dvi"}
46: ${DOCBOOK2HTML="docbook2html"}
47: ${DOCBOOK2PDF="docbook2pdf"}
48: ${DOCBOOK2TXT="docbook2txt"}
49: ${GENDOCS_TEMPLATE_DIR="."}
50: ${PERL='perl'}
51: ${TEXI2HTML="texi2html"}
52unset CDPATH
53unset use_texi2html
54
55MANUAL_TITLE=
56PACKAGE=
57EMAIL=webmasters@gnu.org # please override with --email
58commonarg= # passed to all makeinfo/texi2html invcations.
59dirargs= # passed to all tools (-I dir).
60dirs= # -I directories.
61htmlarg="--css-ref=/software/gnulib/manual.css -c TOP_NODE_UP_URL=/manual"
62infoarg=--no-split
63generate_ascii=true
64generate_html=true
65generate_info=true
66generate_tex=true
67outdir=manual
68source_extra=
69split=node
70srcfile=
71texarg="-t @finalout"
72
73version="gendocs.sh $scriptversion
74
75Copyright 2017 Free Software Foundation, Inc.
76There is NO warranty. You may redistribute this software
77under the terms of the GNU General Public License.
78For more information about these matters, see the files named COPYING."
79
80usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
81
82Generate output in various formats from PACKAGE.texinfo (or .texi or
83.txi) source. See the GNU Maintainers document for a more extensive
84discussion:
85 http://www.gnu.org/prep/maintain_toc.html
86
87Options:
88 --email ADR use ADR as contact in generated web pages; always give this.
89
90 -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
91 -o OUTDIR write files into OUTDIR, instead of manual/.
92 -I DIR append DIR to the Texinfo search path.
93 --common ARG pass ARG in all invocations.
94 --html ARG pass ARG to makeinfo or texi2html for HTML targets,
95 instead of '$htmlarg'.
96 --info ARG pass ARG to makeinfo for Info, instead of --no-split.
97 --no-ascii skip generating the plain text output.
98 --no-html skip generating the html output.
99 --no-info skip generating the info output.
100 --no-tex skip generating the dvi and pdf output.
101 --source ARG include ARG in tar archive of sources.
102 --split HOW make split HTML by node, section, chapter; default node.
103 --tex ARG pass ARG to texi2dvi for DVI and PDF, instead of -t @finalout.
104
105 --texi2html use texi2html to make HTML target, with all split versions.
106 --docbook convert through DocBook too (xml, txt, html, pdf).
107
108 --help display this help and exit successfully.
109 --version display version information and exit successfully.
110
111Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
112
113Typical sequence:
114 cd PACKAGESOURCE/doc
115 wget \"$scripturl\"
116 wget \"$templateurl\"
117 $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
118
119Output will be in a new subdirectory \"manual\" (by default;
120use -o OUTDIR to override). Move all the new files into your web CVS
121tree, as explained in the Web Pages node of maintain.texi.
122
123Please use the --email ADDRESS option so your own bug-reporting
124address will be used in the generated HTML pages.
125
126MANUAL-TITLE is included as part of the HTML <title> of the overall
127manual/index.html file. It should include the name of the package being
128documented. manual/index.html is created by substitution from the file
129$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
130generic template for your own purposes.)
131
132If you have several manuals, you'll need to run this script several
133times with different MANUAL values, specifying a different output
134directory with -o each time. Then write (by hand) an overall index.html
135with links to them all.
136
137If a manual's Texinfo sources are spread across several directories,
138first copy or symlink all Texinfo sources into a single directory.
139(Part of the script's work is to make a tar.gz of the sources.)
140
141As implied above, by default monolithic Info files are generated.
142If you want split Info, or other Info options, use --info to override.
143
144You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML,
145and PERL to control the programs that get executed, and
146GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is
147looked for. With --docbook, the environment variables DOCBOOK2HTML,
148DOCBOOK2PDF, and DOCBOOK2TXT are also consulted.
149
150By default, makeinfo and texi2dvi are run in the default (English)
151locale, since that's the language of most Texinfo manuals. If you
152happen to have a non-English manual and non-English web site, see the
153SETLANG setting in the source.
154
155Email bug reports or enhancement requests to bug-gnulib@gnu.org.
156"
157
158while test $# -gt 0; do
159 case $1 in
160 -s) shift; srcfile=$1;;
161 -o) shift; outdir=$1;;
162 -I) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";;
163 --common) shift; commonarg=$1;;
164 --docbook) docbook=yes;;
165 --email) shift; EMAIL=$1;;
166 --html) shift; htmlarg=$1;;
167 --info) shift; infoarg=$1;;
168 --no-ascii) generate_ascii=false;;
169 --no-html) generate_ascii=false;;
170 --no-info) generate_info=false;;
171 --no-tex) generate_tex=false;;
172 --source) shift; source_extra=$1;;
173 --split) shift; split=$1;;
174 --tex) shift; texarg=$1;;
175 --texi2html) use_texi2html=1;;
176
177 --help) echo "$usage"; exit 0;;
178 --version) echo "$version"; exit 0;;
179 -*)
180 echo "$0: Unknown option \`$1'." >&2
181 echo "$0: Try \`--help' for more information." >&2
182 exit 1;;
183 *)
184 if test -z "$PACKAGE"; then
185 PACKAGE=$1
186 elif test -z "$MANUAL_TITLE"; then
187 MANUAL_TITLE=$1
188 else
189 echo "$0: extra non-option argument \`$1'." >&2
190 exit 1
191 fi;;
192 esac
193 shift
194done
195
196# makeinfo uses the dirargs, but texi2dvi doesn't.
197commonarg=" $dirargs $commonarg"
198
199# For most of the following, the base name is just $PACKAGE
200base=$PACKAGE
201
202if test -n "$srcfile"; then
203 # but here, we use the basename of $srcfile
204 base=`basename "$srcfile"`
205 case $base in
206 *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;;
207 esac
208 PACKAGE=$base
209elif test -s "$srcdir/$PACKAGE.texinfo"; then
210 srcfile=$srcdir/$PACKAGE.texinfo
211elif test -s "$srcdir/$PACKAGE.texi"; then
212 srcfile=$srcdir/$PACKAGE.texi
213elif test -s "$srcdir/$PACKAGE.txi"; then
214 srcfile=$srcdir/$PACKAGE.txi
215else
216 echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
217 exit 1
218fi
219
220if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
221 echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
222 echo "$0: it is available from $templateurl." >&2
223 exit 1
224fi
225
226# Function to return size of $1 in something resembling kilobytes.
227calcsize()
228{
229 size=`ls -ksl $1 | awk '{print $1}'`
230 echo $size
231}
232
233# copy_images OUTDIR HTML-FILE...
234# -------------------------------
235# Copy all the images needed by the HTML-FILEs into OUTDIR.
236# Look for them in . and the -I directories; this is simpler than what
237# makeinfo supports with -I, but hopefully it will suffice.
238copy_images()
239{
240 local odir
241 odir=$1
242 shift
243 $PERL -n -e "
244BEGIN {
245 \$me = '$prog';
246 \$odir = '$odir';
247 @dirs = qw(. $dirs);
248}
249" -e '
250/<img src="(.*?)"/g && ++$need{$1};
251
252END {
253 #print "$me: @{[keys %need]}\n"; # for debugging, show images found.
254 FILE: for my $f (keys %need) {
255 for my $d (@dirs) {
256 if (-f "$d/$f") {
257 use File::Basename;
258 my $dest = dirname ("$odir/$f");
259 #
260 use File::Path;
261 -d $dest || mkpath ($dest)
262 || die "$me: cannot mkdir $dest: $!\n";
263 #
264 use File::Copy;
265 copy ("$d/$f", $dest)
266 || die "$me: cannot copy $d/$f to $dest: $!\n";
267 next FILE;
268 }
269 }
270 die "$me: $ARGV: cannot find image $f\n";
271 }
272}
273' -- "$@" || exit 1
274}
275
276case $outdir in
277 /*) abs_outdir=$outdir;;
278 *) abs_outdir=$srcdir/$outdir;;
279esac
280
281echo "Making output for $srcfile"
282echo " in `pwd`"
283mkdir -p "$outdir/"
284
285#
286if $generate_info; then
287 cmd="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\""
288 echo "Generating info... ($cmd)"
289 rm -f $PACKAGE.info* # get rid of any strays
290 eval "$cmd"
291 tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info*
292 ls -l "$outdir/$PACKAGE.info.tar.gz"
293 info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"`
294 # do not mv the info files, there's no point in having them available
295 # separately on the web.
296fi # end info
297
298#
299if $generate_tex; then
300 cmd="$SETLANG $TEXI2DVI $dirargs $texarg \"$srcfile\""
301 printf "\nGenerating dvi... ($cmd)\n"
302 eval "$cmd"
303 # compress/finish dvi:
304 gzip -f -9 $PACKAGE.dvi
305 dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
306 mv $PACKAGE.dvi.gz "$outdir/"
307 ls -l "$outdir/$PACKAGE.dvi.gz"
308
309 cmd="$SETLANG $TEXI2DVI --pdf $dirargs $texarg \"$srcfile\""
310 printf "\nGenerating pdf... ($cmd)\n"
311 eval "$cmd"
312 pdf_size=`calcsize $PACKAGE.pdf`
313 mv $PACKAGE.pdf "$outdir/"
314 ls -l "$outdir/$PACKAGE.pdf"
315fi # end tex (dvi + pdf)
316
317#
318if $generate_ascii; then
319 opt="-o $PACKAGE.txt --no-split --no-headers $commonarg"
320 cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
321 printf "\nGenerating ascii... ($cmd)\n"
322 eval "$cmd"
323 ascii_size=`calcsize $PACKAGE.txt`
324 gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz"
325 ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"`
326 mv $PACKAGE.txt "$outdir/"
327 ls -l "$outdir/$PACKAGE.txt" "$outdir/$PACKAGE.txt.gz"
328fi
329
330#
331
332if $generate_html; then
333# Split HTML at level $1. Used for texi2html.
334html_split()
335{
336 opt="--split=$1 --node-files $commonarg $htmlarg"
337 cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\""
338 printf "\nGenerating html by $1... ($cmd)\n"
339 eval "$cmd"
340 split_html_dir=$PACKAGE.html
341 (
342 cd ${split_html_dir} || exit 1
343 ln -sf ${PACKAGE}.html index.html
344 tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html
345 )
346 eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
347 rm -f "$outdir"/html_$1/*.html
348 mkdir -p "$outdir/html_$1/"
349 mv ${split_html_dir}/*.html "$outdir/html_$1/"
350 rmdir ${split_html_dir}
351}
352
353if test -z "$use_texi2html"; then
354 opt="--no-split --html -o $PACKAGE.html $commonarg $htmlarg"
355 cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
356 printf "\nGenerating monolithic html... ($cmd)\n"
357 rm -rf $PACKAGE.html # in case a directory is left over
358 eval "$cmd"
359 html_mono_size=`calcsize $PACKAGE.html`
360 gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
361 html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
362 copy_images "$outdir/" $PACKAGE.html
363 mv $PACKAGE.html "$outdir/"
364 ls -l "$outdir/$PACKAGE.html" "$outdir/$PACKAGE.html.gz"
365
366 # Before Texinfo 5.0, makeinfo did not accept a --split=HOW option,
367 # it just always split by node. So if we're splitting by node anyway,
368 # leave it out.
369 if test "x$split" = xnode; then
370 split_arg=
371 else
372 split_arg=--split=$split
373 fi
374 #
375 opt="--html -o $PACKAGE.html $split_arg $commonarg $htmlarg"
376 cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
377 printf "\nGenerating html by $split... ($cmd)\n"
378 eval "$cmd"
379 split_html_dir=$PACKAGE.html
380 copy_images $split_html_dir/ $split_html_dir/*.html
381 (
382 cd $split_html_dir || exit 1
383 tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- *
384 )
385 eval \
386 html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"`
387 rm -rf "$outdir/html_$split/"
388 mv $split_html_dir "$outdir/html_$split/"
389 du -s "$outdir/html_$split/"
390 ls -l "$outdir/$PACKAGE.html_$split.tar.gz"
391
392else # use texi2html:
393 opt="--output $PACKAGE.html $commonarg $htmlarg"
394 cmd="$SETLANG $TEXI2HTML $opt \"$srcfile\""
395 printf "\nGenerating monolithic html with texi2html... ($cmd)\n"
396 rm -rf $PACKAGE.html # in case a directory is left over
397 eval "$cmd"
398 html_mono_size=`calcsize $PACKAGE.html`
399 gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
400 html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
401 mv $PACKAGE.html "$outdir/"
402
403 html_split node
404 html_split chapter
405 html_split section
406fi
407fi # end html
408
409#
410printf "\nMaking .tar.gz for sources...\n"
411d=`dirname $srcfile`
412(
413 cd "$d"
414 srcfiles=`ls -d *.texinfo *.texi *.txi *.eps $source_extra 2>/dev/null` || true
415 tar czfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles
416 ls -l "$abs_outdir/$PACKAGE.texi.tar.gz"
417)
418texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"`
419
420#
421# Do everything again through docbook.
422if test -n "$docbook"; then
423 opt="-o - --docbook $commonarg"
424 cmd="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml"
425 printf "\nGenerating docbook XML... ($cmd)\n"
426 eval "$cmd"
427 docbook_xml_size=`calcsize $PACKAGE-db.xml`
428 gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz"
429 docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"`
430 mv $PACKAGE-db.xml "$outdir/"
431
432 split_html_db_dir=html_node_db
433 opt="$commonarg -o $split_html_db_dir"
434 cmd="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\""
435 printf "\nGenerating docbook HTML... ($cmd)\n"
436 eval "$cmd"
437 (
438 cd ${split_html_db_dir} || exit 1
439 tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html
440 )
441 html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"`
442 rm -f "$outdir"/html_node_db/*.html
443 mkdir -p "$outdir/html_node_db"
444 mv ${split_html_db_dir}/*.html "$outdir/html_node_db/"
445 rmdir ${split_html_db_dir}
446
447 cmd="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\""
448 printf "\nGenerating docbook ASCII... ($cmd)\n"
449 eval "$cmd"
450 docbook_ascii_size=`calcsize $PACKAGE-db.txt`
451 mv $PACKAGE-db.txt "$outdir/"
452
453 cmd="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\""
454 printf "\nGenerating docbook PDF... ($cmd)\n"
455 eval "$cmd"
456 docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
457 mv $PACKAGE-db.pdf "$outdir/"
458fi
459
460#
461printf "\nMaking index.html for $PACKAGE...\n"
462if test -z "$use_texi2html"; then
463 CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\
464 /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d"
465else
466 # should take account of --split here.
467 CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
468fi
469
470curdate=`$SETLANG date '+%B %d, %Y'`
471sed \
472 -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
473 -e "s!%%EMAIL%%!$EMAIL!g" \
474 -e "s!%%PACKAGE%%!$PACKAGE!g" \
475 -e "s!%%DATE%%!$curdate!g" \
476 -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
477 -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
478 -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
479 -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
480 -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
481 -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
482 -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
483 -e "s!%%PDF_SIZE%%!$pdf_size!g" \
484 -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
485 -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
486 -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
487 -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
488 -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
489 -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
490 -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
491 -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
492 -e "s,%%SCRIPTURL%%,$scripturl,g" \
493 -e "s!%%SCRIPTNAME%%!$prog!g" \
494 -e "$CONDS" \
495$GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html"
496
497echo "Done, see $outdir/ subdirectory for new files."
498
499# Local variables:
500# eval: (add-hook 'write-file-hooks 'time-stamp)
501# time-stamp-start: "scriptversion="
502# time-stamp-format: "%:y-%02m-%02d.%02H"
503# time-stamp-end: "$"
504# End:
diff --git a/doc/documentation/gendocs_template b/doc/documentation/gendocs_template
new file mode 100644
index 000000000..178f6cb4c
--- /dev/null
+++ b/doc/documentation/gendocs_template
@@ -0,0 +1,91 @@
1<!--#include virtual="/server/header.html" -->
2<!-- Parent-Version: 1.77 -->
3<title>%%TITLE%% - GNU Project - Free Software Foundation</title>
4<!--#include virtual="/server/banner.html" -->
5<h2>%%TITLE%%</h2>
6
7<address>Free Software Foundation</address>
8<address>last updated %%DATE%%</address>
9
10<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
11
12<ul>
13<li><a href="%%PACKAGE%%.html">HTML
14 (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
15<li><a href="html_node/index.html">HTML</a> - with one web page per
16 node.</li>
17%%IF HTML_SECTION%%
18<li><a href="html_section/index.html">HTML</a> - with one web page per
19 section.</li>
20%%ENDIF HTML_SECTION%%
21%%IF HTML_CHAPTER%%
22<li><a href="html_chapter/index.html">HTML</a> - with one web page per
23 chapter.</li>
24%%ENDIF HTML_CHAPTER%%
25<li><a href="%%PACKAGE%%.html.gz">HTML compressed
26 (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
27 one web page.</li>
28<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
29 (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
30 with one web page per node.</li>
31%%IF HTML_SECTION%%
32<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
33 (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
34 with one web page per section.</li>
35%%ENDIF HTML_SECTION%%
36%%IF HTML_CHAPTER%%
37<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
38 (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
39 with one web page per chapter.</li>
40%%ENDIF HTML_CHAPTER%%
41<li><a href="%%PACKAGE%%.info.tar.gz">Info document
42 (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
43<li><a href="%%PACKAGE%%.txt">ASCII text
44 (%%ASCII_SIZE%%K bytes)</a>.</li>
45<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
46 (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
47<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
48 (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
49<li><a href="%%PACKAGE%%.pdf">PDF file
50 (%%PDF_SIZE%%K bytes)</a>.</li>
51<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
52 (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
53</ul>
54
55<p>You can <a href="http://shop.fsf.org/">buy printed copies of
56some manuals</a> (among other items) from the Free Software Foundation;
57this helps support FSF activities.</p>
58
59<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
60script</a>.)</p>
61
62<!-- If needed, change the copyright block at the bottom. In general,
63 all pages on the GNU web server should have the section about
64 verbatim copying. Please do NOT remove this without talking
65 with the webmasters first.
66 Please make sure the copyright date is consistent with the document
67 and that it is like this: "2001, 2002", not this: "2001-2002". -->
68</div><!-- for id="content", starts in the include above -->
69<!--#include virtual="/server/footer.html" -->
70<div id="footer">
71<div class="unprintable">
72
73<p>Please send general FSF &amp; GNU inquiries to
74<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
75There are also <a href="/contact/">other ways to contact</a>
76the FSF. Broken links and other corrections or suggestions can be sent
77to <a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.</p>
78</div>
79
80<p>Copyright &copy; 2017 Free Software Foundation, Inc.</p>
81
82<p>This page is licensed under a <a rel="license"
83href="http://creativecommons.org/licenses/by-nd/3.0/us/">Creative
84Commons Attribution-NoDerivs 3.0 United States License</a>.</p>
85
86<!--#include virtual="/server/bottom-notes.html" -->
87
88</div>
89</div>
90</body>
91</html>
diff --git a/doc/documentation/gendocs_template_min b/doc/documentation/gendocs_template_min
new file mode 100644
index 000000000..112fa3bfb
--- /dev/null
+++ b/doc/documentation/gendocs_template_min
@@ -0,0 +1,93 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5
6<head>
7<title>%%TITLE%% - GNU Project - Free Software Foundation</title>
8<meta http-equiv="content-type" content='text/html; charset=utf-8' />
9<link rel="stylesheet" type="text/css" href="/gnu.css" />
10</head>
11
12<body>
13
14<h3>%%TITLE%%</h3>
15
16<address>Free Software Foundation</address>
17<address>last updated %%DATE%%</address>
18<p>
19<a href="/graphics/gnu-head.jpg">
20 <img src="/graphics/gnu-head-sm.jpg"
21 alt=" [image of the head of a GNU] " width="129" height="122"/>
22</a>
23</p>
24<hr />
25
26<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
27
28<ul>
29<li><a href="%%PACKAGE%%.html">HTML
30 (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
31<li><a href="html_node/index.html">HTML</a> - with one web page per
32 node.</li>
33%%IF HTML_SECTION%%
34<li><a href="html_section/index.html">HTML</a> - with one web page per
35 section.</li>
36%%ENDIF HTML_SECTION%%
37%%IF HTML_CHAPTER%%
38<li><a href="html_chapter/index.html">HTML</a> - with one web page per
39 chapter.</li>
40%%ENDIF HTML_CHAPTER%%
41<li><a href="%%PACKAGE%%.html.gz">HTML compressed
42 (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
43 one web page.</li>
44<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
45 (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
46 with one web page per node.</li>
47%%IF HTML_SECTION%%
48<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
49 (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
50 with one web page per section.</li>
51%%ENDIF HTML_SECTION%%
52%%IF HTML_CHAPTER%%
53<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
54 (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
55 with one web page per chapter.</li>
56%%ENDIF HTML_CHAPTER%%
57<li><a href="%%PACKAGE%%.info.tar.gz">Info document
58 (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
59<li><a href="%%PACKAGE%%.txt">ASCII text
60 (%%ASCII_SIZE%%K bytes)</a>.</li>
61<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
62 (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
63<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
64 (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
65<li><a href="%%PACKAGE%%.pdf">PDF file
66 (%%PDF_SIZE%%K bytes)</a>.</li>
67<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
68 (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
69</ul>
70
71<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
72script</a>.)</p>
73
74<div id="footer" class="copyright">
75
76<p>Please send general FSF &amp; GNU inquiries to
77<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
78There are also <a href="/contact/">other ways to contact</a>
79the FSF. Broken links and other corrections or suggestions can be sent
80to <a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.</p>
81</div>
82
83<p>Copyright &copy; 2017 Free Software Foundation, Inc.</p>
84
85<p>This page is licensed under a <a rel="license"
86href="http://creativecommons.org/licenses/by-nd/3.0/us/">Creative
87Commons Attribution-NoDerivs 3.0 United States License</a>.</p>
88
89<!--#include virtual="/server/bottom-notes.html" -->
90
91</div>
92</body>
93</html>
diff --git a/doc/gnunet-c-tutorial.texi b/doc/documentation/gnunet-c-tutorial.texi
index 3a4200d7c..aca40d2ef 100644
--- a/doc/gnunet-c-tutorial.texi
+++ b/doc/documentation/gnunet-c-tutorial.texi
@@ -3,8 +3,12 @@
3@setfilename gnunet-c-tutorial.info 3@setfilename gnunet-c-tutorial.info
4@documentencoding UTF-8 4@documentencoding UTF-8
5@settitle GNUnet C Tutorial 5@settitle GNUnet C Tutorial
6@exampleindent 2
6@c %**end of header 7@c %**end of header
7 8
9@c including 'version.texi' makes makeinfo throw errors.
10@include version2.texi
11
8@copying 12@copying
9Copyright @copyright{} 2001-2017 GNUnet e.V. 13Copyright @copyright{} 2001-2017 GNUnet e.V.
10 14
@@ -27,9 +31,15 @@ A copy of the license is also available from the Free Software
27Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}. 31Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
28@end copying 32@end copying
29 33
34@dircategory Tutorial
35@direntry
36* GNUnet-C-Tutorial: (gnunet-c-tutorial). C Tutorial for GNunet
37@end direntry
38
39
30@titlepage 40@titlepage
31@title GNUnet C Tutorial 41@title GNUnet C Tutorial
32@subtitle A Tutorial for GNUnet 0.10.x (C version) 42@subtitle A Tutorial for GNUnet @value{VERSION} (C version)
33@author The GNUnet Developers 43@author The GNUnet Developers
34 44
35@page 45@page
@@ -48,10 +58,14 @@ Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
48@node Top 58@node Top
49@top Introduction 59@top Introduction
50 60
51This tutorials explains how to install GNUnet on a GNU/Linux system and gives an introduction on how 61This tutorials explains how to install GNUnet on a
52GNUnet can be used to develop a Peer-to-Peer application. Detailed installation instructions for 62GNU/Linux system and gives an introduction on how
53various operating systems and a detailed list of all dependencies can be found on our website at 63GNUnet can be used to develop a Peer-to-Peer application.
54@uref{https://gnunet.org/installation}. 64Detailed installation instructions for
65various operating systems and a detailed list of all
66dependencies can be found on our website at
67@uref{https://gnunet.org/installation} and in our
68Reference Documentation (GNUnet Handbook).
55 69
56Please read this tutorial carefully since every single step is 70Please read this tutorial carefully since every single step is
57important and do not hesitate to contact the GNUnet team if you have 71important and do not hesitate to contact the GNUnet team if you have
@@ -103,14 +117,15 @@ Developing Applications
103@node Installing GNUnet 117@node Installing GNUnet
104@chapter Installing GNUnet 118@chapter Installing GNUnet
105 119
106First of all you have to install a current version of GNUnet. You can download a 120First of all you have to install a current version of GNUnet.
107tarball of a stable version from GNU FTP mirrors or obtain the latest development 121You can download a tarball of a stable version from GNU FTP mirrors
108version from our Git repository. 122or obtain the latest development version from our Git repository.
109 123
110Most of the time you should prefer to download the stable version since with the 124Most of the time you should prefer to download the stable version
111latest development version things can be broken, functionality can be changed or tests 125since with the latest development version things can be broken,
112can fail. You should only use the development version if you know that you require a 126functionality can be changed or tests can fail. You should only use
113certain feature or a certain issue has been fixed since the last release. 127the development version if you know that you require a certain
128feature or a certain issue has been fixed since the last release.
114 129
115@menu 130@menu
116* Obtaining a stable version:: 131* Obtaining a stable version::
@@ -123,67 +138,90 @@ certain feature or a certain issue has been fixed since the last release.
123@node Obtaining a stable version 138@node Obtaining a stable version
124@section Obtaining a stable version 139@section Obtaining a stable version
125 140
126You can download the latest stable version of GNUnet from GNU FTP mirrors: 141Download the tarball from
127@uref{https://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz} 142@indicateurl{https://ftp.gnu.org/gnu/gnunet/gnunet-@value{VERSION}.tar.gz}.
128You should also download the signature file and verify the integrity of the tarball. 143
129@uref{https://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz.sig} 144Make sure to download the associated @file{.sig} file and to verify the
130To verify the signature you should first import the GPG key used to sign the tarball 145authenticity of the tarball against it, like this:
146
131@example 147@example
132$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E 148$ wget https://ftp.gnu.org/gnu/gnunet/gnunet-@value{VERSION}.tar.gz.sig
149$ gpg --verify-files gnunet-@value{VERSION}.tar.gz.sig
133@end example 150@end example
134And use this key to verify the tarball's signature 151
152@noindent
153If this command fails because you do not have the required public key,
154then you need to run this command to import it:
155
135@example 156@example
136$ gpg --verify gnunet-0.10.x.tar.gz.sig gnunet-0.10.x.tar.gz 157$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E
137@end example 158@end example
138After successfully verifying the integrity you can extract the tarball using 159
160@noindent
161and rerun the @code{gpg --verify-files} command.
162
163Now you can extract the tarball and rename the resulting
164directory to @i{gnunet} which we will be using in the
165remainder of this document.
166
139@example 167@example
140$ tar xvzf gnunet-0.10.x.tar.gz 168$ tar xvzf gnunet-@value{VERSION}.tar.gz
141## we will use the directory "gnunet" in the remainder of this document 169$ mv gnunet-@value{VERSION} gnunet
142$ mv gnunet-0.10.x gnunet
143$ cd gnunet 170$ cd gnunet
144@end example 171@end example
145 172
146However, please note that stable versions can be very outdated, as a developer 173@noindent
147you are strongly encouraged to use the version from @uref{https://gnunet.org/git/}. 174However, please note that stable versions can be very outdated.
175As a developer you are @b{strongly} encouraged to use the version
176from @uref{https://gnunet.org/git/, git}.
148 177
149@node Installing Build Tool Chain and Dependencies 178@node Installing Build Tool Chain and Dependencies
150@section Installing Build Tool Chain and Dependencies 179@section Installing Build Tool Chain and Dependencies
151 180
152To successfully compile GNUnet you need the tools to build GNUnet and the required dependencies. 181To successfully compile GNUnet you need the tools to build GNUnet and
153Please have a look at @uref{https://gnunet.org/dependencies} for a list of required dependencies 182the required dependencies. Please have a look at
154and @uref{https://gnunet.org/generic_installation} for specific instructions for your operating system. 183@uref{https://gnunet.org/dependencies} for a list of required dependencies
155 184and @uref{https://gnunet.org/generic_installation} for specific
156Please check the notes at the end of the configure process about required dependencies. 185instructions for your operating system. Please check the notes at
186the end of the configure process about required dependencies.
157 187
158For GNUnet bootstrapping support and the http(s) plugin you should install libgnurl. 188For GNUnet bootstrapping support and the http(s) plugin you should
159For the filesharing service you should install at least one of the datastore backends mysql, 189install @uref{https://gnunet.org/gnurl, libgnurl}.
160sqlite or postgresql. 190For the filesharing service you should install at least one of the
191datastore backends. MySQL, SQlite and PostgreSQL are supported.
161 192
162@node Obtaining the latest version from Git 193@node Obtaining the latest version from Git
163@section Obtaining the latest version from Git 194@section Obtaining the latest version from Git
164 195
165The latest development version can obtained from our Git repository. To obtain 196The latest development version can obtained from our Git repository.
166the code you need Git installed and checkout the repository using: 197To obtain the code you need Git installed and checkout the repository
198using:
199
167@example 200@example
168$ git clone https://gnunet.org/git/gnunet 201$ git clone https://gnunet.org/git/gnunet
169@end example 202@end example
170After cloning the repository you have to execute 203
204@noindent
205After cloning the repository you have to execute the @file{bootstrap}
206script in the directory:
207
171@example 208@example
172$ cd gnunet 209$ cd gnunet ; ./bootstrap
173$ ./bootstrap
174@end example 210@end example
175 211
176The remainder of this tutorial assumes that you have Git branch ``master'' checked out. 212@noindent
213The remainder of this tutorial assumes that you have the Git branch
214``master'' checked out.
177 215
178@node Compiling and Installing GNUnet 216@node Compiling and Installing GNUnet
179@section Compiling and Installing GNUnet 217@section Compiling and Installing GNUnet
180 218
181First, you need to install at least libgnupgerror version 1.27 219First, you need to install at least libgnupgerror 1.27 and
182@uref{https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.27.tar.bz2} 220libgcrypt 1.7.6.
183and libgcrypt version 1.7.6 @uref{https://www.gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.7.6.tar.bz2}.
184 221
185@example 222@example
186$ wget https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.27.tar.bz2 223$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
224$ wget $GNUPGFTP/libgpg-error/libgpg-error-1.27.tar.bz2
187$ tar xf libgpg-error-1.27.tar.bz2 225$ tar xf libgpg-error-1.27.tar.bz2
188$ cd libgpg-error-1.27 226$ cd libgpg-error-1.27
189$ ./configure 227$ ./configure
@@ -192,7 +230,8 @@ $ cd ..
192@end example 230@end example
193 231
194@example 232@example
195$ wget https://www.gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.7.6.tar.bz2 233$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
234$ wget $GNUPGFTP/libgcrypt/libgcrypt-1.7.6.tar.bz2
196$ tar xf libgcrypt-1.7.6.tar.bz2 235$ tar xf libgcrypt-1.7.6.tar.bz2
197$ cd libgcrypt-1.7.6 236$ cd libgcrypt-1.7.6
198$ ./configure 237$ ./configure
@@ -220,10 +259,12 @@ $ make
220$ make install 259$ make install
221@end example 260@end example
222 261
223After installing GNUnet you have to add your GNUnet installation to your path 262@noindent
224environmental variable. In addition you have to create the @file{.config} 263After installing GNUnet you have to add your GNUnet installation
225directory in your home directory (unless it already exists) where GNUnet stores 264to your path environmental variable. In addition you have to
226its data and an empty GNUnet configuration file: 265create the @file{.config} directory in your home directory
266(unless it already exists) where GNUnet stores its data and an
267empty GNUnet configuration file:
227 268
228@example 269@example
229$ export PATH=$PATH:$PREFIX/bin 270$ export PATH=$PATH:$PREFIX/bin
@@ -238,23 +279,34 @@ $ touch ~/.config/gnunet.conf
238You should check your installation to ensure that installing GNUnet 279You should check your installation to ensure that installing GNUnet
239was successful up to this point. You should be able to access GNUnet's 280was successful up to this point. You should be able to access GNUnet's
240binaries and run GNUnet's self check. 281binaries and run GNUnet's self check.
282
241@example 283@example
242$ which gnunet-arm 284$ which gnunet-arm
243@end example 285@end example
244should return $PREFIX/bin/gnunet-arm. It should be 286
245located in your GNUnet installation and the output should not be 287@noindent
246empty. If you see an output like: 288should return $PREFIX/bin/gnunet-arm. It should be located in your
289GNUnet installation and the output should not be empty.
290If you see an output like:
291
247@example 292@example
248$ which gnunet-arm 293$ which gnunet-arm
249@end example 294@end example
250check your PATH variable to ensure GNUnet's @file{bin} directory is included. 295
296@noindent
297check your PATH variable to ensure GNUnet's @file{bin} directory is
298included.
251 299
252GNUnet provides tests for all of its subcomponents. Run 300GNUnet provides tests for all of its subcomponents. Run
301
253@example 302@example
254$ make check 303$ make check
255@end example 304@end example
256to execute tests for all components. make check traverses all subdirectories in src. 305
257For every subdirectory you should get a message like this: 306@noindent
307to execute tests for all components. @command{make check} traverses all
308subdirectories in @file{src}. For every subdirectory you should
309get a message like this:
258 310
259@example 311@example
260make[2]: Entering directory `/home/$USER/gnunet/contrib' 312make[2]: Entering directory `/home/$USER/gnunet/contrib'
@@ -269,24 +321,29 @@ PASS: test_gnunet_prefix
269 321
270GNUnet is organized in layers and services. Each service is composed of a 322GNUnet is organized in layers and services. Each service is composed of a
271main service implementation and a client library for other programs to use 323main service implementation and a client library for other programs to use
272the service's functionality, described by an API. This approach is shown in 324the service's functionality, described by an API.
273@c** FIXME: enable this once the commented block below works: 325@c This approach is shown in
274@c** figure~\ref{fig:service}. 326@c FIXME: enable this once the commented block below works:
275Some services provide an additional command line tool to enable the user to 327@c figure~\ref fig:service.
276interact with the service. 328Some services provide an additional command line tool to enable the user
277 329to interact with the service.
278Very often it is other GNUnet services that will use these APIs to build the 330
279higher layers of GNUnet on top of the lower ones. Each layer expands or extends 331Very often it is other GNUnet services that will use these APIs to build
280the functionality of the service below (for instance, to build a mesh on top of 332the higher layers of GNUnet on top of the lower ones. Each layer expands
281a DHT). 333or extends the functionality of the service below (for instance, to build
282@c** FXIME: See comment above. 334a mesh on top of a DHT).
283@c** See figure ~\ref{fig:interaction} for an illustration of this approach. 335@c FXIME: See comment above.
284 336@c See figure ~\ref fig:interaction for an illustration of this approach.
285@c ** @image{filename[, width[, height[, alttext[, extension]]]]} 337
286 338@c ** @image filename[, width[, height[, alttext[, extension]]]]
287@image{images/gnunet-tutorial-service,,5in,Service with API and network protocol,.png} 339@c FIXME: Texlive (?) 20112 makes the assumption that this means
288 340@c 'images/OBJECTNAME.txt' but later versions of it (2017) use this
289@image{images/gnunet-tutorial-system,,5in,The layered system architecture of GNUnet,.png} 341@c syntax as described below.
342@c TODO: Checkout the makedoc script Guile uses.
343
344@c FIXME!!!
345@c @image{images/gnunet-tutorial-service,,5in,Service with API and network protocol,.png}
346@c @image{images/gnunet-tutorial-system,,5in,The layered system architecture of GNUnet,.png}
290 347
291@c \begin{figure}[!h] 348@c \begin{figure}[!h]
292@c \begin{center} 349@c \begin{center}
@@ -308,11 +365,11 @@ a DHT).
308@c \caption{GNUnet's layered system architecture} 365@c \caption{GNUnet's layered system architecture}
309@c \end{figure} 366@c \end{figure}
310 367
311The main service implementation runs as a standalone process in the operating 368The main service implementation runs as a standalone process in the
312system and the client code runs as part of the client program, so crashes of a 369operating system and the client code runs as part of the client program,
313client do not affect the service process or other clients. The service and the 370so crashes of a client do not affect the service process or other clients.
314clients communicate via a message protocol to be defined and implemented by 371The service and the clients communicate via a message protocol to be
315the programmer. 372defined and implemented by the programmer.
316 373
317@node First Steps with GNUnet 374@node First Steps with GNUnet
318@chapter First Steps with GNUnet 375@chapter First Steps with GNUnet
@@ -328,43 +385,51 @@ the programmer.
328@node Configure your peer 385@node Configure your peer
329@section Configure your peer 386@section Configure your peer
330 387
331First of all we need to configure your peer. Each peer is started with a configuration 388First of all we need to configure your peer. Each peer is started with
332containing settings for GNUnet itself and its services. This configuration is based on the 389a configuration containing settings for GNUnet itself and its services.
333default configuration shipped with GNUnet and can be modified. The default configuration 390This configuration is based on the default configuration shipped with
334is located in the @file{$PREFIX/share/gnunet/config.d} directory. When starting a peer, you 391GNUnet and can be modified. The default configuration is located in the
335can specify a customized configuration using the the @command{-c} command line switch when 392@file{$PREFIX/share/gnunet/config.d} directory. When starting a peer, you
336starting the ARM service and all other services. When using a modified configuration the 393can specify a customized configuration using the the @command{-c} command
337default values are loaded and only values specified in the configuration file will replace 394line switch when starting the ARM service and all other services. When
338the default values. 395using a modified configuration the default values are loaded and only
339 396values specified in the configuration file will replace the default
340Since we want to start additional peers later, we need some modifications from the default 397values.
341configuration. We need to create a separate service home and a file containing our 398
342modifications for this peer: 399Since we want to start additional peers later, we need some modifications
400from the default configuration. We need to create a separate service
401home and a file containing our modifications for this peer:
402
343@example 403@example
344$ mkdir ~/gnunet1/ 404$ mkdir ~/gnunet1/
345$ touch peer1.conf 405$ touch peer1.conf
346@end example 406@end example
347 407
348Now add the following lines to @file{peer1.conf} to use this directory. For 408@noindent
349simplified usage we want to prevent the peer to connect to the GNUnet 409Now add the following lines to @file{peer1.conf} to use this directory.
410For simplified usage we want to prevent the peer to connect to the GNUnet
350network since this could lead to confusing output. This modifications 411network since this could lead to confusing output. This modifications
351will replace the default settings: 412will replace the default settings:
413
352@example 414@example
353[PATHS] 415[PATHS]
354GNUNET_HOME = ~/gnunet1/ # Use this directory to store GNUnet data 416# Use this directory to store GNUnet data
417GNUNET_HOME = ~/gnunet1/
355[hostlist] 418[hostlist]
356SERVERS = # prevent bootstrapping 419# prevent bootstrapping
420SERVERS =
357@end example 421@end example
358 422
359@node Start a peer 423@node Start a peer
360@section Start a peer 424@section Start a peer
361Each GNUnet instance (called peer) has an identity (peer ID) based on a 425Each GNUnet instance (called peer) has an identity (peer ID) based on a
362cryptographic public private key pair. The peer ID is the printable hash of the 426cryptographic public private key pair. The peer ID is the printable hash
363public key. 427of the public key.
364 428
365GNUnet services are controlled by a master service, the so called @dfn{Automatic Restart Manager} (ARM). 429GNUnet services are controlled by a master service, the so called
366ARM starts, stops and even restarts services automatically or on demand when a client connects. 430@dfn{Automatic Restart Manager} (ARM). ARM starts, stops and even
367You interact with the ARM service using the gnunet-arm tool. 431restarts services automatically or on demand when a client connects.
432You interact with the ARM service using the @command{gnunet-arm} tool.
368GNUnet can then be started with @command{gnunet-arm -s} and stopped with 433GNUnet can then be started with @command{gnunet-arm -s} and stopped with
369@command{gnunet-arm -e}. An additional service not automatically started 434@command{gnunet-arm -e}. An additional service not automatically started
370can be started using @command{gnunet-arm -i <service name>} and stopped 435can be started using @command{gnunet-arm -i <service name>} and stopped
@@ -372,11 +437,16 @@ using @command{gnunet-arm -k <servicename>}.
372 437
373Once you have started your peer, you can use many other GNUnet commands 438Once you have started your peer, you can use many other GNUnet commands
374to interact with it. For example, you can run: 439to interact with it. For example, you can run:
440
375@example 441@example
376$ gnunet-peerinfo -s 442$ gnunet-peerinfo -s
377@end example 443@end example
444
445@noindent
378to obtain the public key of your peer. 446to obtain the public key of your peer.
447
379You should see an output containing the peer ID similar to: 448You should see an output containing the peer ID similar to:
449
380@example 450@example
381I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'. 451I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'.
382@end example 452@end example
@@ -384,33 +454,45 @@ I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'.
384@node Monitor a peer 454@node Monitor a peer
385@section Monitor a peer 455@section Monitor a peer
386 456
387In this section, we will monitor the behaviour of our peer's DHT service with respect to a 457In this section, we will monitor the behaviour of our peer's DHT
388specific key. First we will start GNUnet and then start the DHT service and use the DHT monitor tool 458service with respect to a specific key. First we will start
389to monitor the PUT and GET commands we issue ussing the @command{gnunet-dht-put} and 459GNUnet and then start the DHT service and use the DHT monitor tool
390@command{gnunet-dht-get} commands. Using the ``monitor'' line given below, you can observe 460to monitor the PUT and GET commands we issue ussing the
391the behavior of your own peer's DHT with respect to the specified KEY: 461@command{gnunet-dht-put} and @command{gnunet-dht-get} commands.
462Using the ``monitor'' line given below, you can observe the behavior
463of your own peer's DHT with respect to the specified KEY:
392 464
393@example 465@example
394$ gnunet-arm -c ~/peer1.conf -s # start gnunet with all default services 466# start gnunet with all default services:
395$ gnunet-arm -c ~/peer1.conf -i dht # start DHT service 467$ gnunet-arm -c ~/peer1.conf -s
468# start DHT service:
469$ gnunet-arm -c ~/peer1.conf -i dht
396$ cd ~/gnunet/src/dht; 470$ cd ~/gnunet/src/dht;
397$ ./gnunet-dht-monitor -c ~/peer1.conf -k KEY 471$ ./gnunet-dht-monitor -c ~/peer1.conf -k KEY
398@end example 472@end example
399Now open a separate terminal and change again to the @file{gnunet/src/dht} directory: 473
474@noindent
475Now open a separate terminal and change again to
476the @file{gnunet/src/dht} directory:
477
400@example 478@example
401$ cd ~/gnunet/src/dht 479$ cd ~/gnunet/src/dht
402$ ./gnunet-dht-put -c ~/peer1.conf -k KEY -d VALUE # put VALUE under KEY in the DHT 480# put VALUE under KEY in the DHT:
403$ ./gnunet/src/dht/gnunet-dht-get -c ~/peer1.conf -k KEY # get key KEY from the DHT 481$ ./gnunet-dht-put -c ~/peer1.conf -k KEY -d VALUE
404$ gnunet-statistics -c ~/peer1.conf # print statistics about current GNUnet state 482# get key KEY from the DHT:
405$ gnunet-statistics -c ~/peer1.conf -s dht # print statistics about DHT service 483$ ./gnunet/src/dht/gnunet-dht-get -c ~/peer1.conf -k KEY
484# print statistics about current GNUnet state:
485$ gnunet-statistics -c ~/peer1.conf
486# print statistics about DHT service:
487$ gnunet-statistics -c ~/peer1.conf -s dht
406@end example 488@end example
407 489
408@node Starting Two Peers by Hand 490@node Starting Two Peers by Hand
409@section Starting Two Peers by Hand 491@section Starting Two Peers by Hand
410 492
411This section describes how to start two peers on the same machine by hand. 493This section describes how to start two peers on the same machine by hand.
412The process is rather painful, but the description is somewhat instructive. 494The process is rather painful, but the description is somewhat
413In practice, you might prefer the automated method 495instructive. In practice, you might prefer the automated method
414(@pxref{Starting Peers Using the Testbed Service}). 496(@pxref{Starting Peers Using the Testbed Service}).
415 497
416@menu 498@menu
@@ -424,29 +506,37 @@ In practice, you might prefer the automated method
424We will now start a second peer on your machine. 506We will now start a second peer on your machine.
425For the second peer, you will need to manually create a modified 507For the second peer, you will need to manually create a modified
426configuration file to avoid conflicts with ports and directories. 508configuration file to avoid conflicts with ports and directories.
427A peers configuration file is by default located in @file{~/.gnunet/gnunet.conf}. 509A peers configuration file is by default located
428This file is typically very short or even empty as only the differences to the 510in @file{~/.gnunet/gnunet.conf}. This file is typically very short
429defaults need to be specified. The defaults are located in 511or even empty as only the differences to the defaults need to be
430many files in the @file{$PREFIX/share/gnunet/config.d} directory. 512specified. The defaults are located in many files in the
513@file{$PREFIX/share/gnunet/config.d} directory.
431 514
432To configure the second peer, use the files 515To configure the second peer, use the files
433@file{$PREFIX/share/gnunet/config.d} as a template for your main 516@file{$PREFIX/share/gnunet/config.d} as a template for your main
434configuration file: 517configuration file:
518
435@example 519@example
436$ cat $PREFIX/share/gnunet/config.d/*.conf > peer2.conf 520$ cat $PREFIX/share/gnunet/config.d/*.conf > peer2.conf
437@end example 521@end example
522
523@noindent
438Now you have to edit @file{peer2.conf} and change: 524Now you have to edit @file{peer2.conf} and change:
525
439@itemize 526@itemize
440@item @code{GNUNET\_TEST\_HOME} under @code{PATHS} 527@item @code{GNUNET\_TEST\_HOME} under @code{PATHS}
441@item Every (uncommented) value for ``@code{PORT}'' (add 10000) in any 528@item Every (uncommented) value for ``@code{PORT}'' (add 10000) in any
442section (the option may be commented out if @code{PORT} is 529section (the option may be commented out if @code{PORT} is
443prefixed by "\#", in this case, UNIX domain sockets are used 530prefixed by "\#", in this case, UNIX domain sockets are used
444and the PORT option does not need to be touched) 531and the PORT option does not need to be touched)
445@item Every value for ``@code{UNIXPATH}'' in any section (e.g. by adding a "-p2" suffix) 532@item Every value for ``@code{UNIXPATH}'' in any section
533(e.g. by adding a "-p2" suffix)
446@end itemize 534@end itemize
447to a fresh, unique value. Make sure that the PORT numbers stay below 65536. 535
448From now on, whenever you interact with the second peer, you need to specify 536to a fresh, unique value. Make sure that the PORT numbers stay
449@command{-c peer2.conf} as an additional command line argument. 537below 65536. From now on, whenever you interact with the second peer,
538you need to specify @command{-c peer2.conf} as an additional
539command line argument.
450 540
451Now, generate the 2nd peer's private key: 541Now, generate the 2nd peer's private key:
452 542
@@ -454,6 +544,7 @@ Now, generate the 2nd peer's private key:
454$ gnunet-peerinfo -s -c peer2.conf 544$ gnunet-peerinfo -s -c peer2.conf
455@end example 545@end example
456 546
547@noindent
457This may take a while, generate entropy using your keyboard or mouse 548This may take a while, generate entropy using your keyboard or mouse
458as needed. Also, make sure the output is different from the 549as needed. Also, make sure the output is different from the
459gnunet-peerinfo output for the first peer (otherwise you made an 550gnunet-peerinfo output for the first peer (otherwise you made an
@@ -463,34 +554,46 @@ error in the configuration).
463@subsection Start the second peer and connect the peers 554@subsection Start the second peer and connect the peers
464 555
465Then, you can start a second peer using: 556Then, you can start a second peer using:
557
466@example 558@example
467$ gnunet-arm -c peer2.conf -s 559$ gnunet-arm -c peer2.conf -s
468$ gnunet-arm -c peer2.conf -i dht 560$ gnunet-arm -c peer2.conf -i dht
469$ ~/gnunet/src/dht/gnunet-dht-put -c peer2.conf -k KEY -d VALUE 561$ ~/gnunet/src/dht/gnunet-dht-put -c peer2.conf -k KEY -d VALUE
470$ ~/gnunet/src/dht/gnunet-dht-get -c peer2.conf -k KEY 562$ ~/gnunet/src/dht/gnunet-dht-get -c peer2.conf -k KEY
471@end example 563@end example
564
472If you want the two peers to connect, you have multiple options: 565If you want the two peers to connect, you have multiple options:
566
473@itemize 567@itemize
474@item UDP neighbour discovery (automatic) 568@item UDP neighbour discovery (automatic)
475@item Setup a bootstrap server 569@item Setup a bootstrap server
476@item Connect manually 570@item Connect manually
477@end itemize 571@end itemize
572
478To setup peer 1 as bootstrapping server change the configuration of 573To setup peer 1 as bootstrapping server change the configuration of
479the first one to be a hostlist server by adding the following lines to 574the first one to be a hostlist server by adding the following lines to
480@file{peer1.conf} to enable bootstrapping server: 575@file{peer1.conf} to enable bootstrapping server:
576
481@example 577@example
482[hostlist] 578[hostlist]
483OPTIONS = -p 579OPTIONS = -p
484@end example 580@end example
485 581
486Then change @file{peer2.conf} and replace the ``@code{SERVERS}'' line in the ``@code{[hostlist]}'' section with 582@noindent
583Then change @file{peer2.conf} and replace the ``@code{SERVERS}''
584line in the ``@code{[hostlist]}'' section with
487``@code{http://localhost:8080/}''. Restart both peers using: 585``@code{http://localhost:8080/}''. Restart both peers using:
586
488@example 587@example
489$ gnunet-arm -c peer1.conf -e # stop first peer 588# stop first peer
490$ gnunet-arm -c peer1.conf -s # start first peer 589$ gnunet-arm -c peer1.conf -e
491$ gnunet-arm -c peer2.conf -s # start second peer 590# start first peer
591$ gnunet-arm -c peer1.conf -s
592# start second peer
593$ gnunet-arm -c peer2.conf -s
492@end example 594@end example
493 595
596@noindent
494Note that if you start your peers without changing these settings, they 597Note that if you start your peers without changing these settings, they
495will use the ``global'' hostlist servers of the GNUnet P2P network and 598will use the ``global'' hostlist servers of the GNUnet P2P network and
496likely connect to those peers. At that point, debugging might become 599likely connect to those peers. At that point, debugging might become
@@ -501,16 +604,23 @@ by you.
501@node How to connect manually 604@node How to connect manually
502@subsection How to connect manually 605@subsection How to connect manually
503 606
504If you want to use the @code{peerinfo} tool to connect your peers, you should: 607If you want to use the @code{peerinfo} tool to connect your
608peers, you should:
609
505@itemize 610@itemize
506@item Set @code{FORCESTART = NO} in section @code{hostlist} (to not connect to the global GNUnet) 611@item Set @code{FORCESTART = NO} in section @code{hostlist}
507@item Start both peers running @command{gnunet-arm -c peer1.conf -s} and @command{gnunet-arm -c peer2.conf -s} 612(to not connect to the global GNUnet)
508@item Get @code{HELLO} message of the first peer running @command{gnunet-peerinfo -c peer1.conf -g} 613@item Start both peers running @command{gnunet-arm -c peer1.conf -s}
509@item Give the output to the second peer by running @command{gnunet-peerinfo -c peer2.conf -p '<output>'} 614and @command{gnunet-arm -c peer2.conf -s}
615@item Get @code{HELLO} message of the first peer running
616@command{gnunet-peerinfo -c peer1.conf -g}
617@item Give the output to the second peer by running
618@command{gnunet-peerinfo -c peer2.conf -p '<output>'}
510@end itemize 619@end itemize
511 620
512Check that they are connected using @command{gnunet-core -c peer1.conf}, 621Check that they are connected using @command{gnunet-core -c peer1.conf},
513which should give you the other peer's peer identity: 622which should give you the other peer's peer identity:
623
514@example 624@example
515$ gnunet-core -c peer1.conf 625$ gnunet-core -c peer1.conf
516Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG' 626Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG'
@@ -520,90 +630,109 @@ Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG'
520@section Starting Peers Using the Testbed Service 630@section Starting Peers Using the Testbed Service
521@c \label{sec:testbed} 631@c \label{sec:testbed}
522 632
523GNUnet's testbed service is used for testing scenarios where a number of peers 633GNUnet's testbed service is used for testing scenarios where
524are to be started. The testbed can manage peers on a single host or on multiple 634a number of peers are to be started. The testbed can manage peers
525hosts in a distributed fashion. On a single affordable computer, it should be 635on a single host or on multiple hosts in a distributed fashion.
526possible to run around tens of peers without drastically increasing the load on the 636On a single affordable computer, it should be possible to run
637around tens of peers without drastically increasing the load on the
527system. 638system.
528 639
529The testbed service can be access through its API 640The testbed service can be access through its API
530@file{include/gnunet\_testbed\_service.h}. The API provides many routines for 641@file{include/gnunet\_testbed\_service.h}. The API provides many
531managing a group of peers. It also provides a helper function 642routines for managing a group of peers. It also provides a helper
532@code{GNUNET\_TESTBED\_test\_run()} to quickly setup a minimalistic testing 643function @code{GNUNET\_TESTBED\_test\_run()} to quickly setup a
533environment on a single host. 644minimalistic testing environment on a single host.
534 645
535This function takes a configuration file which will be used as a template 646This function takes a configuration file which will be used as a
536configuration for the peers. The testbed takes care of modifying relevant 647template configuration for the peers. The testbed takes care of
537options in the peers' configuration such as @code{SERVICEHOME}, @code{PORT}, @code{UNIXPATH} to 648modifying relevant options in the peers' configuration such as
538unique values so that peers run without running into conflicts. It also checks 649@code{SERVICEHOME}, @code{PORT}, @code{UNIXPATH} to unique values
650so that peers run without running into conflicts. It also checks
539and assigns the ports in configurations only if they are free. 651and assigns the ports in configurations only if they are free.
540 652
541Additionally, the testbed service also reads its options from the same 653Additionally, the testbed service also reads its options from the
542configuration file. Various available options and details about them can be 654same configuration file. Various available options and details
543found in the testbed default configuration file @file{src/testbed/testbed.conf}. 655about them can be found in the testbed default configuration file
656@file{src/testbed/testbed.conf}.
544 657
545With the testbed API, a sample test case can be structured as follows: 658With the testbed API, a sample test case can be structured as follows:
659
546@example 660@example
547@verbatiminclude testbed_test.c 661@verbatiminclude testbed_test.c
548@end example 662@end example
663
664@noindent
549The source code for the above listing can be found at 665The source code for the above listing can be found at
550@uref{https://gnunet.org/git/gnunet.git/tree/doc/testbed_test.c} 666@uref{https://gnunet.org/git/gnunet.git/tree/doc/
551or in the @file{doc/} folder of your repository check-out. 667documentation/testbed_test.c}
668or in the @file{doc/documentation/} folder of your repository check-out.
552After installing GNUnet, the above source code can be compiled as: 669After installing GNUnet, the above source code can be compiled as:
670
553@example 671@example
554$ export CPPFLAGS="-I/path/to/gnunet/headers" 672$ export CPPFLAGS="-I/path/to/gnunet/headers"
555$ export LDFLAGS="-L/path/to/gnunet/libraries" 673$ export LDFLAGS="-L/path/to/gnunet/libraries"
556$ gcc $CPPFLAGS $LDFLAGS -o testbed-test testbed_test.c -lgnunettestbed -lgnunetdht -lgnunetutil 674$ gcc $CPPFLAGS $LDFLAGS -o testbed-test testbed_test.c \
557$ touch template.conf # Generate (empty) configuration 675 -lgnunettestbed -lgnunetdht -lgnunetutil
558$ ./testbed-test # run it (press CTRL-C to stop) 676# Generate (empty) configuration
677$ touch template.conf
678# run it (press CTRL-C to stop)
679$ ./testbed-test
559@end example 680@end example
560The @code{CPPFLAGS} and @code{LDFLAGS} are necessary if GNUnet is installed 681
561into a different directory other than @file{/usr/local}. 682@noindent
562 683The @code{CPPFLAGS} and @code{LDFLAGS} are necessary if GNUnet
563All of testbed API's peer management functions treat management actions as 684is installed into a different directory other than @file{/usr/local}.
564operations and return operation handles. It is expected that the operations 685
565begin immediately, but they may get delayed (to balance out load on the system). 686All of testbed API's peer management functions treat management
566The program using the API then has to take care of marking the operation as 687actions as operations and return operation handles. It is expected
567``done'' so that its associated resources can be freed immediately and other 688that the operations begin immediately, but they may get delayed (to
568waiting operations can be executed. Operations will be canceled if they are 689balance out load on the system). The program using the API then has
690to take care of marking the operation as ``done'' so that its
691associated resources can be freed immediately and other waiting
692operations can be executed. Operations will be canceled if they are
569marked as ``done'' before their completion. 693marked as ``done'' before their completion.
570 694
571An operation is treated as completed when it succeeds or fails. Completion of 695An operation is treated as completed when it succeeds or fails.
572an operation is either conveyed as events through @i{controller event callback} 696Completion of an operation is either conveyed as events through
573or through respective operation completion callbacks. In functions 697@i{controller event callback} or through respective operation
574which support completion notification through both controller event callback and 698completion callbacks. In functions which support completion
575operation completion callback, first the controller event callback will be 699notification through both controller event callback and operation
576called. If the operation is not marked as done in that callback or if the 700completion callback, first the controller event callback will be
577callback is given as NULL when creating the operation, the operation completion 701called. If the operation is not marked as done in that callback
578callback will be called. The API documentation shows which event are to be 702or if the callback is given as NULL when creating the operation,
579expected in the controller event notifications. It also documents any 703the operation completion callback will be called. The API
580exceptional behaviour. 704documentation shows which event are to be expected in the
581 705controller event notifications. It also documents any exceptional
582Once the peers are started, test cases often need to connect some of the peers' 706behaviour.
583services. Normally, opening a connect to a peer's service requires the peer's 707
584configuration. While using testbed, the testbed automatically generates 708Once the peers are started, test cases often need to connect
585per-peer configuration. Accessing those configurations directly through file 709some of the peers' services. Normally, opening a connect to
586system is discouraged as their locations are dynamically created and will be 710a peer's service requires the peer's configuration. While using
587different among various runs of testbed. To make access to these configurations 711testbed, the testbed automatically generates per-peer configuration.
588easy, testbed API provides the function 712Accessing those configurations directly through file system is
589@code{GNUNET\_TESTBED\_service\_connect()}. This function fetches the 713discouraged as their locations are dynamically created and will be
590configuration of a given peer and calls the @i{Connect Adapter}. 714different among various runs of testbed. To make access to these
591In the example code, it is the @code{dht\_ca}. A connect adapter is expected 715configurations easy, testbed API provides the function
592to open the connection to the needed service by using the provided configuration 716@code{GNUNET\_TESTBED\_service\_connect()}. This function fetches
593and return the created service connection handle. Successful connection to the 717the configuration of a given peer and calls the @i{Connect Adapter}.
594needed service is signaled through @code{service\_connect\_comp\_cb}. 718In the example code, it is the @code{dht\_ca}. A connect adapter is
595 719expected to open the connection to the needed service by using the
596A dual to connect adapter is the @i{Disconnect Adapter}. This callback is 720provided configuration and return the created service connection handle.
597called after the connect adapter has been called when the operation from 721Successful connection to the needed service is signaled through
598@code{GNUNET\_TESTBED\_service\_connect()} is marked as ``done''. It has to 722@code{service\_connect\_comp\_cb}.
599disconnect from the service with the provided service handle (@code{op\_result}). 723
724A dual to connect adapter is the @i{Disconnect Adapter}. This callback
725is called after the connect adapter has been called when the operation
726from @code{GNUNET\_TESTBED\_service\_connect()} is marked as ``done''.
727It has to disconnect from the service with the provided service
728handle (@code{op\_result}).
600 729
601Exercise: Find out how many peers you can run on your system. 730Exercise: Find out how many peers you can run on your system.
602 731
603Exercise: Find out how to create a 2D torus topology by changing the 732Exercise: Find out how to create a 2D torus topology by changing the
604options in the configuration file. See @uref{https://gnunet.org/supported-topologies} 733options in the configuration file.
605Then use the DHT API to store and retrieve values in the 734See @uref{https://gnunet.org/supported-topologies}, then use the
606network. 735DHT API to store and retrieve values in the network.
607 736
608@node Developing Applications 737@node Developing Applications
609@chapter Developing Applications 738@chapter Developing Applications
@@ -635,17 +764,21 @@ $ make install
635$ make check 764$ make check
636@end example 765@end example
637 766
638The GNUnet ext template includes examples and a working buildsystem for a new GNUnet service. 767@noindent
639A common GNUnet service consists of the following parts which will be discussed in detail in the 768The GNUnet ext template includes examples and a working buildsystem
640remainder of this document. The functionality of a GNUnet service is implemented in: 769for a new GNUnet service. A common GNUnet service consists of the
770following parts which will be discussed in detail in the remainder
771of this document. The functionality of a GNUnet service is implemented in:
641 772
642@itemize 773@itemize
643@item the GNUnet service (gnunet-ext/src/ext/gnunet-service-ext.c) 774@item the GNUnet service (gnunet-ext/src/ext/gnunet-service-ext.c)
644@item the client API (gnunet-ext/src/ext/ext_api.c) 775@item the client API (gnunet-ext/src/ext/ext_api.c)
645@item the client application using the service API (gnunet-ext/src/ext/gnunet-ext.c) 776@item the client application using the service API
777(gnunet-ext/src/ext/gnunet-ext.c)
646@end itemize 778@end itemize
647 779
648The interfaces for these entities are defined in: 780The interfaces for these entities are defined in:
781
649@itemize 782@itemize
650@item client API interface (gnunet-ext/src/ext/ext.h) 783@item client API interface (gnunet-ext/src/ext/ext.h)
651@item the service interface (gnunet-ext/src/include/gnunet_service_SERVICE.h) 784@item the service interface (gnunet-ext/src/include/gnunet_service_SERVICE.h)
@@ -654,9 +787,11 @@ The interfaces for these entities are defined in:
654 787
655 788
656In addition the ext systems provides: 789In addition the ext systems provides:
790
657@itemize 791@itemize
658@item a test testing the API (gnunet-ext/src/ext/test_ext_api.c) 792@item a test testing the API (gnunet-ext/src/ext/test_ext_api.c)
659@item a configuration template for the service (gnunet-ext/src/ext/ext.conf.in) 793@item a configuration template for the service
794(gnunet-ext/src/ext/ext.conf.in)
660@end itemize 795@end itemize
661 796
662@node Adapting the Template 797@node Adapting the Template
@@ -664,22 +799,24 @@ In addition the ext systems provides:
664 799
665The first step for writing any extension with a new service is to 800The first step for writing any extension with a new service is to
666ensure that the @file{ext.conf.in} file contains entries for the 801ensure that the @file{ext.conf.in} file contains entries for the
667@code{UNIXPATH}, @code{PORT} and @code{BINARY} for the service in a section named after 802@code{UNIXPATH}, @code{PORT} and @code{BINARY} for the service in a
668the service. 803section named after the service.
669 804
670If you want to adapt the template rename the @file{ext.conf.in} to match your 805If you want to adapt the template rename the @file{ext.conf.in} to
671services name, you have to modify the @code{AC\_OUTPUT} section in @file{configure.ac} 806match your services name, you have to modify the @code{AC\_OUTPUT}
672in the @file{gnunet-ext} root. 807section in @file{configure.ac} in the @file{gnunet-ext} root.
673 808
674@node Writing a Client Application 809@node Writing a Client Application
675@section Writing a Client Application 810@section Writing a Client Application
676 811
677When writing any client application (for example, a command-line 812When writing any client application (for example, a command-line
678tool), the basic structure is to start with the @code{GNUNET\_PROGRAM\_run} 813tool), the basic structure is to start with the
679function. This function will parse command-line options, setup the scheduler 814@code{GNUNET\_PROGRAM\_run} function. This function will parse
680and then invoke the @code{run} function (with the remaining non-option arguments) 815command-line options, setup the scheduler and then invoke the
681and a handle to the parsed configuration (and the configuration file name that was 816@code{run} function (with the remaining non-option arguments)
682used, which is typically not needed): 817and a handle to the parsed configuration (and the configuration
818file name that was used, which is typically not needed):
819
683@example 820@example
684@verbatiminclude tutorial-examples/001.c 821@verbatiminclude tutorial-examples/001.c
685@end example 822@end example
@@ -697,6 +834,7 @@ Options can then be added easily by adding global variables and
697expanding the @code{options} array. For example, the following would 834expanding the @code{options} array. For example, the following would
698add a string-option and a binary flag (defaulting to @code{NULL} and 835add a string-option and a binary flag (defaulting to @code{NULL} and
699@code{GNUNET\_NO} respectively): 836@code{GNUNET\_NO} respectively):
837
700@example 838@example
701@verbatiminclude tutorial-examples/002.c 839@verbatiminclude tutorial-examples/002.c
702@end example 840@end example
@@ -753,10 +891,12 @@ file).
753 891
754Before a client library can implement the application-specific protocol 892Before a client library can implement the application-specific protocol
755with the service, a connection must be created: 893with the service, a connection must be created:
894
756@example 895@example
757@verbatiminclude tutorial-examples/003.c 896@verbatiminclude tutorial-examples/003.c
758@end example 897@end example
759 898
899@noindent
760As a result a @code{GNUNET\_MQ\_Handle} is returned 900As a result a @code{GNUNET\_MQ\_Handle} is returned
761which can to used henceforth to transmit messages to the service. 901which can to used henceforth to transmit messages to the service.
762The complete MQ API can be found in @file{gnunet\_mq\_lib.h}. 902The complete MQ API can be found in @file{gnunet\_mq\_lib.h}.
@@ -769,27 +909,35 @@ there are errors communicating with the service.
769@node Sending messages 909@node Sending messages
770@subsubsection Sending messages 910@subsubsection Sending messages
771 911
772In GNUnet, messages are always sent beginning with a @code{struct GNUNET\_MessageHeader} 912In GNUnet, messages are always sent beginning with a
773in big endian format. This header defines the size and the type of the 913@code{struct GNUNET\_MessageHeader} in big endian format.
914This header defines the size and the type of the
774message, the payload follows after this header. 915message, the payload follows after this header.
916
775@example 917@example
776@verbatiminclude tutorial-examples/004.c 918@verbatiminclude tutorial-examples/004.c
777@end example 919@end example
778 920
921@noindent
779Existing message types are defined in @file{gnunet\_protocols.h}. 922Existing message types are defined in @file{gnunet\_protocols.h}.
780A common way to create a message is with an envelope: 923A common way to create a message is with an envelope:
924
781@example 925@example
782@verbatiminclude tutorial-examples/005.c 926@verbatiminclude tutorial-examples/005.c
783@end example 927@end example
784 928
929@noindent
785Exercise: Define a message struct that includes a 32-bit 930Exercise: Define a message struct that includes a 32-bit
786unsigned integer in addition to the standard GNUnet MessageHeader. 931unsigned integer in addition to the standard GNUnet MessageHeader.
787Add a C struct and define a fresh protocol number for your message. 932Add a C struct and define a fresh protocol number for your message.
788Protocol numbers in gnunet-ext are defined in @file{gnunet-ext/src/include/gnunet_protocols_ext.h} 933Protocol numbers in gnunet-ext are defined
934in @file{gnunet-ext/src/include/gnunet_protocols_ext.h}
789 935
790Exercise: Find out how you can determine the number of messages in a message queue. 936Exercise: Find out how you can determine the number of messages
937in a message queue.
791 938
792Exercise: Find out how you can determine when a message you have queued was actually transmitted. 939Exercise: Find out how you can determine when a message you
940have queued was actually transmitted.
793 941
794Exercise: Define a helper function to transmit a 32-bit 942Exercise: Define a helper function to transmit a 32-bit
795unsigned integer (as payload) to a service using some given client 943unsigned integer (as payload) to a service using some given client
@@ -808,16 +956,19 @@ to actually process the message. Fixed size messages are fully
808checked by the MQ-logic, and thus only need to provide the handler 956checked by the MQ-logic, and thus only need to provide the handler
809to process the message. Note that the prefixes @code{check\_} 957to process the message. Note that the prefixes @code{check\_}
810and @code{handle\_} are mandatory. 958and @code{handle\_} are mandatory.
959
811@example 960@example
812@verbatiminclude tutorial-examples/006.c 961@verbatiminclude tutorial-examples/006.c
813@end example 962@end example
814 963
964@noindent
815Exercise: Expand your helper function to receive a response message 965Exercise: Expand your helper function to receive a response message
816(for example, containing just the @code{struct GNUnet MessageHeader} 966(for example, containing just the @code{struct GNUnet MessageHeader}
817without any payload). Upon receiving the service's response, you 967without any payload). Upon receiving the service's response, you
818should call a callback provided to your helper function's API. 968should call a callback provided to your helper function's API.
819 969
820Exercise: Figure out where you can pass values to the closures (@code{cls}). 970Exercise: Figure out where you can pass values to the
971closures (@code{cls}).
821 972
822@node Writing a user interface 973@node Writing a user interface
823@subsection Writing a user interface 974@subsection Writing a user interface
@@ -834,8 +985,8 @@ command-line to the service.
834@node Writing a Service 985@node Writing a Service
835@section Writing a Service 986@section Writing a Service
836 987
837Before you can test the client you've written so far, you'll need to also 988Before you can test the client you've written so far, you'll
838implement the corresponding service. 989need to also implement the corresponding service.
839 990
840@menu 991@menu
841* Code Placement:: 992* Code Placement::
@@ -845,21 +996,25 @@ implement the corresponding service.
845@node Code Placement 996@node Code Placement
846@subsection Code Placement 997@subsection Code Placement
847 998
848New services are placed in their own subdirectory under @file{gnunet/src}. 999New services are placed in their own subdirectory under
849This subdirectory should contain the API implementation file @file{SERVICE\_api.c}, 1000@file{gnunet/src}. This subdirectory should contain the API
850the description of the client-service protocol @file{SERVICE.h} and P2P protocol 1001implementation file @file{SERVICE\_api.c}, the description of
1002the client-service protocol @file{SERVICE.h} and P2P protocol
851@file{SERVICE\_protocol.h}, the implementation of the service itself 1003@file{SERVICE\_protocol.h}, the implementation of the service itself
852@file{gnunet-service-SERVICE.h} and several files for tests, including test code 1004@file{gnunet-service-SERVICE.h} and several files for tests,
853and configuration files. 1005including test code and configuration files.
854 1006
855@node Starting a Service 1007@node Starting a Service
856@subsection Starting a Service 1008@subsection Starting a Service
857 1009
858The key API definition for creating a service is the @code{GNUNET\_SERVICE\_MAIN} macro: 1010The key API definition for creating a service is the
1011@code{GNUNET\_SERVICE\_MAIN} macro:
1012
859@example 1013@example
860@verbatiminclude tutorial-examples/007.c 1014@verbatiminclude tutorial-examples/007.c
861@end example 1015@end example
862 1016
1017@noindent
863In addition to the service name and flags, the macro takes three 1018In addition to the service name and flags, the macro takes three
864functions, typically called @code{run}, @code{client\_connect\_cb} and 1019functions, typically called @code{run}, @code{client\_connect\_cb} and
865@code{client\_disconnect\_cb} as well as an array of message handlers 1020@code{client\_disconnect\_cb} as well as an array of message handlers
@@ -867,10 +1022,12 @@ that will be called for incoming messages from clients.
867 1022
868A minimal version of the three central service funtions would look 1023A minimal version of the three central service funtions would look
869like this: 1024like this:
1025
870@example 1026@example
871@verbatiminclude tutorial-examples/008.c 1027@verbatiminclude tutorial-examples/008.c
872@end example 1028@end example
873 1029
1030@noindent
874Exercise: Write a stub service that processes no messages at all 1031Exercise: Write a stub service that processes no messages at all
875in your code. Create a default configuration for it, integrate it 1032in your code. Create a default configuration for it, integrate it
876with the build system and start the service from 1033with the build system and start the service from
@@ -883,8 +1040,9 @@ Exercise: Figure out how to send messages from the service back to the
883client. 1040client.
884 1041
885Each handler function in the service @b{must} eventually (possibly in some 1042Each handler function in the service @b{must} eventually (possibly in some
886asynchronous continuation) call @code{GNUNET\_SERVICE\_client\_continue()}. 1043asynchronous continuation) call
887Only after this call additional messages from the same client may 1044@code{GNUNET\_SERVICE\_client\_continue()}. Only after this call
1045additional messages from the same client may
888be processed. This way, the service can throttle processing messages 1046be processed. This way, the service can throttle processing messages
889from the same client. 1047from the same client.
890 1048
@@ -900,8 +1058,9 @@ FIXME: This section still needs to be updated to the lastest API!
900One of the most important services in GNUnet is the @code{CORE} service 1058One of the most important services in GNUnet is the @code{CORE} service
901managing connections between peers and handling encryption between peers. 1059managing connections between peers and handling encryption between peers.
902 1060
903One of the first things any service that extends the P2P protocol typically does 1061One of the first things any service that extends the P2P protocol
904is connect to the @code{CORE} service using: 1062typically does is connect to the @code{CORE} service using:
1063
905@example 1064@example
906@verbatiminclude tutorial-examples/009.c 1065@verbatiminclude tutorial-examples/009.c
907@end example 1066@end example
@@ -916,13 +1075,16 @@ is connect to the @code{CORE} service using:
916@node New P2P connections 1075@node New P2P connections
917@subsection New P2P connections 1076@subsection New P2P connections
918 1077
919Before any traffic with a different peer can be exchanged, the peer must be 1078Before any traffic with a different peer can be exchanged, the peer must
920known to the service. This is notified by the @code{CORE} @code{connects} callback, 1079be known to the service. This is notified by the @code{CORE}
921which communicates the identity of the new peer to the service: 1080@code{connects} callback, which communicates the identity of the new
1081peer to the service:
1082
922@example 1083@example
923@verbatiminclude tutorial-examples/010.c 1084@verbatiminclude tutorial-examples/010.c
924@end example 1085@end example
925 1086
1087@noindent
926Note that whatever you return from @code{connects} is given as the 1088Note that whatever you return from @code{connects} is given as the
927@i{cls} argument to the message handlers for messages from 1089@i{cls} argument to the message handlers for messages from
928the respective peer. 1090the respective peer.
@@ -969,23 +1131,27 @@ you stop the peer that is receiving your messages?
969@node End of P2P connections 1131@node End of P2P connections
970@subsection End of P2P connections 1132@subsection End of P2P connections
971 1133
972If a message handler returns @code{GNUNET\_SYSERR}, the remote peer shuts down or 1134If a message handler returns @code{GNUNET\_SYSERR}, the remote
973there is an unrecoverable network disconnection, CORE notifies the service that 1135peer shuts down or there is an unrecoverable network
974the peer disconnected. After this notification no more messages will be received 1136disconnection, CORE notifies the service that the peer disconnected.
975from the peer and the service is no longer allowed to send messages to the peer. 1137After this notification no more messages will be received from the
1138peer and the service is no longer allowed to send messages to the peer.
976The disconnect callback looks like the following: 1139The disconnect callback looks like the following:
1140
977@example 1141@example
978@verbatiminclude tutorial-examples/011.c 1142@verbatiminclude tutorial-examples/011.c
979@end example 1143@end example
980 1144
1145@noindent
981Exercise: Fix your service to handle peer disconnects. 1146Exercise: Fix your service to handle peer disconnects.
982 1147
983@node Storing peer-specific data using the PEERSTORE service 1148@node Storing peer-specific data using the PEERSTORE service
984@section Storing peer-specific data using the PEERSTORE service 1149@section Storing peer-specific data using the PEERSTORE service
985 1150
986GNUnet's PEERSTORE service offers a persistorage for arbitrary peer-specific data. 1151GNUnet's PEERSTORE service offers a persistorage for arbitrary
987Other GNUnet services can use the PEERSTORE to store, retrieve and monitor data records. 1152peer-specific data. Other GNUnet services can use the PEERSTORE
988Each data record stored with PEERSTORE contains the following fields: 1153to store, retrieve and monitor data records. Each data record
1154stored with PEERSTORE contains the following fields:
989 1155
990@itemize 1156@itemize
991@item subsystem: Name of the subsystem responsible for the record. 1157@item subsystem: Name of the subsystem responsible for the record.
@@ -1000,8 +1166,8 @@ The first step is to start a connection to the PEERSTORE service:
1000@verbatiminclude tutorial-examples/012.c 1166@verbatiminclude tutorial-examples/012.c
1001@end example 1167@end example
1002 1168
1003The service handle @code{peerstore_handle} will be needed for all subsequent 1169The service handle @code{peerstore_handle} will be needed for
1004PEERSTORE operations. 1170all subsequent PEERSTORE operations.
1005 1171
1006@menu 1172@menu
1007* Storing records:: 1173* Storing records::
@@ -1014,36 +1180,46 @@ PEERSTORE operations.
1014@subsection Storing records 1180@subsection Storing records
1015 1181
1016To store a new record, use the following function: 1182To store a new record, use the following function:
1183
1017@example 1184@example
1018@verbatiminclude tutorial-examples/013.c 1185@verbatiminclude tutorial-examples/013.c
1019@end example 1186@end example
1020 1187
1021The @code{options} parameter can either be @code{GNUNET_PEERSTORE_STOREOPTION_MULTIPLE} 1188@noindent
1022which means that multiple values can be stored under the same key combination (subsystem, peerid, key), 1189The @code{options} parameter can either be
1023or @code{GNUNET_PEERSTORE_STOREOPTION_REPLACE} which means that PEERSTORE will replace any 1190@code{GNUNET_PEERSTORE_STOREOPTION_MULTIPLE} which means that multiple
1024existing values under the given key combination (subsystem, peerid, key) with the new given value. 1191values can be stored under the same key combination
1192(subsystem, peerid, key), or @code{GNUNET_PEERSTORE_STOREOPTION_REPLACE}
1193which means that PEERSTORE will replace any existing values under the
1194given key combination (subsystem, peerid, key) with the new given value.
1025 1195
1026The continuation function @code{cont} will be called after the store request is successfully 1196The continuation function @code{cont} will be called after the store
1027sent to the PEERSTORE service. This does not guarantee that the record is successfully stored, only 1197request is successfully sent to the PEERSTORE service. This does not
1028that it was received by the service. 1198guarantee that the record is successfully stored, only that it was
1199received by the service.
1200
1201The @code{GNUNET_PEERSTORE_store} function returns a handle to the store
1202operation. This handle can be used to cancel the store operation only
1203before the continuation function is called:
1029 1204
1030The @code{GNUNET_PEERSTORE_store} function returns a handle to the store operation. This handle
1031can be used to cancel the store operation only before the continuation function is called:
1032@example 1205@example
1033void 1206@verbatiminclude tutorial-examples/013.1.c
1034GNUNET_PEERSTORE_store_cancel (struct GNUNET_PEERSTORE_StoreContext *sc);
1035@end example 1207@end example
1036 1208
1037@node Retrieving records 1209@node Retrieving records
1038@subsection Retrieving records 1210@subsection Retrieving records
1039 1211
1040To retrieve stored records, use the following function: 1212To retrieve stored records, use the following function:
1213
1041@example 1214@example
1042@verbatiminclude tutorial-examples/014.c 1215@verbatiminclude tutorial-examples/014.c
1043@end example 1216@end example
1044 1217
1045The values of @code{peer} and @code{key} can be @code{NULL}. This allows the 1218@noindent
1046iteration over values stored under any of the following key combinations: 1219The values of @code{peer} and @code{key} can be @code{NULL}. This
1220allows the iteration over values stored under any of the following
1221key combinations:
1222
1047@itemize 1223@itemize
1048@item (subsystem) 1224@item (subsystem)
1049@item (subsystem, peerid) 1225@item (subsystem, peerid)
@@ -1051,25 +1227,32 @@ iteration over values stored under any of the following key combinations:
1051@item (subsystem, peerid, key) 1227@item (subsystem, peerid, key)
1052@end itemize 1228@end itemize
1053 1229
1054The @code{callback} function will be called once with each retrieved record and once 1230The @code{callback} function will be called once with each retrieved
1055more with a @code{NULL} record to signal the end of results. 1231record and once more with a @code{NULL} record to signal the end of
1232results.
1056 1233
1057The @code{GNUNET_PEERSTORE_iterate} function returns a handle to the iterate operation. This 1234The @code{GNUNET_PEERSTORE_iterate} function returns a handle to the
1058handle can be used to cancel the iterate operation only before the callback function is called with 1235iterate operation. This handle can be used to cancel the iterate
1059a @code{NULL} record. 1236operation only before the callback function is called with a
1237@code{NULL} record.
1060 1238
1061@node Monitoring records 1239@node Monitoring records
1062@subsection Monitoring records 1240@subsection Monitoring records
1063 1241
1064PEERSTORE offers the functionality of monitoring for new records stored under a specific key 1242PEERSTORE offers the functionality of monitoring for new records
1065combination (subsystem, peerid, key). To start the monitoring, use the following function: 1243stored under a specific key combination (subsystem, peerid, key).
1244To start the monitoring, use the following function:
1245
1066@example 1246@example
1067@verbatiminclude tutorial-examples/015.c 1247@verbatiminclude tutorial-examples/015.c
1068@end example 1248@end example
1069 1249
1070Whenever a new record is stored under the given key combination, the @code{callback} function 1250@noindent
1071will be called with this new record. This will continue until the connection to the PEERSTORE service 1251Whenever a new record is stored under the given key combination,
1072is broken or the watch operation is canceled: 1252the @code{callback} function will be called with this new
1253record. This will continue until the connection to the PEERSTORE
1254service is broken or the watch operation is canceled:
1255
1073@example 1256@example
1074@verbatiminclude tutorial-examples/016.c 1257@verbatiminclude tutorial-examples/016.c
1075@end example 1258@end example
@@ -1077,15 +1260,18 @@ is broken or the watch operation is canceled:
1077@node Disconnecting from PEERSTORE 1260@node Disconnecting from PEERSTORE
1078@subsection Disconnecting from PEERSTORE 1261@subsection Disconnecting from PEERSTORE
1079 1262
1080When the connection to the PEERSTORE service is no longer needed, disconnect using the following 1263When the connection to the PEERSTORE service is no longer needed,
1081function: 1264disconnect using the following function:
1265
1082@example 1266@example
1083@verbatiminclude tutorial-examples/017.c 1267@verbatiminclude tutorial-examples/017.c
1084@end example 1268@end example
1085 1269
1086If the @code{sync_first} flag is set to @code{GNUNET_YES}, the API will delay the 1270@noindent
1087disconnection until all store requests are received by the PEERSTORE service. Otherwise, 1271If the @code{sync_first} flag is set to @code{GNUNET_YES},
1088it will disconnect immediately. 1272the API will delay the disconnection until all store requests
1273are received by the PEERSTORE service. Otherwise, it will
1274disconnect immediately.
1089 1275
1090@node Using the DHT 1276@node Using the DHT
1091@section Using the DHT 1277@section Using the DHT
@@ -1094,10 +1280,12 @@ The DHT allows to store data so other peers in the P2P network can
1094access it and retrieve data stored by any peers in the network. 1280access it and retrieve data stored by any peers in the network.
1095This section will explain how to use the DHT. Of course, the first 1281This section will explain how to use the DHT. Of course, the first
1096thing to do is to connect to the DHT service: 1282thing to do is to connect to the DHT service:
1283
1097@example 1284@example
1098@verbatiminclude tutorial-examples/018.c 1285@verbatiminclude tutorial-examples/018.c
1099@end example 1286@end example
1100 1287
1288@noindent
1101The second parameter indicates how many requests in parallel to expect. 1289The second parameter indicates how many requests in parallel to expect.
1102It is not a hard limit, but a good approximation will make the DHT more 1290It is not a hard limit, but a good approximation will make the DHT more
1103efficient. 1291efficient.
@@ -1113,27 +1301,32 @@ efficient.
1113@subsection Storing data in the DHT 1301@subsection Storing data in the DHT
1114Since the DHT is a dynamic environment (peers join and leave frequently) 1302Since the DHT is a dynamic environment (peers join and leave frequently)
1115the data that we put in the DHT does not stay there indefinitely. It is 1303the data that we put in the DHT does not stay there indefinitely. It is
1116important to ``refresh'' the data periodically by simply storing it again, 1304important to ``refresh'' the data periodically by simply storing it
1117in order to make sure other peers can access it. 1305again, in order to make sure other peers can access it.
1118 1306
1119The put API call offers a callback to signal that the PUT request has been 1307The put API call offers a callback to signal that the PUT request has been
1120sent. This does not guarantee that the data is accessible to others peers, 1308sent. This does not guarantee that the data is accessible to others peers,
1121or even that is has been stored, only that the service has requested to 1309or even that is has been stored, only that the service has requested to
1122a neighboring peer the retransmission of the PUT request towards its final 1310a neighboring peer the retransmission of the PUT request towards its final
1123destination. Currently there is no feedback about whether or not the data 1311destination. Currently there is no feedback about whether or not the data
1124has been sucessfully stored or where it has been stored. In order to improve 1312has been sucessfully stored or where it has been stored. In order to
1125the availablilty of the data and to compensate for possible errors, peers leaving 1313improve the availablilty of the data and to compensate for possible
1126and other unfavorable events, just make several PUT requests! 1314errors, peers leaving and other unfavorable events, just make several
1315PUT requests!
1316
1127@example 1317@example
1128@verbatiminclude tutorial-examples/019.c 1318@verbatiminclude tutorial-examples/019.c
1129@end example 1319@end example
1130 1320
1131Exercise: Store a value in the DHT periodically to make sure it is available 1321@noindent
1132over time. You might consider using the function @code{GNUNET\_SCHEDULER\_add\_delayed} 1322Exercise: Store a value in the DHT periodically to make sure it
1133and call @code{GNUNET\_DHT\_put} from inside a helper function. 1323is available over time. You might consider using the function
1324@code{GNUNET\_SCHEDULER\_add\_delayed} and call
1325@code{GNUNET\_DHT\_put} from inside a helper function.
1134 1326
1135@node Obtaining data from the DHT 1327@node Obtaining data from the DHT
1136@subsection Obtaining data from the DHT 1328@subsection Obtaining data from the DHT
1329
1137As we saw in the previous example, the DHT works in an asynchronous mode. 1330As we saw in the previous example, the DHT works in an asynchronous mode.
1138Each request to the DHT is executed ``in the background'' and the API 1331Each request to the DHT is executed ``in the background'' and the API
1139calls return immediately. In order to receive results from the DHT, the 1332calls return immediately. In order to receive results from the DHT, the
@@ -1143,16 +1336,20 @@ duplicates) until the timeout expires or we explicitly stop the request.
1143It is possible to give a ``forever'' timeout with 1336It is possible to give a ``forever'' timeout with
1144@code{GNUNET\_TIME\_UNIT\_FOREVER\_REL}. 1337@code{GNUNET\_TIME\_UNIT\_FOREVER\_REL}.
1145 1338
1146If we give a route option @code{GNUNET\_DHT\_RO\_RECORD\_ROUTE} the callback 1339If we give a route option @code{GNUNET\_DHT\_RO\_RECORD\_ROUTE}
1147will get a list of all the peers the data has travelled, both on the PUT 1340the callback will get a list of all the peers the data has travelled,
1148path and on the GET path. 1341both on the PUT path and on the GET path.
1342
1149@example 1343@example
1150@verbatiminclude tutorial-examples/020.c 1344@verbatiminclude tutorial-examples/020.c
1151@end example 1345@end example
1152 1346
1153Exercise: Store a value in the DHT and after a while retrieve it. Show the IDs of all 1347@noindent
1154the peers the requests have gone through. In order to convert a peer ID to a string, use 1348Exercise: Store a value in the DHT and after a while retrieve it.
1155the function @code{GNUNET\_i2s}. Pay attention to the route option parameters in both calls! 1349Show the IDs of all the peers the requests have gone through.
1350In order to convert a peer ID to a string, use the function
1351@code{GNUNET\_i2s}. Pay attention to the route option parameters
1352in both calls!
1156 1353
1157@node Implementing a block plugin 1354@node Implementing a block plugin
1158@subsection Implementing a block plugin 1355@subsection Implementing a block plugin
@@ -1187,10 +1384,12 @@ the @code{xquery} argument is application-specific. Applications that
1187do not use an extended query should check that the @code{xquery\_size} 1384do not use an extended query should check that the @code{xquery\_size}
1188is zero. The block group is typically used to filter duplicate 1385is zero. The block group is typically used to filter duplicate
1189replies. 1386replies.
1387
1190@example 1388@example
1191@verbatiminclude tutorial-examples/021.c 1389@verbatiminclude tutorial-examples/021.c
1192@end example 1390@end example
1193 1391
1392@noindent
1194Note that it is mandatory to detect duplicate replies in this function 1393Note that it is mandatory to detect duplicate replies in this function
1195and return the respective status code. Duplicate detection is 1394and return the respective status code. Duplicate detection is
1196typically done using the Bloom filter block group provided by 1395typically done using the Bloom filter block group provided by
@@ -1206,6 +1405,7 @@ function is used to obtain the key of a block --- for example, by
1206means of hashing. If deriving the key is not possible, the function 1405means of hashing. If deriving the key is not possible, the function
1207should simply return @code{GNUNET\_SYSERR} (the DHT will still work 1406should simply return @code{GNUNET\_SYSERR} (the DHT will still work
1208just fine with such blocks). 1407just fine with such blocks).
1408
1209@example 1409@example
1210@verbatiminclude tutorial-examples/022.c 1410@verbatiminclude tutorial-examples/022.c
1211@end example 1411@end example
@@ -1218,6 +1418,7 @@ an initialization function which should initialize the plugin. The
1218initialization function specifies what block types the plugin cares 1418initialization function specifies what block types the plugin cares
1219about and returns a struct with the functions that are to be used for 1419about and returns a struct with the functions that are to be used for
1220validation and obtaining keys (the ones just defined above). 1420validation and obtaining keys (the ones just defined above).
1421
1221@example 1422@example
1222@verbatiminclude tutorial-examples/023.c 1423@verbatiminclude tutorial-examples/023.c
1223@end example 1424@end example
@@ -1228,6 +1429,7 @@ validation and obtaining keys (the ones just defined above).
1228Following GNUnet's general plugin API concept, the plugin must 1429Following GNUnet's general plugin API concept, the plugin must
1229export a second function for cleaning up. It usually does very 1430export a second function for cleaning up. It usually does very
1230little. 1431little.
1432
1231@example 1433@example
1232@verbatiminclude tutorial-examples/024.c 1434@verbatiminclude tutorial-examples/024.c
1233@end example 1435@end example
@@ -1237,28 +1439,34 @@ little.
1237 1439
1238In order to compile the plugin, the @file{Makefile.am} file for the 1440In order to compile the plugin, the @file{Makefile.am} file for the
1239service SERVICE should contain a rule similar to this: 1441service SERVICE should contain a rule similar to this:
1240@c* Actually this is a Makefile not C. But the whole structure of examples 1442@c Actually this is a Makefile not C. But the whole structure of examples
1241@c* must be improved. 1443@c must be improved.
1444
1242@example 1445@example
1243@verbatiminclude tutorial-examples/025.c 1446@verbatiminclude tutorial-examples/025.c
1244@end example 1447@end example
1245 1448
1449@noindent
1246Exercise: Write a block plugin that accepts all queries 1450Exercise: Write a block plugin that accepts all queries
1247and all replies but prints information about queries and replies 1451and all replies but prints information about queries and replies
1248when the respective validation hooks are called. 1452when the respective validation hooks are called.
1249 1453
1250@node Monitoring the DHT 1454@node Monitoring the DHT
1251@subsection Monitoring the DHT 1455@subsection Monitoring the DHT
1252It is possible to monitor the functioning of the local DHT service. When monitoring 1456
1253the DHT, the service will alert the monitoring program of any events, 1457It is possible to monitor the functioning of the local
1254both started locally or received for routing from another peer. The are three different 1458DHT service. When monitoring the DHT, the service will
1255types of events possible: a GET request, a PUT request or a response (a reply to 1459alert the monitoring program of any events, both started
1256a GET). 1460locally or received for routing from another peer.
1257 1461The are three different types of events possible: a
1258Since the different events have different associated data, the API gets 3 1462GET request, a PUT request or a response (a reply to a GET).
1259different callbacks (one for each message type) and optional type and key parameters, 1463
1260to allow for filtering of messages. When an event happens, the appropiate callback 1464Since the different events have different associated data,
1261is called with all the information about the event. 1465the API gets 3 different callbacks (one for each message type)
1466and optional type and key parameters, to allow for filtering of
1467messages. When an event happens, the appropiate callback is
1468called with all the information about the event.
1469
1262@example 1470@example
1263@verbatiminclude tutorial-examples/026.c 1471@verbatiminclude tutorial-examples/026.c
1264@end example 1472@end example
@@ -1266,17 +1474,20 @@ is called with all the information about the event.
1266@node Debugging with gnunet-arm 1474@node Debugging with gnunet-arm
1267@section Debugging with gnunet-arm 1475@section Debugging with gnunet-arm
1268 1476
1269Even if services are managed by @command{gnunet-arm}, you can start them with 1477Even if services are managed by @command{gnunet-arm}, you can
1270@command{gdb} or @command{valgrind}. For example, you could add the following lines 1478start them with @command{gdb} or @command{valgrind}. For
1271to your configuration file to start the DHT service in a @command{gdb} session in a 1479example, you could add the following lines to your
1272fresh @command{xterm}: 1480configuration file to start the DHT service in a @command{gdb}
1481session in a fresh @command{xterm}:
1273 1482
1274@example 1483@example
1275[dht] 1484[dht]
1276PREFIX=xterm -e gdb --args 1485PREFIX=xterm -e gdb --args
1277@end example 1486@end example
1278 1487
1279Alternatively, you can stop a service that was started via ARM and run it manually: 1488@noindent
1489Alternatively, you can stop a service that was started via
1490ARM and run it manually:
1280 1491
1281@example 1492@example
1282$ gnunet-arm -k dht 1493$ gnunet-arm -k dht
@@ -1284,20 +1495,23 @@ $ gdb --args gnunet-service-dht -L DEBUG
1284$ valgrind gnunet-service-dht -L DEBUG 1495$ valgrind gnunet-service-dht -L DEBUG
1285@end example 1496@end example
1286 1497
1287Assuming other services are well-written, they will automatically re-integrate the 1498@noindent
1288restarted service with the peer. 1499Assuming other services are well-written, they will automatically
1500re-integrate the restarted service with the peer.
1289 1501
1290GNUnet provides a powerful logging mechanism providing log levels @code{ERROR}, 1502GNUnet provides a powerful logging mechanism providing log
1291@code{WARNING}, @code{INFO} and @code{DEBUG}. The current log level is 1503levels @code{ERROR}, @code{WARNING}, @code{INFO} and @code{DEBUG}.
1292configured using the @code{$GNUNET_FORCE_LOG} environmental variable. 1504The current log level is configured using the @code{$GNUNET_FORCE_LOG}
1293The @code{DEBUG} level is only available if @command{--enable-logging=verbose} was used when 1505environmental variable. The @code{DEBUG} level is only available if
1294running @command{configure}. More details about logging can be found under 1506@command{--enable-logging=verbose} was used when running
1507@command{configure}. More details about logging can be found under
1295@uref{https://gnunet.org/logging}. 1508@uref{https://gnunet.org/logging}.
1296 1509
1297You should also probably enable the creation of core files, by setting 1510You should also probably enable the creation of core files, by setting
1298@code{ulimit}, and echo'ing @code{1} into @file{/proc/sys/kernel/core\_uses\_pid}. 1511@code{ulimit}, and echo'ing @code{1} into
1299Then you can investigate the core dumps with @command{gdb}, which is often 1512@file{/proc/sys/kernel/core\_uses\_pid}. Then you can investigate the
1300the fastest method to find simple errors. 1513core dumps with @command{gdb}, which is often the fastest method to
1514find simple errors.
1301 1515
1302Exercise: Add a memory leak to your service and obtain a trace 1516Exercise: Add a memory leak to your service and obtain a trace
1303pointing to the leak using @command{valgrind} while running the service 1517pointing to the leak using @command{valgrind} while running the service
diff --git a/doc/gnunet.texi b/doc/documentation/gnunet.texi
index 7803e52d3..2497d4b09 100644
--- a/doc/gnunet.texi
+++ b/doc/documentation/gnunet.texi
@@ -5,15 +5,17 @@
5@setfilename gnunet.info 5@setfilename gnunet.info
6@documentencoding UTF-8 6@documentencoding UTF-8
7@settitle GNUnet Reference Manual 7@settitle GNUnet Reference Manual
8@exampleindent 2
9@urefbreakstyle before
8@c %**end of header 10@c %**end of header
9 11
10@include version.texi 12@include version.texi
11 13
12@c Set Versions which might be used in more than one place: 14@c Set Versions which might be used in more than one place:
13@set GNUNET-DIST-URL https://ftp.gnu.org/gnu/gnunet/ 15@set GNUFTP-URL https://ftp.gnu.org/gnu/gnunet
14@set GNUNET-VERSION 0.10.1 16@set PYPI-URL https://pypi.python.org/packages/source
15@set GNURL-VERSION-CURRENT 7.55.1 17@set GNURL-VERSION-CURRENT 7.55.1
16@set GNURL-DIST-URL https://gnunet.org/sites/default/files/ 18@set GNUNET-DIST-URL https://gnunet.org/sites/default/files/
17@c @set OPENPGP-SIGNING-KEY-ID 19@c @set OPENPGP-SIGNING-KEY-ID
18 20
19@copying 21@copying
@@ -38,6 +40,13 @@ A copy of the license is also available from the Free Software
38Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}. 40Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
39@end copying 41@end copying
40 42
43@c TODO: Improve this and improve https://directory.fsf.org/wiki/Gnunet
44
45@dircategory Networking
46@direntry
47* GNUnet: (gnunet). Framework for secure peer-to-peer networking
48@end direntry
49
41@titlepage 50@titlepage
42@title GNUnet Reference Manual 51@title GNUnet Reference Manual
43@subtitle Installing, configuring, using and contributing to GNUnet 52@subtitle Installing, configuring, using and contributing to GNUnet
@@ -51,26 +60,27 @@ Edition @value{EDITION} @*
51@insertcopying 60@insertcopying
52@end titlepage 61@end titlepage
53 62
63@summarycontents
54@contents 64@contents
55@c ********************************************************************* 65
56@node Top 66@node Top
57@top Contributing to GNUnet 67@top Contributing to GNUnet
58@c ********************************************************************* 68
59 69
60This document describes GNUnet version @value{VERSION}. 70This document describes GNUnet version @value{VERSION}.
61 71
62 72
63GNUnet is a @uref{http://www.gnu.org/, GNU} package. All code contributions 73GNUnet is a @uref{http://www.gnu.org/, GNU} package.
64must thus be put under the 74All code contributions must thus be put under the
65@uref{http://www.gnu.org/copyleft/gpl.html, GNU Public License (GPL)}. 75@uref{http://www.gnu.org/copyleft/gpl.html, GNU Public License (GPL)}.
66All documentation should be put under FSF approved licenses 76All documentation should be put under FSF approved licenses
67(see @uref{http://www.gnu.org/copyleft/fdl.html, fdl}). 77(see @uref{http://www.gnu.org/copyleft/fdl.html, fdl}).
68 78
69By submitting documentation, translations, comments and other content to this 79By submitting documentation, translations, comments and other
70website you automatically grant the right to publish code under the 80content to this website you automatically grant the right to publish
71GNU Public License and documentation under either or both the GNU 81code under the GNU Public License and documentation under either or
72Public License or the GNU Free Documentation License. When contributing 82both the GNU Public License or the GNU Free Documentation License.
73to the GNUnet project, GNU standards and the 83When contributing to the GNUnet project, GNU standards and the
74@uref{http://www.gnu.org/philosophy/philosophy.html, GNU philosophy} 84@uref{http://www.gnu.org/philosophy/philosophy.html, GNU philosophy}
75should be adhered to. 85should be adhered to.
76 86
@@ -83,23 +93,25 @@ rights, and in particular is allowed to dual-license the code. You
83retain non-exclusive rights to your contributions, so you can also 93retain non-exclusive rights to your contributions, so you can also
84share your contributions freely with other projects. 94share your contributions freely with other projects.
85 95
86GNUnet e.V. will publish all accepted contributions under the GPLv3 or any 96GNUnet e.V. will publish all accepted contributions under the GPLv3
87later version. The association may decide to publish contributions under 97or any later version. The association may decide to publish
88additional licenses (dual-licensing). 98contributions under additional licenses (dual-licensing).
89 99
90We do not intentionally remove your name from your contributions; however, 100We do not intentionally remove your name from your contributions;
91due to extensive editing it is not always trivial to attribute contributors 101however, due to extensive editing it is not always trivial to
92properly. If you find that you significantly contributed to a file (or the 102attribute contributors properly. If you find that you significantly
93project as a whole) and are not listed in the respective authors file or 103contributed to a file (or the project as a whole) and are not listed
94section, please do let us know. 104in the respective authors file or section, please do let us know.
95 105
96 106
97 107
98@menu 108@menu
99 109
100* Philosophy:: About GNUnet 110* Philosophy:: About GNUnet
111* Vocabulary:: Vocabulary
101* GNUnet Installation Handbook:: How to install GNUnet 112* GNUnet Installation Handbook:: How to install GNUnet
102* Using GNUnet:: Using GNUnet 113* Using GNUnet:: Using GNUnet
114* Configuration Handbook:: Configuring GNUnet
103* GNUnet Developer Handbook:: Developing GNUnet 115* GNUnet Developer Handbook:: Developing GNUnet
104* GNU Free Documentation License:: The license of this manual. 116* GNU Free Documentation License:: The license of this manual.
105* GNU General Public License:: The license of this manual. 117* GNU General Public License:: The license of this manual.
@@ -127,10 +139,77 @@ Philosophy
127* Backup of Identities and Egos:: 139* Backup of Identities and Egos::
128* Revocation:: 140* Revocation::
129 141
130Installation 142Vocabulary
143
144* Words and characters::
145* Technical Assumptions::
146
147GNUnet Installation Handbook
131 148
132* Dependencies:: 149* Dependencies::
133* External dependencies:: 150* Pre-installation notes::
151* Generic installation instructions::
152* Build instructions for Ubuntu 12.04 using Git::
153* Build Instructions for Microsoft Windows Platforms::
154* Build instructions for Debian 7.5::
155* Installing GNUnet from Git on Ubuntu 14.4::
156* Build instructions for Debian 8::
157* Outdated build instructions for previous revisions::
158@c * Portable GNUnet::
159* The graphical configuration interface::
160* How to start and stop a GNUnet peer::
161
162Configuration Handbook
163
164Using GNUnet
165
166* Checking the Installation::
167* First steps - File-sharing::
168* First steps - Using the GNU Name System::
169* First steps - Using GNUnet Conversation::
170* First steps - Using the GNUnet VPN::
171* File-sharing::
172* The GNU Name System::
173* Using the Virtual Public Network::
174
175GNUnet Developer Handbook
176
177* Developer Introduction::
178* Code overview::
179* System Architecture::
180* Subsystem stability::
181* Naming conventions and coding style guide::
182* Build-system::
183* Developing extensions for GNUnet using the gnunet-ext template::
184* Writing testcases::
185* GNUnet's TESTING library::
186* Performance regression analysis with Gauger::
187* GNUnet's TESTBED Subsystem::
188* libgnunetutil::
189* The Automatic Restart Manager (ARM)::
190* GNUnet's TRANSPORT Subsystem::
191* NAT library::
192* Distance-Vector plugin::
193* SMTP plugin::
194* Bluetooth plugin::
195* WLAN plugin::
196* The ATS Subsystem::
197* GNUnet's CORE Subsystem::
198* GNUnet's CADET subsystem::
199* GNUnet's NSE subsystem::
200* GNUnet's HOSTLIST subsystem::
201* GNUnet's IDENTITY subsystem::
202* GNUnet's NAMESTORE Subsystem::
203* GNUnet's PEERINFO subsystem::
204* GNUnet's PEERSTORE subsystem::
205* GNUnet's SET Subsystem::
206* GNUnet's STATISTICS subsystem::
207* GNUnet's Distributed Hash Table (DHT)::
208* The GNU Name System (GNS)::
209* The GNS Namecache::
210* The REVOCATION Subsystem::
211* GNUnet's File-sharing (FS) Subsystem::
212* GNUnet's REGEX Subsystem::
134 213
135@end detailmenu 214@end detailmenu
136@end menu 215@end menu
@@ -139,6 +218,8 @@ Installation
139@include chapters/philosophy.texi 218@include chapters/philosophy.texi
140@c ********************************************************************* 219@c *********************************************************************
141 220
221@include chapters/vocabulary.texi
222
142@c ********************************************************************* 223@c *********************************************************************
143@include chapters/installation.texi 224@include chapters/installation.texi
144@c ********************************************************************* 225@c *********************************************************************
@@ -147,11 +228,13 @@ Installation
147@include chapters/user.texi 228@include chapters/user.texi
148@c ********************************************************************* 229@c *********************************************************************
149 230
231@include chapters/configuration.texi
232
150@c ********************************************************************* 233@c *********************************************************************
151@include chapters/developer.texi 234@include chapters/developer.texi
235@c @include gnunet-c-tutorial.texi
152@c ********************************************************************* 236@c *********************************************************************
153 237
154
155@c ********************************************************************* 238@c *********************************************************************
156@node GNU Free Documentation License 239@node GNU Free Documentation License
157@appendix GNU Free Documentation License 240@appendix GNU Free Documentation License
diff --git a/doc/gpl-3.0.texi b/doc/documentation/gpl-3.0.texi
index 0e2e212ac..0e2e212ac 100644
--- a/doc/gpl-3.0.texi
+++ b/doc/documentation/gpl-3.0.texi
diff --git a/doc/documentation/htmlxref.cnf b/doc/documentation/htmlxref.cnf
new file mode 100644
index 000000000..9ab9e4158
--- /dev/null
+++ b/doc/documentation/htmlxref.cnf
@@ -0,0 +1,668 @@
1# htmlxref.cnf - reference file for free Texinfo manuals on the web.
2# Modified by Ludovic Courtès <ludo@gnu.org> for the GNU Guix manual.
3# Modified by ng0 <ng0@gnunet.org> for the GNUnet manual.
4
5htmlxrefversion=2017-10-25.16; # UTC
6
7# Copyright 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
8#
9# Copying and distribution of this file, with or without modification,
10# are permitted in any medium without royalty provided the copyright
11# notice and this notice are preserved.
12#
13# The latest version of this file is available at
14# http://ftpmirror.gnu.org/texinfo/htmlxref.cnf.
15# Email corrections or additions to bug-texinfo@gnu.org.
16# The primary goal is to list all relevant GNU manuals;
17# other free manuals are also welcome.
18#
19# To be included in this list, a manual must:
20#
21# - have a generic url, e.g., no version numbers;
22# - have a unique file name (e.g., manual identifier), i.e., be related to the
23# package name. Things like "refman" or "tutorial" don't work.
24# - follow the naming convention for nodes described at
25# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref.html
26# This is what makeinfo and texi2html implement.
27#
28# Unless the above criteria are met, it's not possible to generate
29# reliable cross-manual references.
30#
31# For information on automatically generating all the useful formats for
32# a manual to put on the web, see
33# http://www.gnu.org/prep/maintain/html_node/Manuals-on-Web-Pages.html.
34
35# For people editing this file: when a manual named foo is related to a
36# package named bar, the url should contain a variable reference ${BAR}.
37# Otherwise, the gnumaint scripts have no way of knowing they are
38# associated, and thus gnu.org/manual can't include them.
39
40# shorten references to manuals on www.gnu.org.
41G = https://www.gnu.org
42GS = ${G}/software
43
443dldf mono ${GS}/3dldf/manual/user_ref/3DLDF.html
453dldf node ${GS}/3dldf/manual/user_ref/
46
47alive mono ${GS}/alive/manual/alive.html
48alive node ${GS}/alive/manual/html_node/
49
50anubis chapter ${GS}/anubis/manual/html_chapter/
51anubis section ${GS}/anubis/manual/html_section/
52anubis node ${GS}/anubis/manual/html_node/
53
54artanis mono ${GS}/artanis/manual/artanis.html
55artanis node ${GS}/artanis/manual/html_node/
56
57aspell section http://aspell.net/man-html/index.html
58
59auctex mono ${GS}/auctex/manual/auctex.html
60auctex node ${GS}/auctex/manual/auctex/
61
62autoconf mono ${GS}/autoconf/manual/autoconf.html
63autoconf node ${GS}/autoconf/manual/html_node/
64
65autogen mono ${GS}/autogen/manual/html_mono/autogen.html
66autogen chapter ${GS}/autogen/manual/html_chapter/
67autogen node ${GS}/autoconf/manual/html_node/
68
69automake mono ${GS}/automake/manual/automake.html
70automake node ${GS}/automake/manual/html_node/
71
72avl node http://www.stanford.edu/~blp/avl/libavl.html/
73
74bash mono ${GS}/bash/manual/bash.html
75bash node ${GS}/bash/manual/html_node/
76
77BINUTILS = http://sourceware.org/binutils/docs
78binutils node ${BINUTILS}/binutils/
79 as node ${BINUTILS}/as/
80 bfd node ${BINUTILS}/bfd/
81 gprof node ${BINUTILS}/gprof/
82 ld node ${BINUTILS}/ld/
83
84bison mono ${GS}/bison/manual/bison.html
85bison node ${GS}/bison/manual/html_node/
86
87bpel2owfn mono ${GS}/bpel2owfn/manual/2.0.x/bpel2owfn.html
88
89ccd2cue mono ${GS}/ccd2cue/manual/ccd2cue.html
90ccd2cue node ${GS}/ccd2cue/manual/html_node/
91
92cflow mono ${GS}/cflow/manual/cflow.html
93cflow node ${GS}/cflow/manual/html_node/
94
95chess mono ${GS}/chess/manual/gnuchess.html
96chess node ${GS}/chess/manual/html_node/
97
98combine mono ${GS}/combine/manual/combine.html
99combine chapter ${GS}/combine/manual/html_chapter/
100combine section ${GS}/combine/manual/html_section/
101combine node ${GS}/combine/manual/html_node/
102
103complexity mono ${GS}/complexity/manual/complexity.html
104complexity node ${GS}/complexity/manual/html_node/
105
106coreutils mono ${GS}/coreutils/manual/coreutils
107coreutils node ${GS}/coreutils/manual/html_node/
108
109cpio mono ${GS}/cpio/manual/cpio
110cpio node ${GS}/cpio/manual/html_node/
111
112cssc node ${GS}/cssc/manual/
113
114#cvs cannot be handled here; see http://ximbiot.com/cvs/manual.
115
116ddd mono ${GS}/ddd/manual/html_mono/ddd.html
117
118ddrescue mono ${GS}/ddrescue/manual/ddrescue_manual.html
119
120DICO = http://puszcza.gnu.org.ua/software/dico/manual
121dico mono ${DICO}/dico.html
122dico chapter ${DICO}/html_chapter/
123dico section ${DICO}/html_section/
124dico node ${DICO}/html_node/
125
126diffutils mono ${GS}/diffutils/manual/diffutils
127diffutils node ${GS}/diffutils/manual/html_node/
128
129ed mono ${GS}/ed/manual/ed_manual.html
130
131EMACS = ${GS}/emacs/manual
132emacs mono ${EMACS}/html_mono/emacs.html
133emacs node ${EMACS}/html_node/emacs/
134 #
135 ada-mode mono ${EMACS}/html_mono/ada-mode.html
136 ada-mode node ${EMACS}/html_node/ada-mode/
137 #
138 autotype mono ${EMACS}/html_mono/autotype.html
139 autotype node ${EMACS}/html_node/autotype/
140 #
141 ccmode mono ${EMACS}/html_mono/ccmode.html
142 ccmode node ${EMACS}/html_node/ccmode/
143 #
144 cl mono ${EMACS}/html_mono/cl.html
145 cl node ${EMACS}/html_node/cl/
146 #
147 ebrowse mono ${EMACS}/html_mono/ebrowse.html
148 ebrowse node ${EMACS}/html_node/ebrowse/
149 #
150 ediff mono ${EMACS}/html_mono/ediff.html
151 ediff node ${EMACS}/html_node/ediff/
152 #
153 eieio mono ${EMACS}/html_mono/eieio.html
154 eieio node ${EMACS}/html_node/eieio/
155 #
156 elisp mono ${EMACS}/html_mono/elisp.html
157 elisp node ${EMACS}/html_node/elisp/
158 #
159 epa mono ${EMACS}/html_mono/epa.html
160 epa node ${EMACS}/html_node/epa/
161 #
162 erc mono ${EMACS}/html_mono/erc.html
163 erc node ${EMACS}/html_node/erc/
164 #
165 dired-x mono ${EMACS}/html_mono/dired-x.html
166 dired-x node ${EMACS}/html_node/dired-x/
167 #
168 eshell mono ${EMACS}/html_mono/eshell.html
169 eshell node ${EMACS}/html_node/eshell/
170 #
171 flymake mono ${EMACS}/html_mono/flymake.html
172 flymake node ${EMACS}/html_node/flymake/
173 #
174 gnus mono ${EMACS}/html_mono/gnus.html
175 gnus node ${EMACS}/html_node/gnus/
176 #
177 idlwave mono ${EMACS}/html_mono/idlwave.html
178 idlwave node ${EMACS}/html_node/idlwave/
179 #
180 message mono ${EMACS}/html_mono/message.html
181 message node ${EMACS}/html_node/message/
182 #
183 mh-e mono ${EMACS}/html_mono/mh-e.html
184 mh-e node ${EMACS}/html_node/mh-e/
185 #
186 nxml-mode mono ${EMACS}/html_mono/nxml-mode.html
187 nxml-mode node ${EMACS}/html_node/nxml-mode/
188 #
189 org mono ${EMACS}/html_mono/org.html
190 org node ${EMACS}/html_node/org/
191 #
192 pcl-cvs mono ${EMACS}/html_mono/pcl-cvs.html
193 pcl-cvs node ${EMACS}/html_node/pcl-cvs/
194 #
195 rcirc mono ${EMACS}/html_mono/rcirc.html
196 rcirc node ${EMACS}/html_node/rcirc/
197 #
198 semantic mono ${EMACS}/html_mono/semantic.html
199 semantic node ${EMACS}/html_node/semantic/
200 #
201 smtp mono ${EMACS}/html_mono/smtpmail.html
202 smtp node ${EMACS}/html_node/smtpmail/
203 #
204 speedbar mono ${EMACS}/html_mono/speedbar.html
205 speedbar node ${EMACS}/html_node/speedbar/
206 #
207 tramp mono ${EMACS}/html_mono/tramp.html
208 tramp node ${EMACS}/html_node/tramp/
209 #
210 vip mono ${EMACS}/html_mono/vip.html
211 vip node ${EMACS}/html_node/vip/
212 #
213 viper mono ${EMACS}/html_mono/viper.html
214 viper node ${EMACS}/html_node/viper/
215 #
216 woman mono ${EMACS}/html_mono/woman.html
217 woman node ${EMACS}/html_node/woman/
218 # (end emacs manuals)
219
220easejs mono ${GS}/easejs/manual/easejs.html
221easejs node ${GS}/easejs/manual/
222
223EMACS_GUIX = https://alezost.github.io/guix.el/manual/latest
224emacs-guix mono ${EMACS_GUIX}/emacs-guix.html
225emacs-guix node ${EMACS_GUIX}/html_node/
226
227emacs-muse node ${GS}/emacs-muse/manual/muse.html
228emacs-muse node ${GS}/emacs-muse/manual/html_node/
229
230emms node ${GS}/emms/manual/
231
232# The file is called 'find.info' but the package is 'findutils'.
233find mono ${GS}/findutils/manual/html_mono/find.html
234find node ${GS}/findutils/manual/html_node/find_html
235findutils mono ${GS}/findutils/manual/html_mono/find.html
236findutils node ${GS}/findutils/manual/html_node/find_html
237
238FLEX = http://flex.sourceforge.net
239flex node ${FLEX}/manual/
240
241gama mono ${GS}/gama/manual/gama.html
242gama node ${GS}/gama/manual/html_node/
243
244GAWK = ${GS}/gawk/manual
245gawk mono ${GAWK}/gawk.html
246gawk node ${GAWK}/html_node/
247 gawkinet mono ${GAWK}/gawkinet/gawkinet.html
248 gawkinet node ${GAWK}/gawkinet/html_node/
249
250gcal mono ${GS}/gcal/manual/gcal.html
251gcal node ${GS}/gcal/manual/html_node/
252
253GCC = http://gcc.gnu.org/onlinedocs
254gcc node ${GCC}/gcc/
255 cpp node ${GCC}/cpp/
256 gcj node ${GCC}/gcj/
257 gfortran node ${GCC}/gfortran/
258 gnat_rm node ${GCC}/gnat_rm/
259 gnat_ugn_unw node ${GCC}/gnat_ugn_unw/
260 libgomp node ${GCC}/libgomp/
261 libstdc++ node ${GCC}/libstdc++/
262 #
263 gccint node ${GCC}/gccint/
264 cppinternals node ${GCC}/cppinternals/
265 gfc-internals node ${GCC}/gfc-internals/
266 gnat-style node ${GCC}/gnat-style/
267 libiberty node ${GCC}/libiberty/
268
269GDB = http://sourceware.org/gdb/current/onlinedocs
270gdb node ${GDB}/gdb/
271 stabs node ${GDB}/stabs/
272
273GDBM = http://www.gnu.org.ua/software/gdbm/manual
274gdbm mono ${GDBM}/gdbm.html
275gdbm chapter ${GDBM}/html_chapter/
276gdbm section ${GDBM}/html_section/
277gdbm node ${GDBM}/html_node/
278
279gettext mono ${GS}/gettext/manual/gettext.html
280gettext node ${GS}/gettext/manual/html_node/
281
282gforth node http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/
283
284global mono ${GS}/global/manual/global.html
285
286gmediaserver node ${GS}/gmediaserver/manual/
287
288gmp node http://www.gmplib.org/manual/
289
290gnu-arch node ${GS}/gnu-arch/tutorial/
291
292gnu-c-manual mono ${GS}/gnu-c-manual/gnu-c-manual.html
293
294gnu-crypto node ${GS}/gnu-crypto/manual/
295
296gnubg mono ${GS}/gnubg/manual/gnubg.html
297gnubg node ${GS}/gnubg/manual/html_node/
298
299gnubik mono ${GS}/gnubik/manual/gnubik.html
300gnubik node ${GS}/gnubik/manual/html_node/
301
302gnulib mono ${GS}/gnulib/manual/gnulib.html
303gnulib node ${GS}/gnulib/manual/html_node/
304
305GNUN = ${GS}/trans-coord/manual
306gnun mono ${GNUN}/gnun/gnun.html
307gnun node ${GNUN}/gnun/html_node/
308 web-trans mono ${GNUN}/web-trans/web-trans.html
309 web-trans node ${GNUN}/web-trans/html_node/
310
311GNUNET = https://docs.gnunet.org/manuals
312gnunet node ${GNUNET}/gnunet/
313 gnunet-c-tutorial node ${GNUNET}/gnunet-c-tutorial/
314 gnunet-java-tutorial node ${GNUNET}/gnunet-java-tutorial/
315
316GNUPG = http://www.gnupg.org/documentation/manuals
317gnupg node ${GNUPG}/gnupg/
318 dirmngr node ${GNUPG}/dirmngr/
319 gcrypt node ${GNUPG}/gcrypt/
320 libgcrypt node ${GNUPG}/gcrypt/
321 ksba node ${GNUPG}/ksba/
322 assuan node ${GNUPG}/assuan/
323 gpgme node ${GNUPG}/gpgme/
324
325gnuprologjava node ${GS}/gnuprologjava/manual/
326
327gnuschool mono ${GS}/gnuschool/gnuschool.html
328
329GNUSTANDARDS = ${G}/prep
330 maintain mono ${GNUSTANDARDS}/maintain/maintain.html
331 maintain node ${GNUSTANDARDS}/maintain/html_node/
332 #
333 standards mono ${GNUSTANDARDS}/standards/standards.html
334 standards node ${GNUSTANDARDS}/standards/html_node/
335
336gnutls mono http://gnutls.org/manual/gnutls.html
337gnutls node http://gnutls.org/manual/html_node/
338
339gnutls-guile mono http://gnutls.org/manual/gnutls-guile.html
340gnutls-guile node http://gnutls.org/manual/gnutls-guile/
341
342gperf mono ${GS}/gperf/manual/gperf.html
343gperf node ${GS}/gperf/manual/html_node/
344
345grep mono ${GS}/grep/manual/grep.html
346grep node ${GS}/grep/manual/html_node/
347
348groff node ${GS}/groff/manual/html_node/
349
350GRUB = ${GS}/grub/manual
351 grub mono ${GRUB}/grub.html
352 grub node ${GRUB}/html_node/
353 #
354 multiboot mono ${GRUB}/multiboot/multiboot.html
355 multiboot node ${GRUB}/multiboot/html_node/
356
357gsasl mono ${GS}/gsasl/manual/gsasl.html
358gsasl node ${GS}/gsasl/manual/html_node/
359
360gsl node ${GS}/gsl/manual/html_node/
361
362gsrc mono ${GS}/gsrc/manual/gsrc.html
363gsrc node ${GS}/gsrc/manual/html_node/
364
365gss mono ${GS}/gss/manual/gss.html
366gss node ${GS}/gss/manual/html_node/
367
368gtypist mono ${GS}/gtypist/doc/
369
370guile mono ${GS}/guile/manual/guile.html
371guile node ${GS}/guile/manual/html_node/
372
373guile-avahi mono http://nongnu.org/guile-avahi/doc/guile-avahi.html
374
375GUILE_GNOME = ${GS}/guile-gnome/docs
376 gobject node ${GUILE_GNOME}/gobject/html/
377 glib node ${GUILE_GNOME}/glib/html/
378 atk node ${GUILE_GNOME}/atk/html/
379 pango node ${GUILE_GNOME}/pango/html/
380 pangocairo node ${GUILE_GNOME}/pangocairo/html/
381 gdk node ${GUILE_GNOME}/gdk/html/
382 gtk node ${GUILE_GNOME}/gtk/html/
383 libglade node ${GUILE_GNOME}/libglade/html/
384 gnome-vfs node ${GUILE_GNOME}/gnome-vfs/html/
385 libgnomecanvas node ${GUILE_GNOME}/libgnomecanvas/html/
386 gconf node ${GUILE_GNOME}/gconf/html/
387 libgnome node ${GUILE_GNOME}/libgnome/html/
388 libgnomeui node ${GUILE_GNOME}/libgnomeui/html/
389 corba node ${GUILE_GNOME}/corba/html/
390 clutter node ${GUILE_GNOME}/clutter/html/
391 clutter-glx node ${GUILE_GNOME}/clutter-glx/html/
392
393guile-gtk node ${GS}/guile-gtk/docs/guile-gtk/
394
395guile-rpc mono ${GS}/guile-rpc/manual/guile-rpc.html
396guile-rpc node ${GS}/guile-rpc/manual/html_node/
397
398guix mono ${GS}/guix/manual/guix.html
399guix node ${GS}/guix/manual/html_node/
400
401gv mono ${GS}/gv/manual/gv.html
402gv node ${GS}/gv/manual/html_node/
403
404gzip mono ${GS}/gzip/manual/gzip.html
405gzip node ${GS}/gzip/manual/html_node/
406
407hello mono ${GS}/hello/manual/hello.html
408hello node ${GS}/hello/manual/html_node/
409
410help2man mono ${GS}/help2man/help2man.html
411
412idutils mono ${GS}/idutils/manual/idutils.html
413idutils node ${GS}/idutils/manual/html_node/
414
415inetutils mono ${GS}/inetutils/manual/inetutils.html
416inetutils node ${GS}/inetutils/manual/html_node/
417
418jwhois mono ${GS}/jwhois/manual/jwhois.html
419jwhois node ${GS}/jwhois/manual/html_node/
420
421libc mono ${GS}/libc/manual/html_mono/libc.html
422libc node ${GS}/libc/manual/html_node/
423
424LIBCDIO = ${GS}/libcdio
425 libcdio mono ${LIBCDIO}/libcdio.html
426 cd-text mono ${LIBCDIO}/cd-text-format.html
427
428libextractor mono ${GS}/libextractor/manual/libextractor.html
429libextractor node ${GS}/libextractor/manual/html_node/
430
431libidn mono ${GS}/libidn/manual/libidn.html
432libidn node ${GS}/libidn/manual/html_node/
433
434librejs mono ${GS}/librejs/manual/librejs.html
435librejs node ${GS}/librejs/manual/html_node/
436
437libmatheval mono ${GS}/libmatheval/manual/libmatheval.html
438
439LIBMICROHTTPD = ${GS}/libmicrohttpd
440libmicrohttpd mono ${LIBMICROHTTPD}/manual/libmicrohttpd.html
441libmicrohttpd node ${LIBMICROHTTPD}/manual/html_node/
442 microhttpd-tutorial mono ${LIBMICROHTTPD}/tutorial.html
443
444libtasn1 mono ${GS}/libtasn1/manual/libtasn1.html
445libtasn1 node ${GS}/libtasn1/manual/html_node/
446
447libtool mono ${GS}/libtool/manual/libtool.html
448libtool node ${GS}/libtool/manual/html_node/
449
450lightning mono ${GS}/lightning/manual/lightning.html
451lightning node ${GS}/lightning/manual/html_node/
452
453# The stable/ url redirects immediately, but that's ok.
454# The .html extension is omitted on their web site, but it works if given.
455LILYPOND = http://lilypond.org/doc/stable/Documentation
456 lilypond-internals node ${LILYPOND}/internals/
457 lilypond-learning node ${LILYPOND}/learning/
458 lilypond-notation node ${LILYPOND}/notation/
459 lilypond-snippets node ${LILYPOND}/snippets/
460 lilypond-usage node ${LILYPOND}/usage/
461 lilypond-web node ${LILYPOND}/web/
462 music-glossary node ${LILYPOND}/music-glossary/
463
464liquidwar6 mono ${GS}/liquidwar6/manual/liquidwar6.html
465liquidwar6 node ${GS}/liquidwar6/manual/html_node/
466
467lispintro mono ${GS}/emacs/emacs-lisp-intro/html_mono/emacs-lisp-intro.html
468lispintro node ${GS}/emacs/emacs-lisp-intro/html_node/index.html
469
470LSH = http://www.lysator.liu.se/~nisse/lsh
471 lsh mono ${LSH}/lsh.html
472
473m4 mono ${GS}/m4/manual/m4.html
474m4 node ${GS}/m4/manual/html_node/
475
476mailutils mono ${GS}/mailutils/manual/mailutils.html
477mailutils chapter ${GS}/mailutils/manual/html_chapter/
478mailutils section ${GS}/mailutils/manual/html_section/
479mailutils node ${GS}/mailutils/manual/html_node/
480
481make mono ${GS}/make/manual/make.html
482make node ${GS}/make/manual/html_node/
483
484mcron mono ${GS}/mcron/manual/mcron.html
485mcron node ${GS}/mcron/manual/html_node/
486
487mdk mono ${GS}/mdk/manual/mdk.html
488mdk node ${GS}/mdk/manual/html_node/
489
490METAEXCHANGE = http://ftp.gwdg.de/pub/gnu2/iwfmdh/doc/texinfo
491 iwf_mh node ${METAEXCHANGE}/iwf_mh.html
492 scantest node ${METAEXCHANGE}/scantest.html
493
494MIT_SCHEME = ${GS}/mit-scheme/documentation
495 mit-scheme-ref node ${MIT_SCHEME}/mit-scheme-ref/
496 mit-scheme-user node ${MIT_SCHEME}/mit-scheme-user/
497 sos node ${MIT_SCHEME}/mit-scheme-sos/
498 mit-scheme-imail node ${MIT_SCHEME}/mit-scheme-imail/
499
500moe mono ${GS}/moe/manual/moe_manual.html
501
502motti node ${GS}/motti/manual/
503
504mpc node http://www.multiprecision.org/index.php?prog=mpc&page=html
505
506mpfr mono http://www.mpfr.org/mpfr-current/mpfr.html
507
508mtools mono ${GS}/mtools/manual/mtools.html
509
510myserver node http://www.myserverproject.net/documentation/
511
512nano mono http://www.nano-editor.org/dist/latest/nano.html
513
514nettle chapter http://www.lysator.liu.se/~nisse/nettle/nettle.html
515
516ocrad mono ${GS}/ocrad/manual/ocrad_manual.html
517
518parted mono ${GS}/parted/manual/parted.html
519parted node ${GS}/parted/manual/html_node/
520
521pascal mono http://www.gnu-pascal.de/gpc/
522
523# can't use pcb since url's contain dates --30nov10
524
525perl mono ${GS}/perl/manual/perldoc-all.html
526
527PIES = http://www.gnu.org.ua/software/pies/manual
528pies mono ${PIES}/pies.html
529pies chapter ${PIES}/html_chapter/
530pies section ${PIES}/html_section/
531pies node ${PIES}/html_node/
532
533plotutils mono ${GS}/plotutils/manual/en/plotutils.html
534plotutils node ${GS}/plotutils/manual/en/html_node/
535
536proxyknife mono ${GS}/proxyknife/manual/proxyknife.html
537proxyknife node ${GS}/proxyknife/manual/html_node/
538
539pspp mono ${GS}/pspp/manual/pspp.html
540pspp node ${GS}/pspp/manual/html_node/
541
542pyconfigure mono ${GS}/pyconfigure/manual/pyconfigure.html
543pyconfigure node ${GS}/pyconfigure/manual/html_node/
544
545R = http://cran.r-project.org/doc/manuals
546 R-intro mono ${R}/R-intro.html
547 R-lang mono ${R}/R-lang.html
548 R-exts mono ${R}/R-exts.html
549 R-data mono ${R}/R-data.html
550 R-admin mono ${R}/R-admin.html
551 R-ints mono ${R}/R-ints.html
552
553rcs mono ${GS}/rcs/manual/rcs.html
554rcs node ${GS}/rcs/manual/html_node/
555
556READLINE = http://cnswww.cns.cwru.edu/php/chet/readline
557readline mono ${READLINE}/readline.html
558 rluserman mono ${READLINE}/rluserman.html
559 history mono ${READLINE}/history.html
560
561recode mono http://recode.progiciels-bpi.ca/manual/index.html
562
563recutils mono ${GS}/recutils/manual/recutils.html
564recutils node ${GS}/recutils/manual/html_node/
565
566reftex mono ${GS}/auctex/manual/reftex.html
567reftex node ${GS}/auctex/manual/reftex/
568
569remotecontrol mono ${GS}/remotecontrol/manual/remotecontrol.html
570remotecontrol node ${GS}/remotecontrol/manual/html_node/
571
572rottlog mono ${GS}/rottlog/manual/rottlog.html
573rottlog node ${GS}/rottlog/manual/html_node/
574
575RUSH = http://www.gnu.org.ua/software/rush/manual
576rush mono ${RUSH}/rush.html
577rush chapter ${RUSH}/html_chapter/
578rush section ${RUSH}/html_section/
579rush node ${RUSH}/html_node/
580
581screen mono ${GS}/screen/manual/screen.html
582screen node ${GS}/screen/manual/html_node/
583
584sed mono ${GS}/sed/manual/sed.html
585sed node ${GS}/sed/manual/html_node/
586
587sharutils mono ${GS}/sharutils/manual/html_mono/sharutils.html
588sharutils chapter ${GS}/sharutils/manual/html_chapter/
589sharutils node ${GS}/sharutils/manual/html_node/
590
591shepherd mono ${GS}/shepherd/manual/shepherd.html
592shepherd node ${GS}/shepherd/manual/html_node/
593
594# can't use mono files since they have generic names
595SMALLTALK = ${GS}/smalltalk
596smalltalk node ${SMALLTALK}/manual/html_node/
597 smalltalk-base node ${SMALLTALK}/manual-base/html_node/
598 smalltalk-libs node ${SMALLTALK}/manual-libs/html_node/
599
600sourceinstall mono ${GS}/sourceinstall/manual/sourceinstall.html
601sourceinstall node ${GS}/sourceinstall/manual/html_node/
602
603sqltutor mono ${GS}/sqltutor/manual/sqltutor.html
604sqltutor node ${GS}/sqltutor/manual/html_node/
605
606src-highlite mono ${GS}/src-highlite/source-highlight.html
607
608swbis mono ${GS}/swbis/manual.html
609
610tar mono ${GS}/tar/manual/tar.html
611tar chapter ${GS}/tar/manual/html_chapter/
612tar section ${GS}/tar/manual/html_section/
613tar node ${GS}/autoconf/manual/html_node/
614
615teseq mono ${GS}/teseq/teseq.html
616teseq node ${GS}/teseq/html_node/
617
618TEXINFO = ${GS}/texinfo/manual
619texinfo mono ${TEXINFO}/texinfo/texinfo.html
620texinfo node ${TEXINFO}/texinfo/html_node/
621 #
622 info mono ${TEXINFO}/info/info.html
623 info node ${TEXINFO}/info/html_node/
624 #
625 info-stnd mono ${TEXINFO}/info-stnd/info-stnd.html
626 info-stnd node ${TEXINFO}/info-stnd/html_node/
627
628thales node ${GS}/thales/manual/
629
630units mono ${GS}/units/manual/units.html
631units node ${GS}/units/manual/html_node/
632
633vc-dwim mono ${GS}/vc-dwim/manual/vc-dwim.html
634vc-dwim node ${GS}/vc-dwim/manual/html_node/
635
636wdiff mono ${GS}/wdiff/manual/wdiff.html
637wdiff node ${GS}/wdiff/manual/html_node/
638
639websocket4j mono ${GS}/websocket4j/manual/websocket4j.html
640websocket4j node ${GS}/websocket4j/manual/html_node/
641
642wget mono ${GS}/wget/manual/wget.html
643wget node ${GS}/wget/manual/html_node/
644
645xboard mono ${GS}/xboard/manual/xboard.html
646xboard node ${GS}/xboard/manual/html_node/
647
648# emacs-page
649# Free TeX-related Texinfo manuals on tug.org.
650
651T = http://tug.org/texinfohtml
652
653dvipng mono ${T}/dvipng.html
654dvips mono ${T}/dvips.html
655eplain mono ${T}/eplain.html
656kpathsea mono ${T}/kpathsea.html
657latex2e mono ${T}/latex2e.html
658tlbuild mono ${T}/tlbuild.html
659web2c mono ${T}/web2c.html
660
661
662# Local Variables:
663# eval: (add-hook 'write-file-hooks 'time-stamp)
664# time-stamp-start: "htmlxrefversion="
665# time-stamp-format: "%:y-%02m-%02d.%02H"
666# time-stamp-time-zone: "UTC"
667# time-stamp-end: "; # UTC"
668# End:
diff --git a/doc/images/daemon_lego_block.png b/doc/documentation/images/daemon_lego_block.png
index 5a088b532..5a088b532 100644
--- a/doc/images/daemon_lego_block.png
+++ b/doc/documentation/images/daemon_lego_block.png
Binary files differ
diff --git a/doc/images/daemon_lego_block.svg b/doc/documentation/images/daemon_lego_block.svg
index 38ad90d13..38ad90d13 100644
--- a/doc/images/daemon_lego_block.svg
+++ b/doc/documentation/images/daemon_lego_block.svg
diff --git a/doc/images/gnunet-0-10-peerinfo.png b/doc/documentation/images/gnunet-0-10-peerinfo.png
index c5e711aff..c5e711aff 100644
--- a/doc/images/gnunet-0-10-peerinfo.png
+++ b/doc/documentation/images/gnunet-0-10-peerinfo.png
Binary files differ
diff --git a/doc/images/gnunet-fs-gtk-0-10-star-tab.png b/doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png
index d7993cc46..d7993cc46 100644
--- a/doc/images/gnunet-fs-gtk-0-10-star-tab.png
+++ b/doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-download-area.png b/doc/documentation/images/gnunet-gtk-0-10-download-area.png
index 8500d46c9..8500d46c9 100644
--- a/doc/images/gnunet-gtk-0-10-download-area.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-download-area.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-menu.png b/doc/documentation/images/gnunet-gtk-0-10-fs-menu.png
index dc20c45a9..dc20c45a9 100644
--- a/doc/images/gnunet-gtk-0-10-fs-menu.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-menu.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-publish-editing.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png
index 6f9f75ea6..6f9f75ea6 100644
--- a/doc/images/gnunet-gtk-0-10-fs-publish-editing.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-publish-select.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png
index 50672e379..50672e379 100644
--- a/doc/images/gnunet-gtk-0-10-fs-publish-select.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-publish-with-file.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png
index b46542563..b46542563 100644
--- a/doc/images/gnunet-gtk-0-10-fs-publish-with-file.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-publish-with-file_0.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file_0.png
index b46542563..b46542563 100644
--- a/doc/images/gnunet-gtk-0-10-fs-publish-with-file_0.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file_0.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-publish.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish.png
index 033b38fa5..033b38fa5 100644
--- a/doc/images/gnunet-gtk-0-10-fs-publish.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-published.png b/doc/documentation/images/gnunet-gtk-0-10-fs-published.png
index fbd3dd6a3..fbd3dd6a3 100644
--- a/doc/images/gnunet-gtk-0-10-fs-published.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-published.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs-search.png b/doc/documentation/images/gnunet-gtk-0-10-fs-search.png
index bb64ab92e..bb64ab92e 100644
--- a/doc/images/gnunet-gtk-0-10-fs-search.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-search.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-fs.png b/doc/documentation/images/gnunet-gtk-0-10-fs.png
index c7a294878..c7a294878 100644
--- a/doc/images/gnunet-gtk-0-10-fs.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-gns-a-done.png b/doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png
index f8231b3a6..f8231b3a6 100644
--- a/doc/images/gnunet-gtk-0-10-gns-a-done.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-gns-a.png b/doc/documentation/images/gnunet-gtk-0-10-gns-a.png
index 39858d72c..39858d72c 100644
--- a/doc/images/gnunet-gtk-0-10-gns-a.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns-a.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-gns.png b/doc/documentation/images/gnunet-gtk-0-10-gns.png
index c71a2bd7b..c71a2bd7b 100644
--- a/doc/images/gnunet-gtk-0-10-gns.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-identity.png b/doc/documentation/images/gnunet-gtk-0-10-identity.png
index d0b426098..d0b426098 100644
--- a/doc/images/gnunet-gtk-0-10-identity.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-identity.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-search-selected.png b/doc/documentation/images/gnunet-gtk-0-10-search-selected.png
index da1ad4d31..da1ad4d31 100644
--- a/doc/images/gnunet-gtk-0-10-search-selected.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-search-selected.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10-traffic.png b/doc/documentation/images/gnunet-gtk-0-10-traffic.png
index 76458f717..76458f717 100644
--- a/doc/images/gnunet-gtk-0-10-traffic.png
+++ b/doc/documentation/images/gnunet-gtk-0-10-traffic.png
Binary files differ
diff --git a/doc/images/gnunet-gtk-0-10.png b/doc/documentation/images/gnunet-gtk-0-10.png
index 3615849a7..3615849a7 100644
--- a/doc/images/gnunet-gtk-0-10.png
+++ b/doc/documentation/images/gnunet-gtk-0-10.png
Binary files differ
diff --git a/doc/images/gnunet-namestore-gtk-phone.png b/doc/documentation/images/gnunet-namestore-gtk-phone.png
index 3bb859629..3bb859629 100644
--- a/doc/images/gnunet-namestore-gtk-phone.png
+++ b/doc/documentation/images/gnunet-namestore-gtk-phone.png
Binary files differ
diff --git a/doc/images/gnunet-namestore-gtk-vpn.png b/doc/documentation/images/gnunet-namestore-gtk-vpn.png
index c716729ba..c716729ba 100644
--- a/doc/images/gnunet-namestore-gtk-vpn.png
+++ b/doc/documentation/images/gnunet-namestore-gtk-vpn.png
Binary files differ
diff --git a/doc/images/gnunet-setup-exit.png b/doc/documentation/images/gnunet-setup-exit.png
index 66bd972bc..66bd972bc 100644
--- a/doc/images/gnunet-setup-exit.png
+++ b/doc/documentation/images/gnunet-setup-exit.png
Binary files differ
diff --git a/doc/images/gnunet-tutorial-service.png b/doc/documentation/images/gnunet-tutorial-service.png
index 6daed2f35..6daed2f35 100644
--- a/doc/images/gnunet-tutorial-service.png
+++ b/doc/documentation/images/gnunet-tutorial-service.png
Binary files differ
diff --git a/doc/images/gnunet-tutorial-system.png b/doc/documentation/images/gnunet-tutorial-system.png
index 8b54e16cf..8b54e16cf 100644
--- a/doc/images/gnunet-tutorial-system.png
+++ b/doc/documentation/images/gnunet-tutorial-system.png
Binary files differ
diff --git a/doc/images/iceweasel-preferences.png b/doc/documentation/images/iceweasel-preferences.png
index e62c2c4d9..e62c2c4d9 100644
--- a/doc/images/iceweasel-preferences.png
+++ b/doc/documentation/images/iceweasel-preferences.png
Binary files differ
diff --git a/doc/images/iceweasel-proxy.png b/doc/documentation/images/iceweasel-proxy.png
index 9caad4508..9caad4508 100644
--- a/doc/images/iceweasel-proxy.png
+++ b/doc/documentation/images/iceweasel-proxy.png
Binary files differ
diff --git a/doc/images/lego_stack.svg b/doc/documentation/images/lego_stack.svg
index a0e8017c3..a0e8017c3 100644
--- a/doc/images/lego_stack.svg
+++ b/doc/documentation/images/lego_stack.svg
diff --git a/doc/images/service_lego_block.png b/doc/documentation/images/service_lego_block.png
index 56caf6b9c..56caf6b9c 100644
--- a/doc/images/service_lego_block.png
+++ b/doc/documentation/images/service_lego_block.png
Binary files differ
diff --git a/doc/images/service_lego_block.svg b/doc/documentation/images/service_lego_block.svg
index ef0d0234f..ef0d0234f 100644
--- a/doc/images/service_lego_block.svg
+++ b/doc/documentation/images/service_lego_block.svg
diff --git a/doc/images/service_stack.png b/doc/documentation/images/service_stack.png
index 747d087b2..747d087b2 100644
--- a/doc/images/service_stack.png
+++ b/doc/documentation/images/service_stack.png
Binary files differ
diff --git a/doc/images/structure.dot b/doc/documentation/images/structure.dot
index a53db90b8..a53db90b8 100644
--- a/doc/images/structure.dot
+++ b/doc/documentation/images/structure.dot
diff --git a/doc/documentation/index.html b/doc/documentation/index.html
new file mode 100644
index 000000000..2481ac46a
--- /dev/null
+++ b/doc/documentation/index.html
@@ -0,0 +1,31 @@
1<title>GNUnet - GNUnet Handbooks</title>
2<h2>GNUnet - GNUnet Handbooks</h2>
3
4<address>GNUnet e.V.</address>
5<address></address>
6
7<p>The following handbooks and manuals are available:</p>
8
9<ul>
10<li><a href="gnunet/index.html">GNUnet Reference Handbook</li>
11<li><a href="gnunet-c-tutorial/index.html">GNUnet C Tutorial</li>
12</ul>
13
14<div id="footer">
15<div class="unprintable">
16
17<p>Please send general FSF &amp; GNU inquiries to
18<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
19There are also <a href="/contact/">other ways to contact</a>
20the FSF. Broken links and other corrections or suggestions can be sent
21to <a href="mailto:gnunet-developers@gnu.org">&lt;gnunet-developers@gnu.org&gt;</a>.</p>
22</div>
23
24<p>Copyright &copy; 2001 - 2017 GNUnet e.V.</p>
25
26<p>This page is licensed under a FIXME License.</p>
27
28</div>
29</div>
30</body>
31</html>
diff --git a/doc/documentation/run-gendocs.sh b/doc/documentation/run-gendocs.sh
new file mode 100755
index 000000000..6e9d43b48
--- /dev/null
+++ b/doc/documentation/run-gendocs.sh
@@ -0,0 +1,18 @@
1#!/bin/sh
2
3make version.texi
4make version2.texi
5./gendocs.sh --email gnunet-developers@gnu.org gnunet-c-tutorial "GNUnet C Tutorial" -o "manual/gnunet-c-tutorial"
6#cd manual
7#mkdir gnunet-c-tutorial
8#mv * gnunet-c-tutorial/
9#cd ..
10./gendocs.sh --email gnunet-developers@gnu.org gnunet "GNUnet reference handbook" -o "manual/gnunet"
11#cd manual
12#mkdir handbook
13#mkdir ../tmp-gnunet
14#mv gnunet ../tmp-gnunet
15#mv * handbook/
16#mv ../tmp-gnunet gnunet
17cp "index.html" manual/
18printf "Success"
diff --git a/doc/testbed_test.c b/doc/documentation/testbed_test.c
index 1696234b0..1696234b0 100644
--- a/doc/testbed_test.c
+++ b/doc/documentation/testbed_test.c
diff --git a/doc/tutorial-examples/001.c b/doc/documentation/tutorial-examples/001.c
index 7f6699dd2..7f6699dd2 100644
--- a/doc/tutorial-examples/001.c
+++ b/doc/documentation/tutorial-examples/001.c
diff --git a/doc/tutorial-examples/002.c b/doc/documentation/tutorial-examples/002.c
index 02233fd61..02233fd61 100644
--- a/doc/tutorial-examples/002.c
+++ b/doc/documentation/tutorial-examples/002.c
diff --git a/doc/documentation/tutorial-examples/003.c b/doc/documentation/tutorial-examples/003.c
new file mode 100644
index 000000000..d158d7e75
--- /dev/null
+++ b/doc/documentation/tutorial-examples/003.c
@@ -0,0 +1,11 @@
1struct GNUNET_MQ_MessageHandlers handlers[] = {
2 // ...
3 GNUNET_MQ_handler_end ()
4};
5struct GNUNET_MQ_Handle *mq;
6
7mq = GNUNET_CLIENT_connect (cfg,
8 "service-name",
9 handlers,
10 &error_cb,
11 NULL);
diff --git a/doc/tutorial-examples/004.c b/doc/documentation/tutorial-examples/004.c
index 0ef007907..0ef007907 100644
--- a/doc/tutorial-examples/004.c
+++ b/doc/documentation/tutorial-examples/004.c
diff --git a/doc/tutorial-examples/005.c b/doc/documentation/tutorial-examples/005.c
index 0c459f509..0c459f509 100644
--- a/doc/tutorial-examples/005.c
+++ b/doc/documentation/tutorial-examples/005.c
diff --git a/doc/tutorial-examples/006.c b/doc/documentation/tutorial-examples/006.c
index 944d2b18c..944d2b18c 100644
--- a/doc/tutorial-examples/006.c
+++ b/doc/documentation/tutorial-examples/006.c
diff --git a/doc/tutorial-examples/007.c b/doc/documentation/tutorial-examples/007.c
index 096539e43..096539e43 100644
--- a/doc/tutorial-examples/007.c
+++ b/doc/documentation/tutorial-examples/007.c
diff --git a/doc/tutorial-examples/008.c b/doc/documentation/tutorial-examples/008.c
index 2dffe2cf9..2dffe2cf9 100644
--- a/doc/tutorial-examples/008.c
+++ b/doc/documentation/tutorial-examples/008.c
diff --git a/doc/tutorial-examples/009.c b/doc/documentation/tutorial-examples/009.c
index 26d918fb0..26d918fb0 100644
--- a/doc/tutorial-examples/009.c
+++ b/doc/documentation/tutorial-examples/009.c
diff --git a/doc/tutorial-examples/010.c b/doc/documentation/tutorial-examples/010.c
index 33494490d..33494490d 100644
--- a/doc/tutorial-examples/010.c
+++ b/doc/documentation/tutorial-examples/010.c
diff --git a/doc/tutorial-examples/011.c b/doc/documentation/tutorial-examples/011.c
index 23bc051de..23bc051de 100644
--- a/doc/tutorial-examples/011.c
+++ b/doc/documentation/tutorial-examples/011.c
diff --git a/doc/tutorial-examples/012.c b/doc/documentation/tutorial-examples/012.c
index cb21d78ab..cb21d78ab 100644
--- a/doc/tutorial-examples/012.c
+++ b/doc/documentation/tutorial-examples/012.c
diff --git a/doc/documentation/tutorial-examples/013.1.c b/doc/documentation/tutorial-examples/013.1.c
new file mode 100644
index 000000000..fa5212868
--- /dev/null
+++ b/doc/documentation/tutorial-examples/013.1.c
@@ -0,0 +1,3 @@
1void
2GNUNET_PEERSTORE_store_cancel (struct GNUNET_PEERSTORE_StoreContext
3 *sc);
diff --git a/doc/tutorial-examples/013.c b/doc/documentation/tutorial-examples/013.c
index 6792417e1..6792417e1 100644
--- a/doc/tutorial-examples/013.c
+++ b/doc/documentation/tutorial-examples/013.c
diff --git a/doc/tutorial-examples/014.c b/doc/documentation/tutorial-examples/014.c
index ce204f795..ce204f795 100644
--- a/doc/tutorial-examples/014.c
+++ b/doc/documentation/tutorial-examples/014.c
diff --git a/doc/tutorial-examples/015.c b/doc/documentation/tutorial-examples/015.c
index 0dd267e8e..0dd267e8e 100644
--- a/doc/tutorial-examples/015.c
+++ b/doc/documentation/tutorial-examples/015.c
diff --git a/doc/tutorial-examples/016.c b/doc/documentation/tutorial-examples/016.c
index d8db4b3b8..d169da16d 100644
--- a/doc/tutorial-examples/016.c
+++ b/doc/documentation/tutorial-examples/016.c
@@ -1,3 +1,4 @@
1void 1void
2GNUNET_PEERSTORE_watch_cancel (struct GNUNET_PEERSTORE_WatchContext *wc); 2GNUNET_PEERSTORE_watch_cancel (struct GNUNET_PEERSTORE_WatchContext
3 *wc);
3 4
diff --git a/doc/documentation/tutorial-examples/017.c b/doc/documentation/tutorial-examples/017.c
new file mode 100644
index 000000000..c86fbcd1f
--- /dev/null
+++ b/doc/documentation/tutorial-examples/017.c
@@ -0,0 +1,4 @@
1void
2GNUNET_PEERSTORE_disconnect (struct GNUNET_PEERSTORE_Handle *h,
3 int sync_first);
4
diff --git a/doc/tutorial-examples/018.c b/doc/documentation/tutorial-examples/018.c
index 3fc22584c..3fc22584c 100644
--- a/doc/tutorial-examples/018.c
+++ b/doc/documentation/tutorial-examples/018.c
diff --git a/doc/tutorial-examples/019.c b/doc/documentation/tutorial-examples/019.c
index d016d381b..aaf001516 100644
--- a/doc/tutorial-examples/019.c
+++ b/doc/documentation/tutorial-examples/019.c
@@ -1,4 +1,5 @@
1message_sent_cont (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 1message_sent_cont (void *cls,
2 const struct GNUNET_SCHEDULER_TaskContext *tc)
2{ 3{
3 // Request has left local node 4 // Request has left local node
4} 5}
@@ -8,7 +9,9 @@ GNUNET_DHT_put (struct GNUNET_DHT_Handle *handle,
8 const struct GNUNET_HashCode *key, 9 const struct GNUNET_HashCode *key,
9 uint32_t desired_replication_level, 10 uint32_t desired_replication_level,
10 enum GNUNET_DHT_RouteOption options, 11 enum GNUNET_DHT_RouteOption options,
11 enum GNUNET_BLOCK_Type type, size_t size, const void *data, 12 enum GNUNET_BLOCK_Type type,
13 size_t size,
14 const void *data,
12 struct GNUNET_TIME_Absolute exp, 15 struct GNUNET_TIME_Absolute exp,
13 struct GNUNET_TIME_Relative timeout, 16 struct GNUNET_TIME_Relative timeout,
14 GNUNET_DHT_PutContinuation cont, void *cont_cls) 17 GNUNET_DHT_PutContinuation cont, void *cont_cls)
diff --git a/doc/tutorial-examples/020.c b/doc/documentation/tutorial-examples/020.c
index 5ecba1c16..596db3069 100644
--- a/doc/tutorial-examples/020.c
+++ b/doc/documentation/tutorial-examples/020.c
@@ -5,7 +5,8 @@ get_result_iterator (void *cls, struct GNUNET_TIME_Absolute expiration,
5 unsigned int get_path_length, 5 unsigned int get_path_length,
6 const struct GNUNET_PeerIdentity *put_path, 6 const struct GNUNET_PeerIdentity *put_path,
7 unsigned int put_path_length, 7 unsigned int put_path_length,
8 enum GNUNET_BLOCK_Type type, size_t size, const void *data) 8 enum GNUNET_BLOCK_Type type, size_t size,
9 const void *data)
9{ 10{
10 // Optionally: 11 // Optionally:
11 GNUNET_DHT_get_stop (get_handle); 12 GNUNET_DHT_get_stop (get_handle);
diff --git a/doc/tutorial-examples/021.c b/doc/documentation/tutorial-examples/021.c
index 688a31fe0..688a31fe0 100644
--- a/doc/tutorial-examples/021.c
+++ b/doc/documentation/tutorial-examples/021.c
diff --git a/doc/tutorial-examples/022.c b/doc/documentation/tutorial-examples/022.c
index a373619bd..a373619bd 100644
--- a/doc/tutorial-examples/022.c
+++ b/doc/documentation/tutorial-examples/022.c
diff --git a/doc/tutorial-examples/023.c b/doc/documentation/tutorial-examples/023.c
index 820c38b10..820c38b10 100644
--- a/doc/tutorial-examples/023.c
+++ b/doc/documentation/tutorial-examples/023.c
diff --git a/doc/tutorial-examples/024.c b/doc/documentation/tutorial-examples/024.c
index 2e84b5905..2e84b5905 100644
--- a/doc/tutorial-examples/024.c
+++ b/doc/documentation/tutorial-examples/024.c
diff --git a/doc/tutorial-examples/025.c b/doc/documentation/tutorial-examples/025.c
index 66d4f80ec..66d4f80ec 100644
--- a/doc/tutorial-examples/025.c
+++ b/doc/documentation/tutorial-examples/025.c
diff --git a/doc/tutorial-examples/026.c b/doc/documentation/tutorial-examples/026.c
index 264e0b6b9..264e0b6b9 100644
--- a/doc/tutorial-examples/026.c
+++ b/doc/documentation/tutorial-examples/026.c
diff --git a/doc/hacks.el b/doc/hacks.el
new file mode 100644
index 000000000..9f271b3af
--- /dev/null
+++ b/doc/hacks.el
@@ -0,0 +1,17 @@
1;;;; hacks.el --- a few functions to help me work on the manual
2;;;; Jim Blandy <jimb@red-bean.com> --- October 1998
3;;;; -- imported from https://git.savannah.gnu.org/cgit/guile.git/tree/doc/hacks.el
4
5(defun jh-exemplify-region (start end)
6 (interactive "r")
7 (save-excursion
8 (save-restriction
9 (narrow-to-region start end)
10
11 ;; Texinfo doesn't handle tabs well.
12 (untabify (point-min) (point-max))
13
14 ;; Quote any characters special to texinfo.
15 (goto-char (point-min))
16 (while (re-search-forward "[{}@]" nil t)
17 (replace-match "@\\&")))))
diff --git a/doc/tutorial-examples/003.c b/doc/tutorial-examples/003.c
deleted file mode 100644
index d13681ca6..000000000
--- a/doc/tutorial-examples/003.c
+++ /dev/null
@@ -1,7 +0,0 @@
1 struct GNUNET_MQ_MessageHandlers handlers[] = {
2 // ...
3 GNUNET_MQ_handler_end ()
4 };
5 struct GNUNET_MQ_Handle *mq;
6
7 mq = GNUNET_CLIENT_connect (cfg, "service-name", handlers, &error_cb, NULL);
diff --git a/doc/tutorial-examples/017.c b/doc/tutorial-examples/017.c
deleted file mode 100644
index c4acbc088..000000000
--- a/doc/tutorial-examples/017.c
+++ /dev/null
@@ -1,3 +0,0 @@
1void
2GNUNET_PEERSTORE_disconnect (struct GNUNET_PEERSTORE_Handle *h, int sync_first);
3
diff --git a/src/arm/Makefile.am b/src/arm/Makefile.am
index 373847fde..b1706a479 100644
--- a/src/arm/Makefile.am
+++ b/src/arm/Makefile.am
@@ -92,7 +92,8 @@ test_gnunet_service_arm_SOURCES = \
92 92
93do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' 93do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
94 94
95%.py: %.py.in Makefile 95SUFFIXES = .py.in .py
96.py.in.py:
96 $(do_subst) < $(srcdir)/$< > $@ 97 $(do_subst) < $(srcdir)/$< > $@
97 chmod +x $@ 98 chmod +x $@
98 99
diff --git a/src/dht/Makefile.am b/src/dht/Makefile.am
index 00ce0e934..4a78ea4c7 100644
--- a/src/dht/Makefile.am
+++ b/src/dht/Makefile.am
@@ -213,7 +213,8 @@ endif
213 213
214do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' -e 's,[@]bindir[@],$(bindir),g' 214do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' -e 's,[@]bindir[@],$(bindir),g'
215 215
216%.py: %.py.in Makefile 216SUFFIXES = .py.in .py
217.py.in.py:
217 $(do_subst) < $(srcdir)/$< > $@ 218 $(do_subst) < $(srcdir)/$< > $@
218 chmod +x $@ 219 chmod +x $@
219 220
diff --git a/src/include/gnunet_scheduler_lib.h b/src/include/gnunet_scheduler_lib.h
index 875f5043a..a855ab8ab 100644
--- a/src/include/gnunet_scheduler_lib.h
+++ b/src/include/gnunet_scheduler_lib.h
@@ -400,6 +400,22 @@ void
400GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task, 400GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task,
401 void *task_cls); 401 void *task_cls);
402 402
403/**
404 * Initialize and run scheduler. This function will return when all
405 * tasks have completed. When @ install_signals is GNUNET_YES, then
406 * this function behaves in the same was as GNUNET_SCHEDULER_run does.
407 * If @ install_signals is GNUNET_NO then no signal handlers are
408 * installed.
409 *
410 * @param install_signals whether to install signals (GNUNET_YES/NO)
411 * @param task task to run first (and immediately)
412 * @param task_cls closure of @a task
413 */
414void
415GNUNET_SCHEDULER_run_with_optional_signals (int install_signals,
416 GNUNET_SCHEDULER_TaskCallback task,
417 void *task_cls);
418
403 419
404/** 420/**
405 * Request the shutdown of a scheduler. Marks all tasks 421 * Request the shutdown of a scheduler. Marks all tasks
diff --git a/src/integration-tests/Makefile.am b/src/integration-tests/Makefile.am
index 6fff0b407..368980064 100644
--- a/src/integration-tests/Makefile.am
+++ b/src/integration-tests/Makefile.am
@@ -42,7 +42,8 @@ endif
42 42
43do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' 43do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
44 44
45%.py: %.py.in Makefile 45SUFFIXES = .py.in .py
46.py.in.py:
46 $(do_subst) < $(srcdir)/$< > $@ 47 $(do_subst) < $(srcdir)/$< > $@
47 chmod +x $@ 48 chmod +x $@
48 49
diff --git a/src/statistics/Makefile.am b/src/statistics/Makefile.am
index b2e256960..16a1ea2d0 100644
--- a/src/statistics/Makefile.am
+++ b/src/statistics/Makefile.am
@@ -90,7 +90,8 @@ endif
90 90
91do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' 91do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
92 92
93%.py: %.py.in Makefile 93SUFFIXES = .py.in .py
94.py.in.py:
94 $(do_subst) < $(srcdir)/$< > $@ 95 $(do_subst) < $(srcdir)/$< > $@
95 chmod +x $@ 96 chmod +x $@
96 97
diff --git a/src/util/scheduler.c b/src/util/scheduler.c
index e9c25d68a..540a60557 100644
--- a/src/util/scheduler.c
+++ b/src/util/scheduler.c
@@ -787,6 +787,14 @@ void
787GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task, 787GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task,
788 void *task_cls) 788 void *task_cls)
789{ 789{
790 GNUNET_SCHEDULER_run_with_optional_signals(GNUNET_YES, task, task_cls);
791}
792
793void
794GNUNET_SCHEDULER_run_with_optional_signals (int install_signals,
795 GNUNET_SCHEDULER_TaskCallback task,
796 void *task_cls)
797{
790 struct GNUNET_NETWORK_FDSet *rs; 798 struct GNUNET_NETWORK_FDSet *rs;
791 struct GNUNET_NETWORK_FDSet *ws; 799 struct GNUNET_NETWORK_FDSet *ws;
792 struct GNUNET_TIME_Relative timeout; 800 struct GNUNET_TIME_Relative timeout;
@@ -820,24 +828,29 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task,
820 GNUNET_DISK_PIPE_END_READ); 828 GNUNET_DISK_PIPE_END_READ);
821 GNUNET_assert (NULL != pr); 829 GNUNET_assert (NULL != pr);
822 my_pid = getpid (); 830 my_pid = getpid ();
823 LOG (GNUNET_ERROR_TYPE_DEBUG, 831
824 "Registering signal handlers\n"); 832 if (GNUNET_YES == install_signals)
825 shc_int = GNUNET_SIGNAL_handler_install (SIGINT, 833 {
834 LOG (GNUNET_ERROR_TYPE_DEBUG,
835 "Registering signal handlers\n");
836 shc_int = GNUNET_SIGNAL_handler_install (SIGINT,
837 &sighandler_shutdown);
838 shc_term = GNUNET_SIGNAL_handler_install (SIGTERM,
826 &sighandler_shutdown); 839 &sighandler_shutdown);
827 shc_term = GNUNET_SIGNAL_handler_install (SIGTERM,
828 &sighandler_shutdown);
829#if (SIGTERM != GNUNET_TERM_SIG) 840#if (SIGTERM != GNUNET_TERM_SIG)
830 shc_gterm = GNUNET_SIGNAL_handler_install (GNUNET_TERM_SIG, 841 shc_gterm = GNUNET_SIGNAL_handler_install (GNUNET_TERM_SIG,
831 &sighandler_shutdown); 842 &sighandler_shutdown);
832#endif 843#endif
833#ifndef MINGW 844#ifndef MINGW
834 shc_pipe = GNUNET_SIGNAL_handler_install (SIGPIPE, 845 shc_pipe = GNUNET_SIGNAL_handler_install (SIGPIPE,
835 &sighandler_pipe); 846 &sighandler_pipe);
836 shc_quit = GNUNET_SIGNAL_handler_install (SIGQUIT, 847 shc_quit = GNUNET_SIGNAL_handler_install (SIGQUIT,
837 &sighandler_shutdown); 848 &sighandler_shutdown);
838 shc_hup = GNUNET_SIGNAL_handler_install (SIGHUP, 849 shc_hup = GNUNET_SIGNAL_handler_install (SIGHUP,
839 &sighandler_shutdown); 850 &sighandler_shutdown);
840#endif 851#endif
852 }
853
841 current_priority = GNUNET_SCHEDULER_PRIORITY_DEFAULT; 854 current_priority = GNUNET_SCHEDULER_PRIORITY_DEFAULT;
842 current_lifeness = GNUNET_YES; 855 current_lifeness = GNUNET_YES;
843 GNUNET_SCHEDULER_add_with_reason_and_priority (task, 856 GNUNET_SCHEDULER_add_with_reason_and_priority (task,
@@ -953,16 +966,21 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_TaskCallback task,
953 busy_wait_warning = 0; 966 busy_wait_warning = 0;
954 } 967 }
955 } 968 }
956 GNUNET_SIGNAL_handler_uninstall (shc_int); 969
957 GNUNET_SIGNAL_handler_uninstall (shc_term); 970 if (GNUNET_YES == install_signals)
971 {
972 GNUNET_SIGNAL_handler_uninstall (shc_int);
973 GNUNET_SIGNAL_handler_uninstall (shc_term);
958#if (SIGTERM != GNUNET_TERM_SIG) 974#if (SIGTERM != GNUNET_TERM_SIG)
959 GNUNET_SIGNAL_handler_uninstall (shc_gterm); 975 GNUNET_SIGNAL_handler_uninstall (shc_gterm);
960#endif 976#endif
961#ifndef MINGW 977#ifndef MINGW
962 GNUNET_SIGNAL_handler_uninstall (shc_pipe); 978 GNUNET_SIGNAL_handler_uninstall (shc_pipe);
963 GNUNET_SIGNAL_handler_uninstall (shc_quit); 979 GNUNET_SIGNAL_handler_uninstall (shc_quit);
964 GNUNET_SIGNAL_handler_uninstall (shc_hup); 980 GNUNET_SIGNAL_handler_uninstall (shc_hup);
965#endif 981#endif
982 }
983
966 GNUNET_DISK_pipe_close (shutdown_pipe_handle); 984 GNUNET_DISK_pipe_close (shutdown_pipe_handle);
967 shutdown_pipe_handle = NULL; 985 shutdown_pipe_handle = NULL;
968 GNUNET_NETWORK_fdset_destroy (rs); 986 GNUNET_NETWORK_fdset_destroy (rs);