aboutsummaryrefslogtreecommitdiff
path: root/doc/documentation
diff options
context:
space:
mode:
Diffstat (limited to 'doc/documentation')
-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.texi378
-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.texi505
-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.texi1520
-rw-r--r--doc/documentation/gnunet.texi261
-rw-r--r--doc/documentation/gpl-3.0.texi717
-rw-r--r--doc/documentation/htmlxref.cnf668
-rw-r--r--doc/documentation/images/daemon_lego_block.pngbin0 -> 7636 bytes
-rw-r--r--doc/documentation/images/daemon_lego_block.svg126
-rw-r--r--doc/documentation/images/gnunet-0-10-peerinfo.pngbin0 -> 80127 bytes
-rw-r--r--doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.pngbin0 -> 63464 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-download-area.pngbin0 -> 7634 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-menu.pngbin0 -> 8614 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.pngbin0 -> 55507 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.pngbin0 -> 43448 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.pngbin0 -> 27371 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file_0.pngbin0 -> 27371 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-publish.pngbin0 -> 26496 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-published.pngbin0 -> 59635 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs-search.pngbin0 -> 72151 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-fs.pngbin0 -> 55706 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns-a-done.pngbin0 -> 30880 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns-a.pngbin0 -> 29895 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-gns.pngbin0 -> 63783 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-identity.pngbin0 -> 62404 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-search-selected.pngbin0 -> 104599 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10-traffic.pngbin0 -> 68515 bytes
-rw-r--r--doc/documentation/images/gnunet-gtk-0-10.pngbin0 -> 72897 bytes
-rw-r--r--doc/documentation/images/gnunet-namestore-gtk-phone.pngbin0 -> 32631 bytes
-rw-r--r--doc/documentation/images/gnunet-namestore-gtk-vpn.pngbin0 -> 35836 bytes
-rw-r--r--doc/documentation/images/gnunet-setup-exit.pngbin0 -> 30062 bytes
-rw-r--r--doc/documentation/images/gnunet-tutorial-service.pngbin0 -> 40142 bytes
-rw-r--r--doc/documentation/images/gnunet-tutorial-system.pngbin0 -> 46982 bytes
-rw-r--r--doc/documentation/images/iceweasel-preferences.pngbin0 -> 57047 bytes
-rw-r--r--doc/documentation/images/iceweasel-proxy.pngbin0 -> 38773 bytes
-rw-r--r--doc/documentation/images/lego_stack.svg737
-rw-r--r--doc/documentation/images/service_lego_block.pngbin0 -> 15157 bytes
-rw-r--r--doc/documentation/images/service_lego_block.svg345
-rw-r--r--doc/documentation/images/service_stack.pngbin0 -> 18862 bytes
-rw-r--r--doc/documentation/images/structure.dot124
-rw-r--r--doc/documentation/index.html31
-rwxr-xr-xdoc/documentation/run-gendocs.sh18
-rw-r--r--doc/documentation/testbed_test.c99
-rw-r--r--doc/documentation/tutorial-examples/001.c29
-rw-r--r--doc/documentation/tutorial-examples/002.c17
-rw-r--r--doc/documentation/tutorial-examples/003.c11
-rw-r--r--doc/documentation/tutorial-examples/004.c5
-rw-r--r--doc/documentation/tutorial-examples/005.c8
-rw-r--r--doc/documentation/tutorial-examples/006.c31
-rw-r--r--doc/documentation/tutorial-examples/007.c10
-rw-r--r--doc/documentation/tutorial-examples/008.c22
-rw-r--r--doc/documentation/tutorial-examples/009.c9
-rw-r--r--doc/documentation/tutorial-examples/010.c8
-rw-r--r--doc/documentation/tutorial-examples/011.c8
-rw-r--r--doc/documentation/tutorial-examples/012.c4
-rw-r--r--doc/documentation/tutorial-examples/013.1.c3
-rw-r--r--doc/documentation/tutorial-examples/013.c12
-rw-r--r--doc/documentation/tutorial-examples/014.c9
-rw-r--r--doc/documentation/tutorial-examples/015.c8
-rw-r--r--doc/documentation/tutorial-examples/016.c4
-rw-r--r--doc/documentation/tutorial-examples/017.c4
-rw-r--r--doc/documentation/tutorial-examples/018.c2
-rw-r--r--doc/documentation/tutorial-examples/019.c18
-rw-r--r--doc/documentation/tutorial-examples/020.c25
-rw-r--r--doc/documentation/tutorial-examples/021.c13
-rw-r--r--doc/documentation/tutorial-examples/022.c8
-rw-r--r--doc/documentation/tutorial-examples/023.c17
-rw-r--r--doc/documentation/tutorial-examples/024.c9
-rw-r--r--doc/documentation/tutorial-examples/025.c15
-rw-r--r--doc/documentation/tutorial-examples/026.c52
80 files changed, 21320 insertions, 0 deletions
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/documentation/chapters/philosophy.texi b/doc/documentation/chapters/philosophy.texi
new file mode 100644
index 000000000..10006ebe1
--- /dev/null
+++ b/doc/documentation/chapters/philosophy.texi
@@ -0,0 +1,378 @@
1@cindex Philosopy
2@node Philosophy
3@chapter Philosophy
4
5The foremost goal of the GNUnet project is to become a widely used,
6reliable, open, non-discriminating, egalitarian, unfettered and
7censorship-resistant system of free information exchange.
8We value free speech above state secrets, law-enforcement or
9intellectual property. GNUnet is supposed to be an anarchistic network,
10where the only limitation for peers is that they must contribute enough
11back to the network such that their resource consumption does not have
12a significant impact on other users. GNUnet should be more than just
13another file-sharing network. The plan is to offer many other services
14and in particular to serve as a development platform for the next
15generation of decentralized Internet protocols.
16
17@menu
18* Design Goals::
19* Security & Privacy::
20* Versatility::
21* Practicality::
22* Key Concepts::
23@end menu
24
25@cindex Design Goals
26@cindex Design Goals
27@node Design Goals
28@section Design Goals
29
30These are the core GNUnet design goals, in order of relative importance:
31
32@itemize
33@item GNUnet must be implemented as free software.
34@item GNUnet must only disclose the minimal amount of information
35necessary.
36@item GNUnet must be decentralised and survive Byzantine failures in any
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.
42@item GNUnet must be open and permit new peers to join.
43@item GNUnet must be self-organizing and not depend on administrators.
44@item GNUnet must support a diverse range of applications and devices.
45@item The GNUnet architecture must be cost effective.
46@item GNUnet must provide incentives for peers to contribute more
47resources than they consume.
48@end itemize
49
50
51@cindex Security and Privacy
52@node Security & Privacy
53@section Security & Privacy
54
55GNUnet's primary design goals are to protect the privacy of its users and
56to guard itself against attacks or abuse.
57GNUnet does not have any mechanisms to control, track or censor users.
58Instead, the GNUnet protocols aim to make it as hard as possible to
59find out what is happening on the network or to disrupt operations.
60
61@cindex Versatility
62@node Versatility
63@section Versatility
64
65We call GNUnet a peer-to-peer framework because we want to support many
66different forms of peer-to-peer applications. GNUnet uses a plugin
67architecture to make the system extensible and to encourage code reuse.
68While the first versions of the system only supported anonymous
69file-sharing, other applications are being worked on and more will
70hopefully follow in the future.
71A powerful synergy regarding anonymity services is created by a large
72community utilizing many diverse applications over the same software
73infrastructure. The reason is that link encryption hides the specifics
74of the traffic for non-participating observers. This way, anonymity can
75get stronger with additional (GNUnet) traffic, even if the additional
76traffic is not related to anonymous communication. Increasing anonymity is
77the primary reason why GNUnet is developed to become a peer-to-peer
78framework where many applications share the lower layers of an
79increasingly complex protocol stack.
80If merging traffic to hinder traffic analysis was not important,
81we could have just developed a dozen stand-alone applications
82and a few shared libraries.
83
84@cindex Practicality
85@node Practicality
86@section Practicality
87
88GNUnet allows participants to trade various amounts of security in
89exchange for increased efficiency. However, it is not possible for any
90user's security and efficiency requirements to compromise the security
91and efficiency of any other user.
92
93For GNUnet, efficiency is not paramount. If there is a more secure and
94still practical approach, we would choose to take the more secure
95alternative. @command{telnet} is more efficient than @command{ssh}, yet
96it is obsolete.
97Hardware gets faster, and code can be optimized. Fixing security issues as
98an afterthought is much harder.
99
100While security is paramount, practicability is still a requirement.
101The most secure system is always the one that nobody can use.
102Similarly, any anonymous system that is extremely inefficient will only
103find few users.
104However, good anonymity requires a large and diverse user base. Since
105individual security requirements may vary, the only good solution here is
106to allow individuals to trade-off security and efficiency.
107The primary challenge in allowing this is to ensure that the economic
108incentives work properly.
109In particular, this means that it must be impossible for a user to gain
110security at the expense of other users. Many designs (e.g. anonymity via
111broadcast) fail to give users an incentive to choose a less secure but
112more efficient mode of operation.
113GNUnet should avoid where ever possible to rely on protocols that will
114only work if the participants are benevolent.
115While some designs have had widespread success while relying on parties
116to observe a protocol that may be sub-optimal for the individuals (e.g.
117TCP Nagle), a protocol that ensures that individual goals never conflict
118with the goals of the group is always preferable.
119
120@cindex Key Concepts
121@node Key Concepts
122@section Key Concepts
123
124In this section, the fundamental concepts of GNUnet are explained.
125Most of them are also described in our research papers.
126First, some of the concepts used in the GNUnet framework are detailed.
127The second part describes concepts specific to anonymous file-sharing.
128
129@menu
130* Authentication::
131* Accounting to Encourage Resource Sharing::
132* Confidentiality::
133* Anonymity::
134* Deniability::
135* Peer Identities::
136* Zones in the GNU Name System (GNS Zones)::
137* Egos::
138@end menu
139
140@cindex Authentication
141@node Authentication
142@subsection Authentication
143
144Almost all peer-to-peer communications in GNUnet are between mutually
145authenticated peers. The authentication works by using ECDHE, that is a
146DH key exchange using ephemeral eliptic curve cryptography. The ephemeral
147ECC keys are signed using ECDSA. The shared secret from ECDHE is used to
148create a pair of session keys (using HKDF) which are then used to encrypt
149the communication between the two peers using both 256-bit AES and 256-bit
150Twofish (with independently derived secret keys). As only the two
151participating hosts know the shared secret, this authenticates each packet
152without requiring signatures each time. GNUnet uses SHA-512 hash codes to
153verify the integrity of messages.
154
155In GNUnet, the identity of a host is its public key. For that reason,
156man-in-the-middle attacks will not break the authentication or accounting
157goals. Essentially, for GNUnet, the IP of the host has nothing to do with
158the identity of the host. As the public key is the only thing that truly
159matters, faking an IP, a port or any other property of the underlying
160transport protocol is irrelevant. In fact, GNUnet peers can use
161multiple IPs (IPv4 and IPv6) on multiple ports --- or even not use the
162IP protocol at all (by running directly on layer 2).
163
164GNUnet uses a special type of message to communicate a binding between
165public (ECC) keys to their current network address. These messages are
166commonly called HELLOs or peer advertisements. They contain the public key
167of the peer and its current network addresses for various transport
168services.
169A transport service is a special kind of shared library that
170provides (possibly unreliable, out-of-order) message delivery between
171peers.
172For the UDP and TCP transport services, a network address is an IP and a
173port.
174GNUnet can also use other transports (HTTP, HTTPS, WLAN, etc.) which use
175various other forms of addresses. Note that any node can have many
176different
177active transport services at the same time, and each of these can have a
178different addresses. Binding messages expire after at most a week (the
179timeout can be shorter if the user configures the node appropriately).
180This expiration ensures that the network will eventually get rid of
181outdated advertisements.@footnote{More details can be found in
182@uref{https://gnunet.org/transports, A Transport Layer Abstraction for Peer-to-Peer Networks}}
183
184@cindex Resource Sharing
185@node Accounting to Encourage Resource Sharing
186@subsection Accounting to Encourage Resource Sharing
187
188Most distributed P2P networks suffer from a lack of defenses or
189precautions against attacks in the form of freeloading.
190While the intentions of an attacker and a freeloader are different, their
191effect on the network is the same; they both render it useless.
192Most simple attacks on networks such as Gnutella involve flooding the
193network with traffic, particularly with queries that are, in the worst
194case, multiplied by the network.
195
196In order to ensure that freeloaders or attackers have a minimal impact on
197the network, GNUnet's file-sharing implementation tries to distinguish
198good (contributing) nodes from malicious (freeloading) nodes. In GNUnet,
199every file-sharing node keeps track of the behavior of every other node it
200has been in contact with. Many requests (depending on the application) are
201transmitted with a priority (or importance) level. That priority is used
202to establish how important the sender believes this request is. If a peer
203responds to an important request, the recipient will increase its trust in
204the responder: the responder contributed resources. If a peer is too busy
205to answer all requests, it needs to prioritize. For that, peers to not
206take the priorities of the requests received at face value.
207First, they check how much they trust the sender, and depending on that
208amount of trust they assign the request a (possibly lower) effective
209priority. Then, they drop the requests with the lowest effective priority
210to satisfy their resource constraints. This way, GNUnet's economic model
211ensures that nodes that are not currently considered to have a surplus in
212contributions will not be served if the network load is high.@footnote{Mor
213e details can be found in @uref{https://gnunet.org/ebe, this paper}}
214
215@cindex Confidentiality
216@node Confidentiality
217@subsection Confidentiality
218
219Adversaries outside of GNUnet are not supposed to know what kind of
220actions a peer is involved in. Only the specific neighbor of a peer that
221is the corresponding sender or recipient of a message may know its
222contents, and even then application protocols may place further
223restrictions on that knowledge.
224In order to ensure confidentiality, GNUnet uses link encryption, that is
225each message exchanged between two peers is encrypted using a pair of
226keys only known to these two peers.
227Encrypting traffic like this makes any kind of traffic analysis much
228harder. Naturally, for some applications, it may still be desirable if
229even neighbors cannot determine the concrete contents of a message.
230In GNUnet, this problem is addressed by the specific application-level
231protocols (see for example, deniability and anonymity in anonymous file
232sharing).
233
234@cindex Anonymity
235@node Anonymity
236@subsection Anonymity
237
238@menu
239* How file-sharing achieves Anonymity::
240@end menu
241
242Providing anonymity for users is the central goal for the anonymous
243file-sharing application. Many other design decisions follow in the
244footsteps of this requirement.
245Anonymity is never absolute. While there are various
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.
249GNUnet's file-sharing implementation allows users to select for each
250operation (publish, search, download) the desired level of anonymity.
251The metric used is the amount of cover traffic available to hide the
252request.
253While this metric is not as good as, for example, the theoretical metric
254given in @uref{https://gnunet.org/anonymity_metric, scientific metrics},
255it is probably the best metric available to a peer with a purely local
256view of the world that does not rely on unreliable external information.
257The default anonymity level is 1, which uses anonymous routing but
258imposes no minimal requirements on cover traffic. It is possible
259to forego anonymity when this is not required. The anonymity level of 0
260allows GNUnet to use more efficient, non-anonymous routing.
261
262@cindex How file-sharing achieves Anonymity
263@node How file-sharing achieves Anonymity
264@subsubsection How file-sharing achieves Anonymity
265
266Contrary to other designs, we do not believe that users achieve strong
267anonymity just because their requests are obfuscated by a couple of
268indirections. This is not sufficient if the adversary uses traffic
269analysis.
270The threat model used for anonymous file sharing in GNUnet assumes that
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
274can not break our encryption, we assume that the adversary has many
275participating nodes in the network and that it can thus see many of the
276node-to-node interactions since it controls some of the nodes.
277
278The system tries to achieve anonymity based on the idea that users can be
279anonymous if they can hide their actions in the traffic created by other
280users.
281Hiding actions in the traffic of other users requires participating in the
282traffic, bringing back the traditional technique of using indirection and
283source rewriting. Source rewriting is required to gain anonymity since
284otherwise an adversary could tell if a message originated from a host by
285looking at the source address. If all packets look like they originate
286from a node, the adversary can not tell which ones originate from that
287node and which ones were routed.
288Note that in this mindset, any node can decide to break the
289source-rewriting paradigm without violating the protocol, as this
290only reduces the amount of traffic that a node can hide its own traffic
291in.
292
293If we want to hide our actions in the traffic of other nodes, we must make
294our traffic indistinguishable from the traffic that we route for others.
295As our queries must have us as the receiver of the reply
296(otherwise they would be useless), we must put ourselves as the receiver
297of replies that actually go to other hosts; in other words, we must
298indirect replies.
299Unlike other systems, in anonymous file-sharing as implemented on top of
300GNUnet we do not have to indirect the replies if we don't think we need
301more traffic to hide our own actions.
302
303This increases the efficiency of the network as we can indirect less under
304higher load.@footnote{More details can be found in
305@uref{https://gnunet.org/gap, this paper}}
306
307@cindex Deniability
308@node Deniability
309@subsection Deniability
310
311Even if the user that downloads data and the server that provides data are
312anonymous, the intermediaries may still be targets. In particular, if the
313intermediaries can find out which queries or which content they are
314processing, a strong adversary could try to force them to censor
315certain materials.
316
317With the file-encoding used by GNUnet's anonymous file-sharing, this
318problem does not arise.
319The reason is that queries and replies are transmitted in
320an encrypted format such that intermediaries cannot tell what the query
321is for or what the content is about. Mind that this is not the same
322encryption as the link-encryption between the nodes. GNUnet has
323encryption on the network layer (link encryption, confidentiality,
324authentication) and again on the application layer (provided
325by @command{gnunet-publish}, @command{gnunet-download},
326@command{gnunet-search} and @command{gnunet-gtk}).@footnote{More details
327can be found @uref{https://gnunet.org/encoding, here}}
328
329@cindex Peer Identities
330@node Peer Identities
331@subsection Peer Identities
332
333Peer identities are used to identify peers in the network and are unique
334for each peer. The identity for a peer is simply its public key, which is
335generated along with a private key the peer is started for the first time.
336While the identity is binary data, it is often expressed as ASCII string.
337For example, the following is a peer identity as you might see it in
338various places:
339
340@example
341UAT1S6PMPITLBKSJ2DGV341JI6KF7B66AC4JVCN9811NNEGQLUN0
342@end example
343
344@noindent
345You can find your peer identity by running @command{gnunet-peerinfo -s}.
346
347@cindex GNS Zones
348@node Zones in the GNU Name System (GNS Zones)
349@subsection Zones in the GNU Name System (GNS Zones)
350
351GNS zones are similar to those of DNS zones, but instead of a hierarchy of
352authorities to governing their use, GNS zones are controlled by a private
353key.
354When you create a record in a DNS zone, that information stored in your
355nameserver. Anyone trying to resolve your domain then gets pointed
356(hopefully) by the centralised authority to your nameserver.
357Whereas GNS, being decentralised by design, stores that information in
358DHT. The validity of the records is assured cryptographically, by
359signing them with the private key of the respective zone.
360
361Anyone trying to resolve records in a zone your domain can then verify the
362signature on the records they get from the DHT and be assured that they
363are indeed from the respective zone. To make this work, there is a 1:1
364correspondence between zones and their public-private key pairs.
365So when we talk about the owner of a GNS zone, that's really the owner of
366the private key.
367And a user accessing a zone needs to somehow specify the corresponding
368public key first.
369
370@cindex Egos
371@node Egos
372@subsection Egos
373
374Egos are your "identities" in GNUnet. Any user can assume multiple
375identities, for example to separate teir activities online. Egos can
376correspond to pseudonyms or real-world identities. Technically, an
377ego is first of all a public-private key pair.
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/documentation/fdl-1.3.texi b/doc/documentation/fdl-1.3.texi
new file mode 100644
index 000000000..cb71f05a1
--- /dev/null
+++ b/doc/documentation/fdl-1.3.texi
@@ -0,0 +1,505 @@
1@c The GNU Free Documentation License.
2@center Version 1.3, 3 November 2008
3
4@c This file is intended to be included within another document,
5@c hence no sectioning command or @node.
6
7@display
8Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
9@uref{http://fsf.org/}
10
11Everyone is permitted to copy and distribute verbatim copies
12of this license document, but changing it is not allowed.
13@end display
14
15@enumerate 0
16@item
17PREAMBLE
18
19The purpose of this License is to make a manual, textbook, or other
20functional and useful document @dfn{free} in the sense of freedom: to
21assure everyone the effective freedom to copy and redistribute it,
22with or without modifying it, either commercially or noncommercially.
23Secondarily, this License preserves for the author and publisher a way
24to get credit for their work, while not being considered responsible
25for modifications made by others.
26
27This License is a kind of ``copyleft'', which means that derivative
28works of the document must themselves be free in the same sense. It
29complements the GNU General Public License, which is a copyleft
30license designed for free software.
31
32We have designed this License in order to use it for manuals for free
33software, because free software needs free documentation: a free
34program should come with manuals providing the same freedoms that the
35software does. But this License is not limited to software manuals;
36it can be used for any textual work, regardless of subject matter or
37whether it is published as a printed book. We recommend this License
38principally for works whose purpose is instruction or reference.
39
40@item
41APPLICABILITY AND DEFINITIONS
42
43This License applies to any manual or other work, in any medium, that
44contains a notice placed by the copyright holder saying it can be
45distributed under the terms of this License. Such a notice grants a
46world-wide, royalty-free license, unlimited in duration, to use that
47work under the conditions stated herein. The ``Document'', below,
48refers to any such manual or work. Any member of the public is a
49licensee, and is addressed as ``you''. You accept the license if you
50copy, modify or distribute the work in a way requiring permission
51under copyright law.
52
53A ``Modified Version'' of the Document means any work containing the
54Document or a portion of it, either copied verbatim, or with
55modifications and/or translated into another language.
56
57A ``Secondary Section'' is a named appendix or a front-matter section
58of the Document that deals exclusively with the relationship of the
59publishers or authors of the Document to the Document's overall
60subject (or to related matters) and contains nothing that could fall
61directly within that overall subject. (Thus, if the Document is in
62part a textbook of mathematics, a Secondary Section may not explain
63any mathematics.) The relationship could be a matter of historical
64connection with the subject or with related matters, or of legal,
65commercial, philosophical, ethical or political position regarding
66them.
67
68The ``Invariant Sections'' are certain Secondary Sections whose titles
69are designated, as being those of Invariant Sections, in the notice
70that says that the Document is released under this License. If a
71section does not fit the above definition of Secondary then it is not
72allowed to be designated as Invariant. The Document may contain zero
73Invariant Sections. If the Document does not identify any Invariant
74Sections then there are none.
75
76The ``Cover Texts'' are certain short passages of text that are listed,
77as Front-Cover Texts or Back-Cover Texts, in the notice that says that
78the Document is released under this License. A Front-Cover Text may
79be at most 5 words, and a Back-Cover Text may be at most 25 words.
80
81A ``Transparent'' copy of the Document means a machine-readable copy,
82represented in a format whose specification is available to the
83general public, that is suitable for revising the document
84straightforwardly with generic text editors or (for images composed of
85pixels) generic paint programs or (for drawings) some widely available
86drawing editor, and that is suitable for input to text formatters or
87for automatic translation to a variety of formats suitable for input
88to text formatters. A copy made in an otherwise Transparent file
89format whose markup, or absence of markup, has been arranged to thwart
90or discourage subsequent modification by readers is not Transparent.
91An image format is not Transparent if used for any substantial amount
92of text. A copy that is not ``Transparent'' is called ``Opaque''.
93
94Examples of suitable formats for Transparent copies include plain
95ASCII without markup, Texinfo input format, La@TeX{} input
96format, SGML or XML using a publicly available
97DTD, and standard-conforming simple HTML,
98PostScript or PDF designed for human modification. Examples
99of transparent image formats include PNG, XCF and
100JPG. Opaque formats include proprietary formats that can be
101read and edited only by proprietary word processors, SGML or
102XML for which the DTD and/or processing tools are
103not generally available, and the machine-generated HTML,
104PostScript or PDF produced by some word processors for
105output purposes only.
106
107The ``Title Page'' means, for a printed book, the title page itself,
108plus such following pages as are needed to hold, legibly, the material
109this License requires to appear in the title page. For works in
110formats which do not have any title page as such, ``Title Page'' means
111the text near the most prominent appearance of the work's title,
112preceding the beginning of the body of the text.
113
114The ``publisher'' means any person or entity that distributes copies
115of the Document to the public.
116
117A section ``Entitled XYZ'' means a named subunit of the Document whose
118title either is precisely XYZ or contains XYZ in parentheses following
119text that translates XYZ in another language. (Here XYZ stands for a
120specific section name mentioned below, such as ``Acknowledgements'',
121``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
122of such a section when you modify the Document means that it remains a
123section ``Entitled XYZ'' according to this definition.
124
125The Document may include Warranty Disclaimers next to the notice which
126states that this License applies to the Document. These Warranty
127Disclaimers are considered to be included by reference in this
128License, but only as regards disclaiming warranties: any other
129implication that these Warranty Disclaimers may have is void and has
130no effect on the meaning of this License.
131
132@item
133VERBATIM COPYING
134
135You may copy and distribute the Document in any medium, either
136commercially or noncommercially, provided that this License, the
137copyright notices, and the license notice saying this License applies
138to the Document are reproduced in all copies, and that you add no other
139conditions whatsoever to those of this License. You may not use
140technical measures to obstruct or control the reading or further
141copying of the copies you make or distribute. However, you may accept
142compensation in exchange for copies. If you distribute a large enough
143number of copies you must also follow the conditions in section 3.
144
145You may also lend copies, under the same conditions stated above, and
146you may publicly display copies.
147
148@item
149COPYING IN QUANTITY
150
151If you publish printed copies (or copies in media that commonly have
152printed covers) of the Document, numbering more than 100, and the
153Document's license notice requires Cover Texts, you must enclose the
154copies in covers that carry, clearly and legibly, all these Cover
155Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
156the back cover. Both covers must also clearly and legibly identify
157you as the publisher of these copies. The front cover must present
158the full title with all words of the title equally prominent and
159visible. You may add other material on the covers in addition.
160Copying with changes limited to the covers, as long as they preserve
161the title of the Document and satisfy these conditions, can be treated
162as verbatim copying in other respects.
163
164If the required texts for either cover are too voluminous to fit
165legibly, you should put the first ones listed (as many as fit
166reasonably) on the actual cover, and continue the rest onto adjacent
167pages.
168
169If you publish or distribute Opaque copies of the Document numbering
170more than 100, you must either include a machine-readable Transparent
171copy along with each Opaque copy, or state in or with each Opaque copy
172a computer-network location from which the general network-using
173public has access to download using public-standard network protocols
174a complete Transparent copy of the Document, free of added material.
175If you use the latter option, you must take reasonably prudent steps,
176when you begin distribution of Opaque copies in quantity, to ensure
177that this Transparent copy will remain thus accessible at the stated
178location until at least one year after the last time you distribute an
179Opaque copy (directly or through your agents or retailers) of that
180edition to the public.
181
182It is requested, but not required, that you contact the authors of the
183Document well before redistributing any large number of copies, to give
184them a chance to provide you with an updated version of the Document.
185
186@item
187MODIFICATIONS
188
189You may copy and distribute a Modified Version of the Document under
190the conditions of sections 2 and 3 above, provided that you release
191the Modified Version under precisely this License, with the Modified
192Version filling the role of the Document, thus licensing distribution
193and modification of the Modified Version to whoever possesses a copy
194of it. In addition, you must do these things in the Modified Version:
195
196@enumerate A
197@item
198Use in the Title Page (and on the covers, if any) a title distinct
199from that of the Document, and from those of previous versions
200(which should, if there were any, be listed in the History section
201of the Document). You may use the same title as a previous version
202if the original publisher of that version gives permission.
203
204@item
205List on the Title Page, as authors, one or more persons or entities
206responsible for authorship of the modifications in the Modified
207Version, together with at least five of the principal authors of the
208Document (all of its principal authors, if it has fewer than five),
209unless they release you from this requirement.
210
211@item
212State on the Title page the name of the publisher of the
213Modified Version, as the publisher.
214
215@item
216Preserve all the copyright notices of the Document.
217
218@item
219Add an appropriate copyright notice for your modifications
220adjacent to the other copyright notices.
221
222@item
223Include, immediately after the copyright notices, a license notice
224giving the public permission to use the Modified Version under the
225terms of this License, in the form shown in the Addendum below.
226
227@item
228Preserve in that license notice the full lists of Invariant Sections
229and required Cover Texts given in the Document's license notice.
230
231@item
232Include an unaltered copy of this License.
233
234@item
235Preserve the section Entitled ``History'', Preserve its Title, and add
236to it an item stating at least the title, year, new authors, and
237publisher of the Modified Version as given on the Title Page. If
238there is no section Entitled ``History'' in the Document, create one
239stating the title, year, authors, and publisher of the Document as
240given on its Title Page, then add an item describing the Modified
241Version as stated in the previous sentence.
242
243@item
244Preserve the network location, if any, given in the Document for
245public access to a Transparent copy of the Document, and likewise
246the network locations given in the Document for previous versions
247it was based on. These may be placed in the ``History'' section.
248You may omit a network location for a work that was published at
249least four years before the Document itself, or if the original
250publisher of the version it refers to gives permission.
251
252@item
253For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
254the Title of the section, and preserve in the section all the
255substance and tone of each of the contributor acknowledgements and/or
256dedications given therein.
257
258@item
259Preserve all the Invariant Sections of the Document,
260unaltered in their text and in their titles. Section numbers
261or the equivalent are not considered part of the section titles.
262
263@item
264Delete any section Entitled ``Endorsements''. Such a section
265may not be included in the Modified Version.
266
267@item
268Do not retitle any existing section to be Entitled ``Endorsements'' or
269to conflict in title with any Invariant Section.
270
271@item
272Preserve any Warranty Disclaimers.
273@end enumerate
274
275If the Modified Version includes new front-matter sections or
276appendices that qualify as Secondary Sections and contain no material
277copied from the Document, you may at your option designate some or all
278of these sections as invariant. To do this, add their titles to the
279list of Invariant Sections in the Modified Version's license notice.
280These titles must be distinct from any other section titles.
281
282You may add a section Entitled ``Endorsements'', provided it contains
283nothing but endorsements of your Modified Version by various
284parties---for example, statements of peer review or that the text has
285been approved by an organization as the authoritative definition of a
286standard.
287
288You may add a passage of up to five words as a Front-Cover Text, and a
289passage of up to 25 words as a Back-Cover Text, to the end of the list
290of Cover Texts in the Modified Version. Only one passage of
291Front-Cover Text and one of Back-Cover Text may be added by (or
292through arrangements made by) any one entity. If the Document already
293includes a cover text for the same cover, previously added by you or
294by arrangement made by the same entity you are acting on behalf of,
295you may not add another; but you may replace the old one, on explicit
296permission from the previous publisher that added the old one.
297
298The author(s) and publisher(s) of the Document do not by this License
299give permission to use their names for publicity for or to assert or
300imply endorsement of any Modified Version.
301
302@item
303COMBINING DOCUMENTS
304
305You may combine the Document with other documents released under this
306License, under the terms defined in section 4 above for modified
307versions, provided that you include in the combination all of the
308Invariant Sections of all of the original documents, unmodified, and
309list them all as Invariant Sections of your combined work in its
310license notice, and that you preserve all their Warranty Disclaimers.
311
312The combined work need only contain one copy of this License, and
313multiple identical Invariant Sections may be replaced with a single
314copy. If there are multiple Invariant Sections with the same name but
315different contents, make the title of each such section unique by
316adding at the end of it, in parentheses, the name of the original
317author or publisher of that section if known, or else a unique number.
318Make the same adjustment to the section titles in the list of
319Invariant Sections in the license notice of the combined work.
320
321In the combination, you must combine any sections Entitled ``History''
322in the various original documents, forming one section Entitled
323``History''; likewise combine any sections Entitled ``Acknowledgements'',
324and any sections Entitled ``Dedications''. You must delete all
325sections Entitled ``Endorsements.''
326
327@item
328COLLECTIONS OF DOCUMENTS
329
330You may make a collection consisting of the Document and other documents
331released under this License, and replace the individual copies of this
332License in the various documents with a single copy that is included in
333the collection, provided that you follow the rules of this License for
334verbatim copying of each of the documents in all other respects.
335
336You may extract a single document from such a collection, and distribute
337it individually under this License, provided you insert a copy of this
338License into the extracted document, and follow this License in all
339other respects regarding verbatim copying of that document.
340
341@item
342AGGREGATION WITH INDEPENDENT WORKS
343
344A compilation of the Document or its derivatives with other separate
345and independent documents or works, in or on a volume of a storage or
346distribution medium, is called an ``aggregate'' if the copyright
347resulting from the compilation is not used to limit the legal rights
348of the compilation's users beyond what the individual works permit.
349When the Document is included in an aggregate, this License does not
350apply to the other works in the aggregate which are not themselves
351derivative works of the Document.
352
353If the Cover Text requirement of section 3 is applicable to these
354copies of the Document, then if the Document is less than one half of
355the entire aggregate, the Document's Cover Texts may be placed on
356covers that bracket the Document within the aggregate, or the
357electronic equivalent of covers if the Document is in electronic form.
358Otherwise they must appear on printed covers that bracket the whole
359aggregate.
360
361@item
362TRANSLATION
363
364Translation is considered a kind of modification, so you may
365distribute translations of the Document under the terms of section 4.
366Replacing Invariant Sections with translations requires special
367permission from their copyright holders, but you may include
368translations of some or all Invariant Sections in addition to the
369original versions of these Invariant Sections. You may include a
370translation of this License, and all the license notices in the
371Document, and any Warranty Disclaimers, provided that you also include
372the original English version of this License and the original versions
373of those notices and disclaimers. In case of a disagreement between
374the translation and the original version of this License or a notice
375or disclaimer, the original version will prevail.
376
377If a section in the Document is Entitled ``Acknowledgements'',
378``Dedications'', or ``History'', the requirement (section 4) to Preserve
379its Title (section 1) will typically require changing the actual
380title.
381
382@item
383TERMINATION
384
385You may not copy, modify, sublicense, or distribute the Document
386except as expressly provided under this License. Any attempt
387otherwise to copy, modify, sublicense, or distribute it is void, and
388will automatically terminate your rights under this License.
389
390However, if you cease all violation of this License, then your license
391from a particular copyright holder is reinstated (a) provisionally,
392unless and until the copyright holder explicitly and finally
393terminates your license, and (b) permanently, if the copyright holder
394fails to notify you of the violation by some reasonable means prior to
39560 days after the cessation.
396
397Moreover, your license from a particular copyright holder is
398reinstated permanently if the copyright holder notifies you of the
399violation by some reasonable means, this is the first time you have
400received notice of violation of this License (for any work) from that
401copyright holder, and you cure the violation prior to 30 days after
402your receipt of the notice.
403
404Termination of your rights under this section does not terminate the
405licenses of parties who have received copies or rights from you under
406this License. If your rights have been terminated and not permanently
407reinstated, receipt of a copy of some or all of the same material does
408not give you any rights to use it.
409
410@item
411FUTURE REVISIONS OF THIS LICENSE
412
413The Free Software Foundation may publish new, revised versions
414of the GNU Free Documentation License from time to time. Such new
415versions will be similar in spirit to the present version, but may
416differ in detail to address new problems or concerns. See
417@uref{http://www.gnu.org/copyleft/}.
418
419Each version of the License is given a distinguishing version number.
420If the Document specifies that a particular numbered version of this
421License ``or any later version'' applies to it, you have the option of
422following the terms and conditions either of that specified version or
423of any later version that has been published (not as a draft) by the
424Free Software Foundation. If the Document does not specify a version
425number of this License, you may choose any version ever published (not
426as a draft) by the Free Software Foundation. If the Document
427specifies that a proxy can decide which future versions of this
428License can be used, that proxy's public statement of acceptance of a
429version permanently authorizes you to choose that version for the
430Document.
431
432@item
433RELICENSING
434
435``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
436World Wide Web server that publishes copyrightable works and also
437provides prominent facilities for anybody to edit those works. A
438public wiki that anybody can edit is an example of such a server. A
439``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
440site means any set of copyrightable works thus published on the MMC
441site.
442
443``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
444license published by Creative Commons Corporation, a not-for-profit
445corporation with a principal place of business in San Francisco,
446California, as well as future copyleft versions of that license
447published by that same organization.
448
449``Incorporate'' means to publish or republish a Document, in whole or
450in part, as part of another Document.
451
452An MMC is ``eligible for relicensing'' if it is licensed under this
453License, and if all works that were first published under this License
454somewhere other than this MMC, and subsequently incorporated in whole
455or in part into the MMC, (1) had no cover texts or invariant sections,
456and (2) were thus incorporated prior to November 1, 2008.
457
458The operator of an MMC Site may republish an MMC contained in the site
459under CC-BY-SA on the same site at any time before August 1, 2009,
460provided the MMC is eligible for relicensing.
461
462@end enumerate
463
464@page
465@heading ADDENDUM: How to use this License for your documents
466
467To use this License in a document you have written, include a copy of
468the License in the document and put the following copyright and
469license notices just after the title page:
470
471@smallexample
472@group
473 Copyright (C) @var{year} @var{your name}.
474 Permission is granted to copy, distribute and/or modify this document
475 under the terms of the GNU Free Documentation License, Version 1.3
476 or any later version published by the Free Software Foundation;
477 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
478 Texts. A copy of the license is included in the section entitled ``GNU
479 Free Documentation License''.
480@end group
481@end smallexample
482
483If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
484replace the ``with@dots{}Texts.''@: line with this:
485
486@smallexample
487@group
488 with the Invariant Sections being @var{list their titles}, with
489 the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
490 being @var{list}.
491@end group
492@end smallexample
493
494If you have Invariant Sections without Cover Texts, or some other
495combination of the three, merge those two alternatives to suit the
496situation.
497
498If your document contains nontrivial examples of program code, we
499recommend releasing these examples in parallel under your choice of
500free software license, such as the GNU General Public License,
501to permit their use in free software.
502
503@c Local Variables:
504@c ispell-local-pdict: "ispell-dict"
505@c End:
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/documentation/gnunet-c-tutorial.texi b/doc/documentation/gnunet-c-tutorial.texi
new file mode 100644
index 000000000..aca40d2ef
--- /dev/null
+++ b/doc/documentation/gnunet-c-tutorial.texi
@@ -0,0 +1,1520 @@
1\input texinfo
2@c %**start of header
3@setfilename gnunet-c-tutorial.info
4@documentencoding UTF-8
5@settitle GNUnet C Tutorial
6@exampleindent 2
7@c %**end of header
8
9@c including 'version.texi' makes makeinfo throw errors.
10@include version2.texi
11
12@copying
13Copyright @copyright{} 2001-2017 GNUnet e.V.
14
15Permission is granted to copy, distribute and/or modify this document
16under the terms of the GNU Free Documentation License, Version 1.3 or
17any later version published by the Free Software Foundation; with no
18Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
19copy of the license is included in the section entitled ``GNU Free
20Documentation License''.
21
22A copy of the license is also available from the Free Software
23Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
24
25Alternately, this document is also available under the General
26Public License, version 3 or later, as published by the Free Software
27Foundation. A copy of the license is included in the section entitled
28``GNU General Public License''.
29
30A copy of the license is also available from the Free Software
31Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
32@end copying
33
34@dircategory Tutorial
35@direntry
36* GNUnet-C-Tutorial: (gnunet-c-tutorial). C Tutorial for GNunet
37@end direntry
38
39
40@titlepage
41@title GNUnet C Tutorial
42@subtitle A Tutorial for GNUnet @value{VERSION} (C version)
43@author The GNUnet Developers
44
45@page
46@vskip 0pt plus 1filll
47
48@insertcopying
49@end titlepage
50
51@contents
52
53@c **** TODO
54@c 1. Update content?
55@c 2. Either reference main documentation or
56@c 3. Merge this into main documentation
57
58@node Top
59@top Introduction
60
61This tutorials explains how to install GNUnet on a
62GNU/Linux system and gives an introduction on how
63GNUnet can be used to develop a Peer-to-Peer application.
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).
69
70Please read this tutorial carefully since every single step is
71important and do not hesitate to contact the GNUnet team if you have
72any questions or problems! Check here how to contact the GNUnet
73team: @uref{https://gnunet.org/contact_information}
74
75@menu
76
77* Installing GNUnet:: Installing GNUnet
78* Introduction to GNUnet Architecture:: Introduction to GNUnet Architecture
79* First Steps with GNUnet:: First Steps with GNUnet
80* Developing Applications:: Developing Applications
81
82@detailmenu
83 --- The Detailed Node Listing ---
84
85Installing GNUnet
86
87* Obtaining a stable version::
88* Installing Build Tool Chain and Dependencies::
89* Obtaining the latest version from Git::
90* Compiling and Installing GNUnet::
91* Common Issues - Check your GNUnet installation::
92
93Introduction to GNUnet Architecture
94
95First Steps with GNUnet
96
97* Configure your peer::
98* Start a peer::
99* Monitor a peer::
100* Starting Two Peers by Hand::
101* Starting Peers Using the Testbed Service::
102
103Developing Applications
104
105* gnunet-ext::
106* Adapting the Template::
107* Writing a Client Application::
108* Writing a Service::
109* Interacting directly with other Peers using the CORE Service::
110* Storing peer-specific data using the PEERSTORE service::
111* Using the DHT::
112* Debugging with gnunet-arm::
113
114@end detailmenu
115@end menu
116
117@node Installing GNUnet
118@chapter Installing GNUnet
119
120First of all you have to install a current version of GNUnet.
121You can download a tarball of a stable version from GNU FTP mirrors
122or obtain the latest development version from our Git repository.
123
124Most of the time you should prefer to download the stable version
125since with the latest development version things can be broken,
126functionality can be changed or tests can fail. You should only use
127the development version if you know that you require a certain
128feature or a certain issue has been fixed since the last release.
129
130@menu
131* Obtaining a stable version::
132* Installing Build Tool Chain and Dependencies::
133* Obtaining the latest version from Git::
134* Compiling and Installing GNUnet::
135* Common Issues - Check your GNUnet installation::
136@end menu
137
138@node Obtaining a stable version
139@section Obtaining a stable version
140
141Download the tarball from
142@indicateurl{https://ftp.gnu.org/gnu/gnunet/gnunet-@value{VERSION}.tar.gz}.
143
144Make sure to download the associated @file{.sig} file and to verify the
145authenticity of the tarball against it, like this:
146
147@example
148$ wget https://ftp.gnu.org/gnu/gnunet/gnunet-@value{VERSION}.tar.gz.sig
149$ gpg --verify-files gnunet-@value{VERSION}.tar.gz.sig
150@end example
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
156@example
157$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E
158@end example
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
167@example
168$ tar xvzf gnunet-@value{VERSION}.tar.gz
169$ mv gnunet-@value{VERSION} gnunet
170$ cd gnunet
171@end example
172
173@noindent
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}.
177
178@node Installing Build Tool Chain and Dependencies
179@section Installing Build Tool Chain and Dependencies
180
181To successfully compile GNUnet you need the tools to build GNUnet and
182the required dependencies. Please have a look at
183@uref{https://gnunet.org/dependencies} for a list of required dependencies
184and @uref{https://gnunet.org/generic_installation} for specific
185instructions for your operating system. Please check the notes at
186the end of the configure process about required dependencies.
187
188For GNUnet bootstrapping support and the http(s) plugin you should
189install @uref{https://gnunet.org/gnurl, libgnurl}.
190For the filesharing service you should install at least one of the
191datastore backends. MySQL, SQlite and PostgreSQL are supported.
192
193@node Obtaining the latest version from Git
194@section Obtaining the latest version from Git
195
196The latest development version can obtained from our Git repository.
197To obtain the code you need Git installed and checkout the repository
198using:
199
200@example
201$ git clone https://gnunet.org/git/gnunet
202@end example
203
204@noindent
205After cloning the repository you have to execute the @file{bootstrap}
206script in the directory:
207
208@example
209$ cd gnunet ; ./bootstrap
210@end example
211
212@noindent
213The remainder of this tutorial assumes that you have the Git branch
214``master'' checked out.
215
216@node Compiling and Installing GNUnet
217@section Compiling and Installing GNUnet
218
219First, you need to install at least libgnupgerror 1.27 and
220libgcrypt 1.7.6.
221
222@example
223$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
224$ wget $GNUPGFTP/libgpg-error/libgpg-error-1.27.tar.bz2
225$ tar xf libgpg-error-1.27.tar.bz2
226$ cd libgpg-error-1.27
227$ ./configure
228$ sudo make install
229$ cd ..
230@end example
231
232@example
233$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
234$ wget $GNUPGFTP/libgcrypt/libgcrypt-1.7.6.tar.bz2
235$ tar xf libgcrypt-1.7.6.tar.bz2
236$ cd libgcrypt-1.7.6
237$ ./configure
238$ sudo make install
239$ cd ..
240@end example
241
242@menu
243* Installation::
244@end menu
245
246@node Installation
247@subsection Installation
248Assuming all dependencies are installed, the following commands will
249compile and install GNUnet in your home directory. You can specify the
250directory where GNUnet will be installed by changing the
251@code{--prefix} value when calling @command{./configure}. If
252you do not specifiy a prefix, GNUnet is installed in the directory
253@file{/usr/local}. When developing new applications you may want
254to enable verbose logging by adding @code{--enable-logging=verbose}:
255
256@example
257$ ./configure --prefix=$PREFIX --enable-logging
258$ make
259$ make install
260@end example
261
262@noindent
263After installing GNUnet you have to add your GNUnet installation
264to your path environmental variable. In addition you have to
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:
268
269@example
270$ export PATH=$PATH:$PREFIX/bin
271$ echo export PATH=$PREFIX/bin:\\$PATH >> ~/.bashrc
272$ mkdir ~/.config/
273$ touch ~/.config/gnunet.conf
274@end example
275
276@node Common Issues - Check your GNUnet installation
277@section Common Issues - Check your GNUnet installation
278
279You should check your installation to ensure that installing GNUnet
280was successful up to this point. You should be able to access GNUnet's
281binaries and run GNUnet's self check.
282
283@example
284$ which gnunet-arm
285@end example
286
287@noindent
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
292@example
293$ which gnunet-arm
294@end example
295
296@noindent
297check your PATH variable to ensure GNUnet's @file{bin} directory is
298included.
299
300GNUnet provides tests for all of its subcomponents. Run
301
302@example
303$ make check
304@end example
305
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:
310
311@example
312make[2]: Entering directory `/home/$USER/gnunet/contrib'
313PASS: test_gnunet_prefix
314=============
3151 test passed
316=============
317@end example
318
319@node Introduction to GNUnet Architecture
320@chapter Introduction to GNUnet Architecture
321
322GNUnet is organized in layers and services. Each service is composed of a
323main service implementation and a client library for other programs to use
324the service's functionality, described by an API.
325@c This approach is shown in
326@c FIXME: enable this once the commented block below works:
327@c figure~\ref fig:service.
328Some services provide an additional command line tool to enable the user
329to interact with the service.
330
331Very often it is other GNUnet services that will use these APIs to build
332the higher layers of GNUnet on top of the lower ones. Each layer expands
333or extends the functionality of the service below (for instance, to build
334a mesh on top of a DHT).
335@c FXIME: See comment above.
336@c See figure ~\ref fig:interaction for an illustration of this approach.
337
338@c ** @image filename[, width[, height[, alttext[, extension]]]]
339@c FIXME: Texlive (?) 20112 makes the assumption that this means
340@c 'images/OBJECTNAME.txt' but later versions of it (2017) use this
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}
347
348@c \begin{figure}[!h]
349@c \begin{center}
350@c % \begin{subfigure}
351@c \begin{subfigure}[b]{0.3\textwidth}
352@c \centering
353@c \includegraphics[width=\textwidth]{figs/Service.pdf}
354@c \caption{Service with API and network protocol}
355@c \label{fig:service}
356@c \end{subfigure}
357@c ~~~~~~~~~~
358@c \begin{subfigure}[b]{0.3\textwidth}
359@c \centering
360@c \includegraphics[width=\textwidth]{figs/System.pdf}
361@c \caption{Service interaction}
362@c \label{fig:interaction}
363@c \end{subfigure}
364@c \end{center}
365@c \caption{GNUnet's layered system architecture}
366@c \end{figure}
367
368The main service implementation runs as a standalone process in the
369operating system and the client code runs as part of the client program,
370so crashes of a client do not affect the service process or other clients.
371The service and the clients communicate via a message protocol to be
372defined and implemented by the programmer.
373
374@node First Steps with GNUnet
375@chapter First Steps with GNUnet
376
377@menu
378* Configure your peer::
379* Start a peer::
380* Monitor a peer::
381* Starting Two Peers by Hand::
382* Starting Peers Using the Testbed Service::
383@end menu
384
385@node Configure your peer
386@section Configure your peer
387
388First of all we need to configure your peer. Each peer is started with
389a configuration containing settings for GNUnet itself and its services.
390This configuration is based on the default configuration shipped with
391GNUnet and can be modified. The default configuration is located in the
392@file{$PREFIX/share/gnunet/config.d} directory. When starting a peer, you
393can specify a customized configuration using the the @command{-c} command
394line switch when starting the ARM service and all other services. When
395using a modified configuration the default values are loaded and only
396values specified in the configuration file will replace the default
397values.
398
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
403@example
404$ mkdir ~/gnunet1/
405$ touch peer1.conf
406@end example
407
408@noindent
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
411network since this could lead to confusing output. This modifications
412will replace the default settings:
413
414@example
415[PATHS]
416# Use this directory to store GNUnet data
417GNUNET_HOME = ~/gnunet1/
418[hostlist]
419# prevent bootstrapping
420SERVERS =
421@end example
422
423@node Start a peer
424@section Start a peer
425Each GNUnet instance (called peer) has an identity (peer ID) based on a
426cryptographic public private key pair. The peer ID is the printable hash
427of the public key.
428
429GNUnet services are controlled by a master service, the so called
430@dfn{Automatic Restart Manager} (ARM). ARM starts, stops and even
431restarts services automatically or on demand when a client connects.
432You interact with the ARM service using the @command{gnunet-arm} tool.
433GNUnet can then be started with @command{gnunet-arm -s} and stopped with
434@command{gnunet-arm -e}. An additional service not automatically started
435can be started using @command{gnunet-arm -i <service name>} and stopped
436using @command{gnunet-arm -k <servicename>}.
437
438Once you have started your peer, you can use many other GNUnet commands
439to interact with it. For example, you can run:
440
441@example
442$ gnunet-peerinfo -s
443@end example
444
445@noindent
446to obtain the public key of your peer.
447
448You should see an output containing the peer ID similar to:
449
450@example
451I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'.
452@end example
453
454@node Monitor a peer
455@section Monitor a peer
456
457In this section, we will monitor the behaviour of our peer's DHT
458service with respect to a specific key. First we will start
459GNUnet and then start the DHT service and use the DHT monitor tool
460to monitor the PUT and GET commands we issue ussing the
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:
464
465@example
466# start gnunet with all default services:
467$ gnunet-arm -c ~/peer1.conf -s
468# start DHT service:
469$ gnunet-arm -c ~/peer1.conf -i dht
470$ cd ~/gnunet/src/dht;
471$ ./gnunet-dht-monitor -c ~/peer1.conf -k KEY
472@end example
473
474@noindent
475Now open a separate terminal and change again to
476the @file{gnunet/src/dht} directory:
477
478@example
479$ cd ~/gnunet/src/dht
480# put VALUE under KEY in the DHT:
481$ ./gnunet-dht-put -c ~/peer1.conf -k KEY -d VALUE
482# get key KEY from the DHT:
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
488@end example
489
490@node Starting Two Peers by Hand
491@section Starting Two Peers by Hand
492
493This section describes how to start two peers on the same machine by hand.
494The process is rather painful, but the description is somewhat
495instructive. In practice, you might prefer the automated method
496(@pxref{Starting Peers Using the Testbed Service}).
497
498@menu
499* Setup a second peer::
500* Start the second peer and connect the peers::
501* How to connect manually::
502@end menu
503
504@node Setup a second peer
505@subsection Setup a second peer
506We will now start a second peer on your machine.
507For the second peer, you will need to manually create a modified
508configuration file to avoid conflicts with ports and directories.
509A peers configuration file is by default located
510in @file{~/.gnunet/gnunet.conf}. This file is typically very short
511or even empty as only the differences to the defaults need to be
512specified. The defaults are located in many files in the
513@file{$PREFIX/share/gnunet/config.d} directory.
514
515To configure the second peer, use the files
516@file{$PREFIX/share/gnunet/config.d} as a template for your main
517configuration file:
518
519@example
520$ cat $PREFIX/share/gnunet/config.d/*.conf > peer2.conf
521@end example
522
523@noindent
524Now you have to edit @file{peer2.conf} and change:
525
526@itemize
527@item @code{GNUNET\_TEST\_HOME} under @code{PATHS}
528@item Every (uncommented) value for ``@code{PORT}'' (add 10000) in any
529section (the option may be commented out if @code{PORT} is
530prefixed by "\#", in this case, UNIX domain sockets are used
531and the PORT option does not need to be touched)
532@item Every value for ``@code{UNIXPATH}'' in any section
533(e.g. by adding a "-p2" suffix)
534@end itemize
535
536to a fresh, unique value. Make sure that the PORT numbers stay
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.
540
541Now, generate the 2nd peer's private key:
542
543@example
544$ gnunet-peerinfo -s -c peer2.conf
545@end example
546
547@noindent
548This may take a while, generate entropy using your keyboard or mouse
549as needed. Also, make sure the output is different from the
550gnunet-peerinfo output for the first peer (otherwise you made an
551error in the configuration).
552
553@node Start the second peer and connect the peers
554@subsection Start the second peer and connect the peers
555
556Then, you can start a second peer using:
557
558@example
559$ gnunet-arm -c peer2.conf -s
560$ gnunet-arm -c peer2.conf -i dht
561$ ~/gnunet/src/dht/gnunet-dht-put -c peer2.conf -k KEY -d VALUE
562$ ~/gnunet/src/dht/gnunet-dht-get -c peer2.conf -k KEY
563@end example
564
565If you want the two peers to connect, you have multiple options:
566
567@itemize
568@item UDP neighbour discovery (automatic)
569@item Setup a bootstrap server
570@item Connect manually
571@end itemize
572
573To setup peer 1 as bootstrapping server change the configuration of
574the first one to be a hostlist server by adding the following lines to
575@file{peer1.conf} to enable bootstrapping server:
576
577@example
578[hostlist]
579OPTIONS = -p
580@end example
581
582@noindent
583Then change @file{peer2.conf} and replace the ``@code{SERVERS}''
584line in the ``@code{[hostlist]}'' section with
585``@code{http://localhost:8080/}''. Restart both peers using:
586
587@example
588# stop first peer
589$ gnunet-arm -c peer1.conf -e
590# start first peer
591$ gnunet-arm -c peer1.conf -s
592# start second peer
593$ gnunet-arm -c peer2.conf -s
594@end example
595
596@noindent
597Note that if you start your peers without changing these settings, they
598will use the ``global'' hostlist servers of the GNUnet P2P network and
599likely connect to those peers. At that point, debugging might become
600tricky as you're going to be connected to many more peers and would
601likely observe traffic and behaviors that are not explicitly controlled
602by you.
603
604@node How to connect manually
605@subsection How to connect manually
606
607If you want to use the @code{peerinfo} tool to connect your
608peers, you should:
609
610@itemize
611@item Set @code{FORCESTART = NO} in section @code{hostlist}
612(to not connect to the global GNUnet)
613@item Start both peers running @command{gnunet-arm -c peer1.conf -s}
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>'}
619@end itemize
620
621Check that they are connected using @command{gnunet-core -c peer1.conf},
622which should give you the other peer's peer identity:
623
624@example
625$ gnunet-core -c peer1.conf
626Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG'
627@end example
628
629@node Starting Peers Using the Testbed Service
630@section Starting Peers Using the Testbed Service
631@c \label{sec:testbed}
632
633GNUnet's testbed service is used for testing scenarios where
634a number of peers are to be started. The testbed can manage peers
635on a single host or on multiple hosts in a distributed fashion.
636On a single affordable computer, it should be possible to run
637around tens of peers without drastically increasing the load on the
638system.
639
640The testbed service can be access through its API
641@file{include/gnunet\_testbed\_service.h}. The API provides many
642routines for managing a group of peers. It also provides a helper
643function @code{GNUNET\_TESTBED\_test\_run()} to quickly setup a
644minimalistic testing environment on a single host.
645
646This function takes a configuration file which will be used as a
647template configuration for the peers. The testbed takes care of
648modifying relevant options in the peers' configuration such as
649@code{SERVICEHOME}, @code{PORT}, @code{UNIXPATH} to unique values
650so that peers run without running into conflicts. It also checks
651and assigns the ports in configurations only if they are free.
652
653Additionally, the testbed service also reads its options from the
654same configuration file. Various available options and details
655about them can be found in the testbed default configuration file
656@file{src/testbed/testbed.conf}.
657
658With the testbed API, a sample test case can be structured as follows:
659
660@example
661@verbatiminclude testbed_test.c
662@end example
663
664@noindent
665The source code for the above listing can be found at
666@uref{https://gnunet.org/git/gnunet.git/tree/doc/
667documentation/testbed_test.c}
668or in the @file{doc/documentation/} folder of your repository check-out.
669After installing GNUnet, the above source code can be compiled as:
670
671@example
672$ export CPPFLAGS="-I/path/to/gnunet/headers"
673$ export LDFLAGS="-L/path/to/gnunet/libraries"
674$ gcc $CPPFLAGS $LDFLAGS -o testbed-test testbed_test.c \
675 -lgnunettestbed -lgnunetdht -lgnunetutil
676# Generate (empty) configuration
677$ touch template.conf
678# run it (press CTRL-C to stop)
679$ ./testbed-test
680@end example
681
682@noindent
683The @code{CPPFLAGS} and @code{LDFLAGS} are necessary if GNUnet
684is installed into a different directory other than @file{/usr/local}.
685
686All of testbed API's peer management functions treat management
687actions as operations and return operation handles. It is expected
688that the operations begin immediately, but they may get delayed (to
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
693marked as ``done'' before their completion.
694
695An operation is treated as completed when it succeeds or fails.
696Completion of an operation is either conveyed as events through
697@i{controller event callback} or through respective operation
698completion callbacks. In functions which support completion
699notification through both controller event callback and operation
700completion callback, first the controller event callback will be
701called. If the operation is not marked as done in that callback
702or if the callback is given as NULL when creating the operation,
703the operation completion callback will be called. The API
704documentation shows which event are to be expected in the
705controller event notifications. It also documents any exceptional
706behaviour.
707
708Once the peers are started, test cases often need to connect
709some of the peers' services. Normally, opening a connect to
710a peer's service requires the peer's configuration. While using
711testbed, the testbed automatically generates per-peer configuration.
712Accessing those configurations directly through file system is
713discouraged as their locations are dynamically created and will be
714different among various runs of testbed. To make access to these
715configurations easy, testbed API provides the function
716@code{GNUNET\_TESTBED\_service\_connect()}. This function fetches
717the configuration of a given peer and calls the @i{Connect Adapter}.
718In the example code, it is the @code{dht\_ca}. A connect adapter is
719expected to open the connection to the needed service by using the
720provided configuration and return the created service connection handle.
721Successful connection to the needed service is signaled through
722@code{service\_connect\_comp\_cb}.
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}).
729
730Exercise: Find out how many peers you can run on your system.
731
732Exercise: Find out how to create a 2D torus topology by changing the
733options in the configuration file.
734See @uref{https://gnunet.org/supported-topologies}, then use the
735DHT API to store and retrieve values in the network.
736
737@node Developing Applications
738@chapter Developing Applications
739
740@menu
741* gnunet-ext::
742* Adapting the Template::
743* Writing a Client Application::
744* Writing a Service::
745* Interacting directly with other Peers using the CORE Service::
746* Storing peer-specific data using the PEERSTORE service::
747* Using the DHT::
748* Debugging with gnunet-arm::
749@end menu
750
751@node gnunet-ext
752@section gnunet-ext
753To develop a new peer-to-peer application or to extend GNUnet we provide
754a template build system for writing GNUnet extensions in C. It can be
755obtained as follows:
756
757@example
758$ git clone https://gnunet.org/git/gnunet-ext
759$ cd gnunet-ext/
760$ ./bootstrap
761$ ./configure --prefix=$PREFIX --with-gnunet=$PREFIX
762$ make
763$ make install
764$ make check
765@end example
766
767@noindent
768The GNUnet ext template includes examples and a working buildsystem
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:
772
773@itemize
774@item the GNUnet service (gnunet-ext/src/ext/gnunet-service-ext.c)
775@item the client API (gnunet-ext/src/ext/ext_api.c)
776@item the client application using the service API
777(gnunet-ext/src/ext/gnunet-ext.c)
778@end itemize
779
780The interfaces for these entities are defined in:
781
782@itemize
783@item client API interface (gnunet-ext/src/ext/ext.h)
784@item the service interface (gnunet-ext/src/include/gnunet_service_SERVICE.h)
785@item the P2P protocol (gnunet-ext/src/include/gnunet_protocols_ext.h)
786@end itemize
787
788
789In addition the ext systems provides:
790
791@itemize
792@item a test testing the API (gnunet-ext/src/ext/test_ext_api.c)
793@item a configuration template for the service
794(gnunet-ext/src/ext/ext.conf.in)
795@end itemize
796
797@node Adapting the Template
798@section Adapting the Template
799
800The first step for writing any extension with a new service is to
801ensure that the @file{ext.conf.in} file contains entries for the
802@code{UNIXPATH}, @code{PORT} and @code{BINARY} for the service in a
803section named after the service.
804
805If you want to adapt the template rename the @file{ext.conf.in} to
806match your services name, you have to modify the @code{AC\_OUTPUT}
807section in @file{configure.ac} in the @file{gnunet-ext} root.
808
809@node Writing a Client Application
810@section Writing a Client Application
811
812When writing any client application (for example, a command-line
813tool), the basic structure is to start with the
814@code{GNUNET\_PROGRAM\_run} function. This function will parse
815command-line options, setup the scheduler and then invoke the
816@code{run} function (with the remaining non-option arguments)
817and a handle to the parsed configuration (and the configuration
818file name that was used, which is typically not needed):
819
820@example
821@verbatiminclude tutorial-examples/001.c
822@end example
823
824@menu
825* Handling command-line options::
826* Writing a Client Library::
827* Writing a user interface::
828@end menu
829
830@node Handling command-line options
831@subsection Handling command-line options
832
833Options can then be added easily by adding global variables and
834expanding the @code{options} array. For example, the following would
835add a string-option and a binary flag (defaulting to @code{NULL} and
836@code{GNUNET\_NO} respectively):
837
838@example
839@verbatiminclude tutorial-examples/002.c
840@end example
841
842Issues such as displaying some helpful text describing options using
843the @code{--help} argument and error handling are taken care of when
844using this approach. Other @code{GNUNET\_GETOPT\_}-functions can be used
845to obtain integer value options, increment counters, etc. You can
846even write custom option parsers for special circumstances not covered
847by the available handlers. To check if an argument was specified by the
848user you initialize the variable with a specific value (e.g. NULL for
849a string and GNUNET\_SYSERR for a integer) and check after parsing
850happened if the values were modified.
851
852Inside the @code{run} method, the program would perform the
853application-specific logic, which typically involves initializing and
854using some client library to interact with the service. The client
855library is supposed to implement the IPC whereas the service provides
856more persistent P2P functions.
857
858Exercise: Add a few command-line options and print them inside
859of @code{run}. What happens if the user gives invalid arguments?
860
861@node Writing a Client Library
862@subsection Writing a Client Library
863
864The first and most important step in writing a client library is to
865decide on an API for the library. Typical API calls include
866connecting to the service, performing application-specific requests
867and cleaning up. Many examples for such service APIs can be found
868in the @file{gnunet/src/include/gnunet\_*\_service.h} files.
869
870Then, a client-service protocol needs to be designed. This typically
871involves defining various message formats in a header that will be
872included by both the service and the client library (but is otherwise
873not shared and hence located within the service's directory and not
874installed by @command{make install}). Each message must start with a
875@code{struct GNUNET\_MessageHeader} and must be shorter than 64k. By
876convention, all fields in IPC (and P2P) messages must be in big-endian
877format (and thus should be read using @code{ntohl} and similar
878functions and written using @code{htonl} and similar functions).
879Unique message types must be defined for each message struct in the
880@file{gnunet\_protocols.h} header (or an extension-specific include
881file).
882
883@menu
884* Connecting to the Service::
885* Sending messages::
886* Receiving Replies from the Service::
887@end menu
888
889@node Connecting to the Service
890@subsubsection Connecting to the Service
891
892Before a client library can implement the application-specific protocol
893with the service, a connection must be created:
894
895@example
896@verbatiminclude tutorial-examples/003.c
897@end example
898
899@noindent
900As a result a @code{GNUNET\_MQ\_Handle} is returned
901which can to used henceforth to transmit messages to the service.
902The complete MQ API can be found in @file{gnunet\_mq\_lib.h}.
903The @code{hanlders} array in the example above is incomplete.
904Here is where you will define which messages you expect to
905receive from the service, and which functions handle them.
906The @code{error\_cb} is a function that is to be called whenever
907there are errors communicating with the service.
908
909@node Sending messages
910@subsubsection Sending messages
911
912In GNUnet, messages are always sent beginning with a
913@code{struct GNUNET\_MessageHeader} in big endian format.
914This header defines the size and the type of the
915message, the payload follows after this header.
916
917@example
918@verbatiminclude tutorial-examples/004.c
919@end example
920
921@noindent
922Existing message types are defined in @file{gnunet\_protocols.h}.
923A common way to create a message is with an envelope:
924
925@example
926@verbatiminclude tutorial-examples/005.c
927@end example
928
929@noindent
930Exercise: Define a message struct that includes a 32-bit
931unsigned integer in addition to the standard GNUnet MessageHeader.
932Add a C struct and define a fresh protocol number for your message.
933Protocol numbers in gnunet-ext are defined
934in @file{gnunet-ext/src/include/gnunet_protocols_ext.h}
935
936Exercise: Find out how you can determine the number of messages
937in a message queue.
938
939Exercise: Find out how you can determine when a message you
940have queued was actually transmitted.
941
942Exercise: Define a helper function to transmit a 32-bit
943unsigned integer (as payload) to a service using some given client
944handle.
945
946@node Receiving Replies from the Service
947@subsubsection Receiving Replies from the Service
948
949Clients can receive messages from the service using the handlers
950specified in the @code{handlers} array we specified when connecting
951to the service. Entries in the the array are usually created using
952one of two macros, depending on whether the message is fixed size
953or variable size. Variable size messages are managed using two
954callbacks, one to check that the message is well-formed, the other
955to actually process the message. Fixed size messages are fully
956checked by the MQ-logic, and thus only need to provide the handler
957to process the message. Note that the prefixes @code{check\_}
958and @code{handle\_} are mandatory.
959
960@example
961@verbatiminclude tutorial-examples/006.c
962@end example
963
964@noindent
965Exercise: Expand your helper function to receive a response message
966(for example, containing just the @code{struct GNUnet MessageHeader}
967without any payload). Upon receiving the service's response, you
968should call a callback provided to your helper function's API.
969
970Exercise: Figure out where you can pass values to the
971closures (@code{cls}).
972
973@node Writing a user interface
974@subsection Writing a user interface
975
976Given a client library, all it takes to access a service now is to
977combine calls to the client library with parsing command-line
978options.
979
980Exercise: Call your client API from your @code{run()} method in your
981client application to send a request to the service. For example,
982send a 32-bit integer value based on a number given at the
983command-line to the service.
984
985@node Writing a Service
986@section Writing a Service
987
988Before you can test the client you've written so far, you'll
989need to also implement the corresponding service.
990
991@menu
992* Code Placement::
993* Starting a Service::
994@end menu
995
996@node Code Placement
997@subsection Code Placement
998
999New services are placed in their own subdirectory under
1000@file{gnunet/src}. This subdirectory should contain the API
1001implementation file @file{SERVICE\_api.c}, the description of
1002the client-service protocol @file{SERVICE.h} and P2P protocol
1003@file{SERVICE\_protocol.h}, the implementation of the service itself
1004@file{gnunet-service-SERVICE.h} and several files for tests,
1005including test code and configuration files.
1006
1007@node Starting a Service
1008@subsection Starting a Service
1009
1010The key API definition for creating a service is the
1011@code{GNUNET\_SERVICE\_MAIN} macro:
1012
1013@example
1014@verbatiminclude tutorial-examples/007.c
1015@end example
1016
1017@noindent
1018In addition to the service name and flags, the macro takes three
1019functions, typically called @code{run}, @code{client\_connect\_cb} and
1020@code{client\_disconnect\_cb} as well as an array of message handlers
1021that will be called for incoming messages from clients.
1022
1023A minimal version of the three central service funtions would look
1024like this:
1025
1026@example
1027@verbatiminclude tutorial-examples/008.c
1028@end example
1029
1030@noindent
1031Exercise: Write a stub service that processes no messages at all
1032in your code. Create a default configuration for it, integrate it
1033with the build system and start the service from
1034@command{gnunet-service-arm} using @command{gnunet-arm -i NAME}.
1035
1036Exercise: Figure out how to set the closure (@code{cls}) for handlers
1037of a service.
1038
1039Exercise: Figure out how to send messages from the service back to the
1040client.
1041
1042Each handler function in the service @b{must} eventually (possibly in some
1043asynchronous continuation) call
1044@code{GNUNET\_SERVICE\_client\_continue()}. Only after this call
1045additional messages from the same client may
1046be processed. This way, the service can throttle processing messages
1047from the same client.
1048
1049Exercise: Change the service to ``handle'' the message from your
1050client (for now, by printing a message). What happens if you
1051forget to call @code{GNUNET\_SERVICE\_client\_continue()}?
1052
1053@node Interacting directly with other Peers using the CORE Service
1054@section Interacting directly with other Peers using the CORE Service
1055
1056FIXME: This section still needs to be updated to the lastest API!
1057
1058One of the most important services in GNUnet is the @code{CORE} service
1059managing connections between peers and handling encryption between peers.
1060
1061One of the first things any service that extends the P2P protocol
1062typically does is connect to the @code{CORE} service using:
1063
1064@example
1065@verbatiminclude tutorial-examples/009.c
1066@end example
1067
1068@menu
1069* New P2P connections::
1070* Receiving P2P Messages::
1071* Sending P2P Messages::
1072* End of P2P connections::
1073@end menu
1074
1075@node New P2P connections
1076@subsection New P2P connections
1077
1078Before any traffic with a different peer can be exchanged, the peer must
1079be known to the service. This is notified by the @code{CORE}
1080@code{connects} callback, which communicates the identity of the new
1081peer to the service:
1082
1083@example
1084@verbatiminclude tutorial-examples/010.c
1085@end example
1086
1087@noindent
1088Note that whatever you return from @code{connects} is given as the
1089@i{cls} argument to the message handlers for messages from
1090the respective peer.
1091
1092Exercise: Create a service that connects to the @code{CORE}. Then
1093start (and connect) two peers and print a message once your connect
1094callback is invoked.
1095
1096@node Receiving P2P Messages
1097@subsection Receiving P2P Messages
1098
1099To receive messages from @code{CORE}, you pass the desired
1100@i{handlers} to the @code{GNUNET\_CORE\_connect()} function,
1101just as we showed for services.
1102
1103It is your responsibility to process messages fast enough or
1104to implement flow control. If an application does not process
1105CORE messages fast enough, CORE will randomly drop messages
1106to not keep a very long queue in memory.
1107
1108Exercise: Start one peer with a new service that has a message
1109handler and start a second peer that only has your ``old'' service
1110without message handlers. Which ``connect'' handlers are invoked when
1111the two peers are connected? Why?
1112
1113@node Sending P2P Messages
1114@subsection Sending P2P Messages
1115
1116You can transmit messages to other peers using the @i{mq} you were
1117given during the @code{connect} callback. Note that the @i{mq}
1118automatically is released upon @code{disconnect} and that you must
1119not use it afterwards.
1120
1121It is your responsibility to not over-fill the message queue, GNUnet
1122will send the messages roughly in the order given as soon as possible.
1123
1124Exercise: Write a service that upon connect sends messages as
1125fast as possible to the other peer (the other peer should run a
1126service that ``processes'' those messages). How fast is the
1127transmission? Count using the STATISTICS service on both ends. Are
1128messages lost? How can you transmit messages faster? What happens if
1129you stop the peer that is receiving your messages?
1130
1131@node End of P2P connections
1132@subsection End of P2P connections
1133
1134If a message handler returns @code{GNUNET\_SYSERR}, the remote
1135peer shuts down or there is an unrecoverable network
1136disconnection, CORE notifies the service that the peer disconnected.
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.
1139The disconnect callback looks like the following:
1140
1141@example
1142@verbatiminclude tutorial-examples/011.c
1143@end example
1144
1145@noindent
1146Exercise: Fix your service to handle peer disconnects.
1147
1148@node Storing peer-specific data using the PEERSTORE service
1149@section Storing peer-specific data using the PEERSTORE service
1150
1151GNUnet's PEERSTORE service offers a persistorage for arbitrary
1152peer-specific data. Other GNUnet services can use the PEERSTORE
1153to store, retrieve and monitor data records. Each data record
1154stored with PEERSTORE contains the following fields:
1155
1156@itemize
1157@item subsystem: Name of the subsystem responsible for the record.
1158@item peerid: Identity of the peer this record is related to.
1159@item key: a key string identifying the record.
1160@item value: binary record value.
1161@item expiry: record expiry date.
1162@end itemize
1163
1164The first step is to start a connection to the PEERSTORE service:
1165@example
1166@verbatiminclude tutorial-examples/012.c
1167@end example
1168
1169The service handle @code{peerstore_handle} will be needed for
1170all subsequent PEERSTORE operations.
1171
1172@menu
1173* Storing records::
1174* Retrieving records::
1175* Monitoring records::
1176* Disconnecting from PEERSTORE::
1177@end menu
1178
1179@node Storing records
1180@subsection Storing records
1181
1182To store a new record, use the following function:
1183
1184@example
1185@verbatiminclude tutorial-examples/013.c
1186@end example
1187
1188@noindent
1189The @code{options} parameter can either be
1190@code{GNUNET_PEERSTORE_STOREOPTION_MULTIPLE} which means that multiple
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.
1195
1196The continuation function @code{cont} will be called after the store
1197request is successfully sent to the PEERSTORE service. This does not
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:
1204
1205@example
1206@verbatiminclude tutorial-examples/013.1.c
1207@end example
1208
1209@node Retrieving records
1210@subsection Retrieving records
1211
1212To retrieve stored records, use the following function:
1213
1214@example
1215@verbatiminclude tutorial-examples/014.c
1216@end example
1217
1218@noindent
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
1223@itemize
1224@item (subsystem)
1225@item (subsystem, peerid)
1226@item (subsystem, key)
1227@item (subsystem, peerid, key)
1228@end itemize
1229
1230The @code{callback} function will be called once with each retrieved
1231record and once more with a @code{NULL} record to signal the end of
1232results.
1233
1234The @code{GNUNET_PEERSTORE_iterate} function returns a handle to the
1235iterate operation. This handle can be used to cancel the iterate
1236operation only before the callback function is called with a
1237@code{NULL} record.
1238
1239@node Monitoring records
1240@subsection Monitoring records
1241
1242PEERSTORE offers the functionality of monitoring for new records
1243stored under a specific key combination (subsystem, peerid, key).
1244To start the monitoring, use the following function:
1245
1246@example
1247@verbatiminclude tutorial-examples/015.c
1248@end example
1249
1250@noindent
1251Whenever a new record is stored under the given key combination,
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
1256@example
1257@verbatiminclude tutorial-examples/016.c
1258@end example
1259
1260@node Disconnecting from PEERSTORE
1261@subsection Disconnecting from PEERSTORE
1262
1263When the connection to the PEERSTORE service is no longer needed,
1264disconnect using the following function:
1265
1266@example
1267@verbatiminclude tutorial-examples/017.c
1268@end example
1269
1270@noindent
1271If the @code{sync_first} flag is set to @code{GNUNET_YES},
1272the API will delay the disconnection until all store requests
1273are received by the PEERSTORE service. Otherwise, it will
1274disconnect immediately.
1275
1276@node Using the DHT
1277@section Using the DHT
1278
1279The DHT allows to store data so other peers in the P2P network can
1280access it and retrieve data stored by any peers in the network.
1281This section will explain how to use the DHT. Of course, the first
1282thing to do is to connect to the DHT service:
1283
1284@example
1285@verbatiminclude tutorial-examples/018.c
1286@end example
1287
1288@noindent
1289The second parameter indicates how many requests in parallel to expect.
1290It is not a hard limit, but a good approximation will make the DHT more
1291efficient.
1292
1293@menu
1294* Storing data in the DHT::
1295* Obtaining data from the DHT::
1296* Implementing a block plugin::
1297* Monitoring the DHT::
1298@end menu
1299
1300@node Storing data in the DHT
1301@subsection Storing data in the DHT
1302Since the DHT is a dynamic environment (peers join and leave frequently)
1303the data that we put in the DHT does not stay there indefinitely. It is
1304important to ``refresh'' the data periodically by simply storing it
1305again, in order to make sure other peers can access it.
1306
1307The put API call offers a callback to signal that the PUT request has been
1308sent. This does not guarantee that the data is accessible to others peers,
1309or even that is has been stored, only that the service has requested to
1310a neighboring peer the retransmission of the PUT request towards its final
1311destination. Currently there is no feedback about whether or not the data
1312has been sucessfully stored or where it has been stored. In order to
1313improve the availablilty of the data and to compensate for possible
1314errors, peers leaving and other unfavorable events, just make several
1315PUT requests!
1316
1317@example
1318@verbatiminclude tutorial-examples/019.c
1319@end example
1320
1321@noindent
1322Exercise: Store a value in the DHT periodically to make sure it
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.
1326
1327@node Obtaining data from the DHT
1328@subsection Obtaining data from the DHT
1329
1330As we saw in the previous example, the DHT works in an asynchronous mode.
1331Each request to the DHT is executed ``in the background'' and the API
1332calls return immediately. In order to receive results from the DHT, the
1333API provides a callback. Once started, the request runs in the service,
1334the service will try to get as many results as possible (filtering out
1335duplicates) until the timeout expires or we explicitly stop the request.
1336It is possible to give a ``forever'' timeout with
1337@code{GNUNET\_TIME\_UNIT\_FOREVER\_REL}.
1338
1339If we give a route option @code{GNUNET\_DHT\_RO\_RECORD\_ROUTE}
1340the callback will get a list of all the peers the data has travelled,
1341both on the PUT path and on the GET path.
1342
1343@example
1344@verbatiminclude tutorial-examples/020.c
1345@end example
1346
1347@noindent
1348Exercise: Store a value in the DHT and after a while retrieve it.
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!
1353
1354@node Implementing a block plugin
1355@subsection Implementing a block plugin
1356
1357In order to store data in the DHT, it is necessary to provide a block
1358plugin. The DHT uses the block plugin to ensure that only well-formed
1359requests and replies are transmitted over the network.
1360
1361The block plugin should be put in a file @file{plugin\_block\_SERVICE.c}
1362in the service's respective directory. The
1363mandatory functions that need to be implemented for a block plugin are
1364described in the following sections.
1365
1366@menu
1367* Validating requests and replies::
1368* Deriving a key from a reply::
1369* Initialization of the plugin::
1370* Shutdown of the plugin::
1371* Integration of the plugin with the build system::
1372@end menu
1373
1374@node Validating requests and replies
1375@subsubsection Validating requests and replies
1376
1377The evaluate function should validate a reply or a request. It returns
1378a @code{GNUNET\_BLOCK\_EvaluationResult}, which is an enumeration. All
1379possible answers are in @file{gnunet\_block\_lib.h}. The function will
1380be called with a @code{reply\_block} argument of @code{NULL} for
1381requests. Note that depending on how @code{evaluate} is called, only
1382some of the possible return values are valid. The specific meaning of
1383the @code{xquery} argument is application-specific. Applications that
1384do not use an extended query should check that the @code{xquery\_size}
1385is zero. The block group is typically used to filter duplicate
1386replies.
1387
1388@example
1389@verbatiminclude tutorial-examples/021.c
1390@end example
1391
1392@noindent
1393Note that it is mandatory to detect duplicate replies in this function
1394and return the respective status code. Duplicate detection is
1395typically done using the Bloom filter block group provided by
1396@file{libgnunetblockgroup.so}. Failure to do so may cause replies to
1397circle in the network.
1398
1399@node Deriving a key from a reply
1400@subsubsection Deriving a key from a reply
1401
1402The DHT can operate more efficiently if it is possible to derive a key
1403from the value of the corresponding block. The @code{get\_key}
1404function is used to obtain the key of a block --- for example, by
1405means of hashing. If deriving the key is not possible, the function
1406should simply return @code{GNUNET\_SYSERR} (the DHT will still work
1407just fine with such blocks).
1408
1409@example
1410@verbatiminclude tutorial-examples/022.c
1411@end example
1412
1413@node Initialization of the plugin
1414@subsubsection Initialization of the plugin
1415
1416The plugin is realized as a shared C library. The library must export
1417an initialization function which should initialize the plugin. The
1418initialization function specifies what block types the plugin cares
1419about and returns a struct with the functions that are to be used for
1420validation and obtaining keys (the ones just defined above).
1421
1422@example
1423@verbatiminclude tutorial-examples/023.c
1424@end example
1425
1426@node Shutdown of the plugin
1427@subsubsection Shutdown of the plugin
1428
1429Following GNUnet's general plugin API concept, the plugin must
1430export a second function for cleaning up. It usually does very
1431little.
1432
1433@example
1434@verbatiminclude tutorial-examples/024.c
1435@end example
1436
1437@node Integration of the plugin with the build system
1438@subsubsection Integration of the plugin with the build system
1439
1440In order to compile the plugin, the @file{Makefile.am} file for the
1441service SERVICE should contain a rule similar to this:
1442@c Actually this is a Makefile not C. But the whole structure of examples
1443@c must be improved.
1444
1445@example
1446@verbatiminclude tutorial-examples/025.c
1447@end example
1448
1449@noindent
1450Exercise: Write a block plugin that accepts all queries
1451and all replies but prints information about queries and replies
1452when the respective validation hooks are called.
1453
1454@node Monitoring the DHT
1455@subsection Monitoring the DHT
1456
1457It is possible to monitor the functioning of the local
1458DHT service. When monitoring the DHT, the service will
1459alert the monitoring program of any events, both started
1460locally or received for routing from another peer.
1461The are three different types of events possible: a
1462GET request, a PUT request or a response (a reply to a GET).
1463
1464Since the different events have different associated data,
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
1470@example
1471@verbatiminclude tutorial-examples/026.c
1472@end example
1473
1474@node Debugging with gnunet-arm
1475@section Debugging with gnunet-arm
1476
1477Even if services are managed by @command{gnunet-arm}, you can
1478start them with @command{gdb} or @command{valgrind}. For
1479example, you could add the following lines to your
1480configuration file to start the DHT service in a @command{gdb}
1481session in a fresh @command{xterm}:
1482
1483@example
1484[dht]
1485PREFIX=xterm -e gdb --args
1486@end example
1487
1488@noindent
1489Alternatively, you can stop a service that was started via
1490ARM and run it manually:
1491
1492@example
1493$ gnunet-arm -k dht
1494$ gdb --args gnunet-service-dht -L DEBUG
1495$ valgrind gnunet-service-dht -L DEBUG
1496@end example
1497
1498@noindent
1499Assuming other services are well-written, they will automatically
1500re-integrate the restarted service with the peer.
1501
1502GNUnet provides a powerful logging mechanism providing log
1503levels @code{ERROR}, @code{WARNING}, @code{INFO} and @code{DEBUG}.
1504The current log level is configured using the @code{$GNUNET_FORCE_LOG}
1505environmental variable. The @code{DEBUG} level is only available if
1506@command{--enable-logging=verbose} was used when running
1507@command{configure}. More details about logging can be found under
1508@uref{https://gnunet.org/logging}.
1509
1510You should also probably enable the creation of core files, by setting
1511@code{ulimit}, and echo'ing @code{1} into
1512@file{/proc/sys/kernel/core\_uses\_pid}. Then you can investigate the
1513core dumps with @command{gdb}, which is often the fastest method to
1514find simple errors.
1515
1516Exercise: Add a memory leak to your service and obtain a trace
1517pointing to the leak using @command{valgrind} while running the service
1518from @command{gnunet-service-arm}.
1519
1520@bye
diff --git a/doc/documentation/gnunet.texi b/doc/documentation/gnunet.texi
new file mode 100644
index 000000000..2497d4b09
--- /dev/null
+++ b/doc/documentation/gnunet.texi
@@ -0,0 +1,261 @@
1\input texinfo
2@c -*-texinfo-*-
3
4@c %**start of header
5@setfilename gnunet.info
6@documentencoding UTF-8
7@settitle GNUnet Reference Manual
8@exampleindent 2
9@urefbreakstyle before
10@c %**end of header
11
12@include version.texi
13
14@c Set Versions which might be used in more than one place:
15@set GNUFTP-URL https://ftp.gnu.org/gnu/gnunet
16@set PYPI-URL https://pypi.python.org/packages/source
17@set GNURL-VERSION-CURRENT 7.55.1
18@set GNUNET-DIST-URL https://gnunet.org/sites/default/files/
19@c @set OPENPGP-SIGNING-KEY-ID
20
21@copying
22Copyright @copyright{} 2001-2017 GNUnet e.V.
23
24Permission is granted to copy, distribute and/or modify this document
25under the terms of the GNU Free Documentation License, Version 1.3 or
26any later version published by the Free Software Foundation; with no
27Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
28copy of the license is included in the section entitled ``GNU Free
29Documentation License''.
30
31A copy of the license is also available from the Free Software
32Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
33
34Alternately, this document is also available under the General
35Public License, version 3 or later, as published by the Free Software
36Foundation. A copy of the license is included in the section entitled
37``GNU General Public License''.
38
39A copy of the license is also available from the Free Software
40Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
41@end copying
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
50@titlepage
51@title GNUnet Reference Manual
52@subtitle Installing, configuring, using and contributing to GNUnet
53@author The GNUnet Developers
54
55@page
56@vskip 0pt plus 1filll
57Edition @value{EDITION} @*
58@value{UPDATED} @*
59
60@insertcopying
61@end titlepage
62
63@summarycontents
64@contents
65
66@node Top
67@top Contributing to GNUnet
68
69
70This document describes GNUnet version @value{VERSION}.
71
72
73GNUnet is a @uref{http://www.gnu.org/, GNU} package.
74All code contributions must thus be put under the
75@uref{http://www.gnu.org/copyleft/gpl.html, GNU Public License (GPL)}.
76All documentation should be put under FSF approved licenses
77(see @uref{http://www.gnu.org/copyleft/fdl.html, fdl}).
78
79By submitting documentation, translations, comments and other
80content to this website you automatically grant the right to publish
81code under the GNU Public License and documentation under either or
82both the GNU Public License or the GNU Free Documentation License.
83When contributing to the GNUnet project, GNU standards and the
84@uref{http://www.gnu.org/philosophy/philosophy.html, GNU philosophy}
85should be adhered to.
86
87Note that we do now require a formal copyright assignment for GNUnet
88contributors to GNUnet e.V.; nevertheless, we do allow pseudonymous
89contributions. By signing the copyright agreement and submitting your
90code (or documentation) to us, you agree to share the rights to your
91code with GNUnet e.V.; GNUnet e.V. receives non-exclusive ownership
92rights, and in particular is allowed to dual-license the code. You
93retain non-exclusive rights to your contributions, so you can also
94share your contributions freely with other projects.
95
96GNUnet e.V. will publish all accepted contributions under the GPLv3
97or any later version. The association may decide to publish
98contributions under additional licenses (dual-licensing).
99
100We do not intentionally remove your name from your contributions;
101however, due to extensive editing it is not always trivial to
102attribute contributors properly. If you find that you significantly
103contributed to a file (or the project as a whole) and are not listed
104in the respective authors file or section, please do let us know.
105
106
107
108@menu
109
110* Philosophy:: About GNUnet
111* Vocabulary:: Vocabulary
112* GNUnet Installation Handbook:: How to install GNUnet
113* Using GNUnet:: Using GNUnet
114* Configuration Handbook:: Configuring GNUnet
115* GNUnet Developer Handbook:: Developing GNUnet
116* GNU Free Documentation License:: The license of this manual.
117* GNU General Public License:: The license of this manual.
118* Concept Index:: Concepts.
119* Programming Index:: Data types, functions, and variables.
120
121@detailmenu
122 --- The Detailed Node Listing ---
123
124Philosophy
125
126* Design Goals::
127* Security & Privacy::
128* Versatility::
129* Practicality::
130* Key Concepts::
131* Authentication::
132* Accounting to Encourage Resource Sharing::
133* Confidentiality::
134* Anonymity::
135* Deniability::
136* Peer Identities::
137* Zones in the GNU Name System (GNS Zones)::
138* Egos::
139* Backup of Identities and Egos::
140* Revocation::
141
142Vocabulary
143
144* Words and characters::
145* Technical Assumptions::
146
147GNUnet Installation Handbook
148
149* 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::
213
214@end detailmenu
215@end menu
216
217@c *********************************************************************
218@include chapters/philosophy.texi
219@c *********************************************************************
220
221@include chapters/vocabulary.texi
222
223@c *********************************************************************
224@include chapters/installation.texi
225@c *********************************************************************
226
227@c *********************************************************************
228@include chapters/user.texi
229@c *********************************************************************
230
231@include chapters/configuration.texi
232
233@c *********************************************************************
234@include chapters/developer.texi
235@c @include gnunet-c-tutorial.texi
236@c *********************************************************************
237
238@c *********************************************************************
239@node GNU Free Documentation License
240@appendix GNU Free Documentation License
241@cindex license, GNU Free Documentation License
242@include fdl-1.3.texi
243
244@c *********************************************************************
245@node GNU General Public License
246@appendix GNU General Public License
247@cindex license, GNU General Public License
248@include gpl-3.0.texi
249
250@c *********************************************************************
251@node Concept Index
252@unnumbered Concept Index
253@printindex cp
254
255@node Programming Index
256@unnumbered Programming Index
257@syncodeindex tp fn
258@syncodeindex vr fn
259@printindex fn
260
261@bye
diff --git a/doc/documentation/gpl-3.0.texi b/doc/documentation/gpl-3.0.texi
new file mode 100644
index 000000000..0e2e212ac
--- /dev/null
+++ b/doc/documentation/gpl-3.0.texi
@@ -0,0 +1,717 @@
1@c The GNU General Public License.
2@center Version 3, 29 June 2007
3
4@c This file is intended to be included within another document,
5@c hence no sectioning command or @node.
6
7@display
8Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
9
10Everyone is permitted to copy and distribute verbatim copies of this
11license document, but changing it is not allowed.
12@end display
13
14@heading Preamble
15
16The GNU General Public License is a free, copyleft license for
17software and other kinds of works.
18
19The licenses for most software and other practical works are designed
20to take away your freedom to share and change the works. By contrast,
21the GNU General Public License is intended to guarantee your freedom
22to share and change all versions of a program---to make sure it remains
23free software for all its users. We, the Free Software Foundation,
24use the GNU General Public License for most of our software; it
25applies also to any other work released this way by its authors. You
26can apply it to your programs, too.
27
28When we speak of free software, we are referring to freedom, not
29price. Our General Public Licenses are designed to make sure that you
30have the freedom to distribute copies of free software (and charge for
31them if you wish), that you receive source code or can get it if you
32want it, that you can change the software or use pieces of it in new
33free programs, and that you know you can do these things.
34
35To protect your rights, we need to prevent others from denying you
36these rights or asking you to surrender the rights. Therefore, you
37have certain responsibilities if you distribute copies of the
38software, or if you modify it: responsibilities to respect the freedom
39of others.
40
41For example, if you distribute copies of such a program, whether
42gratis or for a fee, you must pass on to the recipients the same
43freedoms that you received. You must make sure that they, too,
44receive or can get the source code. And you must show them these
45terms so they know their rights.
46
47Developers that use the GNU GPL protect your rights with two steps:
48(1) assert copyright on the software, and (2) offer you this License
49giving you legal permission to copy, distribute and/or modify it.
50
51For the developers' and authors' protection, the GPL clearly explains
52that there is no warranty for this free software. For both users' and
53authors' sake, the GPL requires that modified versions be marked as
54changed, so that their problems will not be attributed erroneously to
55authors of previous versions.
56
57Some devices are designed to deny users access to install or run
58modified versions of the software inside them, although the
59manufacturer can do so. This is fundamentally incompatible with the
60aim of protecting users' freedom to change the software. The
61systematic pattern of such abuse occurs in the area of products for
62individuals to use, which is precisely where it is most unacceptable.
63Therefore, we have designed this version of the GPL to prohibit the
64practice for those products. If such problems arise substantially in
65other domains, we stand ready to extend this provision to those
66domains in future versions of the GPL, as needed to protect the
67freedom of users.
68
69Finally, every program is threatened constantly by software patents.
70States should not allow patents to restrict development and use of
71software on general-purpose computers, but in those that do, we wish
72to avoid the special danger that patents applied to a free program
73could make it effectively proprietary. To prevent this, the GPL
74assures that patents cannot be used to render the program non-free.
75
76The precise terms and conditions for copying, distribution and
77modification follow.
78
79@heading TERMS AND CONDITIONS
80
81@enumerate 0
82@item Definitions.
83
84``This License'' refers to version 3 of the GNU General Public License.
85
86``Copyright'' also means copyright-like laws that apply to other kinds
87of works, such as semiconductor masks.
88
89``The Program'' refers to any copyrightable work licensed under this
90License. Each licensee is addressed as ``you''. ``Licensees'' and
91``recipients'' may be individuals or organizations.
92
93To ``modify'' a work means to copy from or adapt all or part of the work
94in a fashion requiring copyright permission, other than the making of
95an exact copy. The resulting work is called a ``modified version'' of
96the earlier work or a work ``based on'' the earlier work.
97
98A ``covered work'' means either the unmodified Program or a work based
99on the Program.
100
101To ``propagate'' a work means to do anything with it that, without
102permission, would make you directly or secondarily liable for
103infringement under applicable copyright law, except executing it on a
104computer or modifying a private copy. Propagation includes copying,
105distribution (with or without modification), making available to the
106public, and in some countries other activities as well.
107
108To ``convey'' a work means any kind of propagation that enables other
109parties to make or receive copies. Mere interaction with a user
110through a computer network, with no transfer of a copy, is not
111conveying.
112
113An interactive user interface displays ``Appropriate Legal Notices'' to
114the extent that it includes a convenient and prominently visible
115feature that (1) displays an appropriate copyright notice, and (2)
116tells the user that there is no warranty for the work (except to the
117extent that warranties are provided), that licensees may convey the
118work under this License, and how to view a copy of this License. If
119the interface presents a list of user commands or options, such as a
120menu, a prominent item in the list meets this criterion.
121
122@item Source Code.
123
124The ``source code'' for a work means the preferred form of the work for
125making modifications to it. ``Object code'' means any non-source form
126of a work.
127
128A ``Standard Interface'' means an interface that either is an official
129standard defined by a recognized standards body, or, in the case of
130interfaces specified for a particular programming language, one that
131is widely used among developers working in that language.
132
133The ``System Libraries'' of an executable work include anything, other
134than the work as a whole, that (a) is included in the normal form of
135packaging a Major Component, but which is not part of that Major
136Component, and (b) serves only to enable use of the work with that
137Major Component, or to implement a Standard Interface for which an
138implementation is available to the public in source code form. A
139``Major Component'', in this context, means a major essential component
140(kernel, window system, and so on) of the specific operating system
141(if any) on which the executable work runs, or a compiler used to
142produce the work, or an object code interpreter used to run it.
143
144The ``Corresponding Source'' for a work in object code form means all
145the source code needed to generate, install, and (for an executable
146work) run the object code and to modify the work, including scripts to
147control those activities. However, it does not include the work's
148System Libraries, or general-purpose tools or generally available free
149programs which are used unmodified in performing those activities but
150which are not part of the work. For example, Corresponding Source
151includes interface definition files associated with source files for
152the work, and the source code for shared libraries and dynamically
153linked subprograms that the work is specifically designed to require,
154such as by intimate data communication or control flow between those
155subprograms and other parts of the work.
156
157The Corresponding Source need not include anything that users can
158regenerate automatically from other parts of the Corresponding Source.
159
160The Corresponding Source for a work in source code form is that same
161work.
162
163@item Basic Permissions.
164
165All rights granted under this License are granted for the term of
166copyright on the Program, and are irrevocable provided the stated
167conditions are met. This License explicitly affirms your unlimited
168permission to run the unmodified Program. The output from running a
169covered work is covered by this License only if the output, given its
170content, constitutes a covered work. This License acknowledges your
171rights of fair use or other equivalent, as provided by copyright law.
172
173You may make, run and propagate covered works that you do not convey,
174without conditions so long as your license otherwise remains in force.
175You may convey covered works to others for the sole purpose of having
176them make modifications exclusively for you, or provide you with
177facilities for running those works, provided that you comply with the
178terms of this License in conveying all material for which you do not
179control copyright. Those thus making or running the covered works for
180you must do so exclusively on your behalf, under your direction and
181control, on terms that prohibit them from making any copies of your
182copyrighted material outside their relationship with you.
183
184Conveying under any other circumstances is permitted solely under the
185conditions stated below. Sublicensing is not allowed; section 10
186makes it unnecessary.
187
188@item Protecting Users' Legal Rights From Anti-Circumvention Law.
189
190No covered work shall be deemed part of an effective technological
191measure under any applicable law fulfilling obligations under article
19211 of the WIPO copyright treaty adopted on 20 December 1996, or
193similar laws prohibiting or restricting circumvention of such
194measures.
195
196When you convey a covered work, you waive any legal power to forbid
197circumvention of technological measures to the extent such
198circumvention is effected by exercising rights under this License with
199respect to the covered work, and you disclaim any intention to limit
200operation or modification of the work as a means of enforcing, against
201the work's users, your or third parties' legal rights to forbid
202circumvention of technological measures.
203
204@item Conveying Verbatim Copies.
205
206You may convey verbatim copies of the Program's source code as you
207receive it, in any medium, provided that you conspicuously and
208appropriately publish on each copy an appropriate copyright notice;
209keep intact all notices stating that this License and any
210non-permissive terms added in accord with section 7 apply to the code;
211keep intact all notices of the absence of any warranty; and give all
212recipients a copy of this License along with the Program.
213
214You may charge any price or no price for each copy that you convey,
215and you may offer support or warranty protection for a fee.
216
217@item Conveying Modified Source Versions.
218
219You may convey a work based on the Program, or the modifications to
220produce it from the Program, in the form of source code under the
221terms of section 4, provided that you also meet all of these
222conditions:
223
224@enumerate a
225@item
226The work must carry prominent notices stating that you modified it,
227and giving a relevant date.
228
229@item
230The work must carry prominent notices stating that it is released
231under this License and any conditions added under section 7. This
232requirement modifies the requirement in section 4 to ``keep intact all
233notices''.
234
235@item
236You must license the entire work, as a whole, under this License to
237anyone who comes into possession of a copy. This License will
238therefore apply, along with any applicable section 7 additional terms,
239to the whole of the work, and all its parts, regardless of how they
240are packaged. This License gives no permission to license the work in
241any other way, but it does not invalidate such permission if you have
242separately received it.
243
244@item
245If the work has interactive user interfaces, each must display
246Appropriate Legal Notices; however, if the Program has interactive
247interfaces that do not display Appropriate Legal Notices, your work
248need not make them do so.
249@end enumerate
250
251A compilation of a covered work with other separate and independent
252works, which are not by their nature extensions of the covered work,
253and which are not combined with it such as to form a larger program,
254in or on a volume of a storage or distribution medium, is called an
255``aggregate'' if the compilation and its resulting copyright are not
256used to limit the access or legal rights of the compilation's users
257beyond what the individual works permit. Inclusion of a covered work
258in an aggregate does not cause this License to apply to the other
259parts of the aggregate.
260
261@item Conveying Non-Source Forms.
262
263You may convey a covered work in object code form under the terms of
264sections 4 and 5, provided that you also convey the machine-readable
265Corresponding Source under the terms of this License, in one of these
266ways:
267
268@enumerate a
269@item
270Convey the object code in, or embodied in, a physical product
271(including a physical distribution medium), accompanied by the
272Corresponding Source fixed on a durable physical medium customarily
273used for software interchange.
274
275@item
276Convey the object code in, or embodied in, a physical product
277(including a physical distribution medium), accompanied by a written
278offer, valid for at least three years and valid for as long as you
279offer spare parts or customer support for that product model, to give
280anyone who possesses the object code either (1) a copy of the
281Corresponding Source for all the software in the product that is
282covered by this License, on a durable physical medium customarily used
283for software interchange, for a price no more than your reasonable
284cost of physically performing this conveying of source, or (2) access
285to copy the Corresponding Source from a network server at no charge.
286
287@item
288Convey individual copies of the object code with a copy of the written
289offer to provide the Corresponding Source. This alternative is
290allowed only occasionally and noncommercially, and only if you
291received the object code with such an offer, in accord with subsection
2926b.
293
294@item
295Convey the object code by offering access from a designated place
296(gratis or for a charge), and offer equivalent access to the
297Corresponding Source in the same way through the same place at no
298further charge. You need not require recipients to copy the
299Corresponding Source along with the object code. If the place to copy
300the object code is a network server, the Corresponding Source may be
301on a different server (operated by you or a third party) that supports
302equivalent copying facilities, provided you maintain clear directions
303next to the object code saying where to find the Corresponding Source.
304Regardless of what server hosts the Corresponding Source, you remain
305obligated to ensure that it is available for as long as needed to
306satisfy these requirements.
307
308@item
309Convey the object code using peer-to-peer transmission, provided you
310inform other peers where the object code and Corresponding Source of
311the work are being offered to the general public at no charge under
312subsection 6d.
313
314@end enumerate
315
316A separable portion of the object code, whose source code is excluded
317from the Corresponding Source as a System Library, need not be
318included in conveying the object code work.
319
320A ``User Product'' is either (1) a ``consumer product'', which means any
321tangible personal property which is normally used for personal,
322family, or household purposes, or (2) anything designed or sold for
323incorporation into a dwelling. In determining whether a product is a
324consumer product, doubtful cases shall be resolved in favor of
325coverage. For a particular product received by a particular user,
326``normally used'' refers to a typical or common use of that class of
327product, regardless of the status of the particular user or of the way
328in which the particular user actually uses, or expects or is expected
329to use, the product. A product is a consumer product regardless of
330whether the product has substantial commercial, industrial or
331non-consumer uses, unless such uses represent the only significant
332mode of use of the product.
333
334``Installation Information'' for a User Product means any methods,
335procedures, authorization keys, or other information required to
336install and execute modified versions of a covered work in that User
337Product from a modified version of its Corresponding Source. The
338information must suffice to ensure that the continued functioning of
339the modified object code is in no case prevented or interfered with
340solely because modification has been made.
341
342If you convey an object code work under this section in, or with, or
343specifically for use in, a User Product, and the conveying occurs as
344part of a transaction in which the right of possession and use of the
345User Product is transferred to the recipient in perpetuity or for a
346fixed term (regardless of how the transaction is characterized), the
347Corresponding Source conveyed under this section must be accompanied
348by the Installation Information. But this requirement does not apply
349if neither you nor any third party retains the ability to install
350modified object code on the User Product (for example, the work has
351been installed in ROM).
352
353The requirement to provide Installation Information does not include a
354requirement to continue to provide support service, warranty, or
355updates for a work that has been modified or installed by the
356recipient, or for the User Product in which it has been modified or
357installed. Access to a network may be denied when the modification
358itself materially and adversely affects the operation of the network
359or violates the rules and protocols for communication across the
360network.
361
362Corresponding Source conveyed, and Installation Information provided,
363in accord with this section must be in a format that is publicly
364documented (and with an implementation available to the public in
365source code form), and must require no special password or key for
366unpacking, reading or copying.
367
368@item Additional Terms.
369
370``Additional permissions'' are terms that supplement the terms of this
371License by making exceptions from one or more of its conditions.
372Additional permissions that are applicable to the entire Program shall
373be treated as though they were included in this License, to the extent
374that they are valid under applicable law. If additional permissions
375apply only to part of the Program, that part may be used separately
376under those permissions, but the entire Program remains governed by
377this License without regard to the additional permissions.
378
379When you convey a copy of a covered work, you may at your option
380remove any additional permissions from that copy, or from any part of
381it. (Additional permissions may be written to require their own
382removal in certain cases when you modify the work.) You may place
383additional permissions on material, added by you to a covered work,
384for which you have or can give appropriate copyright permission.
385
386Notwithstanding any other provision of this License, for material you
387add to a covered work, you may (if authorized by the copyright holders
388of that material) supplement the terms of this License with terms:
389
390@enumerate a
391@item
392Disclaiming warranty or limiting liability differently from the terms
393of sections 15 and 16 of this License; or
394
395@item
396Requiring preservation of specified reasonable legal notices or author
397attributions in that material or in the Appropriate Legal Notices
398displayed by works containing it; or
399
400@item
401Prohibiting misrepresentation of the origin of that material, or
402requiring that modified versions of such material be marked in
403reasonable ways as different from the original version; or
404
405@item
406Limiting the use for publicity purposes of names of licensors or
407authors of the material; or
408
409@item
410Declining to grant rights under trademark law for use of some trade
411names, trademarks, or service marks; or
412
413@item
414Requiring indemnification of licensors and authors of that material by
415anyone who conveys the material (or modified versions of it) with
416contractual assumptions of liability to the recipient, for any
417liability that these contractual assumptions directly impose on those
418licensors and authors.
419@end enumerate
420
421All other non-permissive additional terms are considered ``further
422restrictions'' within the meaning of section 10. If the Program as you
423received it, or any part of it, contains a notice stating that it is
424governed by this License along with a term that is a further
425restriction, you may remove that term. If a license document contains
426a further restriction but permits relicensing or conveying under this
427License, you may add to a covered work material governed by the terms
428of that license document, provided that the further restriction does
429not survive such relicensing or conveying.
430
431If you add terms to a covered work in accord with this section, you
432must place, in the relevant source files, a statement of the
433additional terms that apply to those files, or a notice indicating
434where to find the applicable terms.
435
436Additional terms, permissive or non-permissive, may be stated in the
437form of a separately written license, or stated as exceptions; the
438above requirements apply either way.
439
440@item Termination.
441
442You may not propagate or modify a covered work except as expressly
443provided under this License. Any attempt otherwise to propagate or
444modify it is void, and will automatically terminate your rights under
445this License (including any patent licenses granted under the third
446paragraph of section 11).
447
448However, if you cease all violation of this License, then your license
449from a particular copyright holder is reinstated (a) provisionally,
450unless and until the copyright holder explicitly and finally
451terminates your license, and (b) permanently, if the copyright holder
452fails to notify you of the violation by some reasonable means prior to
45360 days after the cessation.
454
455Moreover, your license from a particular copyright holder is
456reinstated permanently if the copyright holder notifies you of the
457violation by some reasonable means, this is the first time you have
458received notice of violation of this License (for any work) from that
459copyright holder, and you cure the violation prior to 30 days after
460your receipt of the notice.
461
462Termination of your rights under this section does not terminate the
463licenses of parties who have received copies or rights from you under
464this License. If your rights have been terminated and not permanently
465reinstated, you do not qualify to receive new licenses for the same
466material under section 10.
467
468@item Acceptance Not Required for Having Copies.
469
470You are not required to accept this License in order to receive or run
471a copy of the Program. Ancillary propagation of a covered work
472occurring solely as a consequence of using peer-to-peer transmission
473to receive a copy likewise does not require acceptance. However,
474nothing other than this License grants you permission to propagate or
475modify any covered work. These actions infringe copyright if you do
476not accept this License. Therefore, by modifying or propagating a
477covered work, you indicate your acceptance of this License to do so.
478
479@item Automatic Licensing of Downstream Recipients.
480
481Each time you convey a covered work, the recipient automatically
482receives a license from the original licensors, to run, modify and
483propagate that work, subject to this License. You are not responsible
484for enforcing compliance by third parties with this License.
485
486An ``entity transaction'' is a transaction transferring control of an
487organization, or substantially all assets of one, or subdividing an
488organization, or merging organizations. If propagation of a covered
489work results from an entity transaction, each party to that
490transaction who receives a copy of the work also receives whatever
491licenses to the work the party's predecessor in interest had or could
492give under the previous paragraph, plus a right to possession of the
493Corresponding Source of the work from the predecessor in interest, if
494the predecessor has it or can get it with reasonable efforts.
495
496You may not impose any further restrictions on the exercise of the
497rights granted or affirmed under this License. For example, you may
498not impose a license fee, royalty, or other charge for exercise of
499rights granted under this License, and you may not initiate litigation
500(including a cross-claim or counterclaim in a lawsuit) alleging that
501any patent claim is infringed by making, using, selling, offering for
502sale, or importing the Program or any portion of it.
503
504@item Patents.
505
506A ``contributor'' is a copyright holder who authorizes use under this
507License of the Program or a work on which the Program is based. The
508work thus licensed is called the contributor's ``contributor version''.
509
510A contributor's ``essential patent claims'' are all patent claims owned
511or controlled by the contributor, whether already acquired or
512hereafter acquired, that would be infringed by some manner, permitted
513by this License, of making, using, or selling its contributor version,
514but do not include claims that would be infringed only as a
515consequence of further modification of the contributor version. For
516purposes of this definition, ``control'' includes the right to grant
517patent sublicenses in a manner consistent with the requirements of
518this License.
519
520Each contributor grants you a non-exclusive, worldwide, royalty-free
521patent license under the contributor's essential patent claims, to
522make, use, sell, offer for sale, import and otherwise run, modify and
523propagate the contents of its contributor version.
524
525In the following three paragraphs, a ``patent license'' is any express
526agreement or commitment, however denominated, not to enforce a patent
527(such as an express permission to practice a patent or covenant not to
528sue for patent infringement). To ``grant'' such a patent license to a
529party means to make such an agreement or commitment not to enforce a
530patent against the party.
531
532If you convey a covered work, knowingly relying on a patent license,
533and the Corresponding Source of the work is not available for anyone
534to copy, free of charge and under the terms of this License, through a
535publicly available network server or other readily accessible means,
536then you must either (1) cause the Corresponding Source to be so
537available, or (2) arrange to deprive yourself of the benefit of the
538patent license for this particular work, or (3) arrange, in a manner
539consistent with the requirements of this License, to extend the patent
540license to downstream recipients. ``Knowingly relying'' means you have
541actual knowledge that, but for the patent license, your conveying the
542covered work in a country, or your recipient's use of the covered work
543in a country, would infringe one or more identifiable patents in that
544country that you have reason to believe are valid.
545
546If, pursuant to or in connection with a single transaction or
547arrangement, you convey, or propagate by procuring conveyance of, a
548covered work, and grant a patent license to some of the parties
549receiving the covered work authorizing them to use, propagate, modify
550or convey a specific copy of the covered work, then the patent license
551you grant is automatically extended to all recipients of the covered
552work and works based on it.
553
554A patent license is ``discriminatory'' if it does not include within the
555scope of its coverage, prohibits the exercise of, or is conditioned on
556the non-exercise of one or more of the rights that are specifically
557granted under this License. You may not convey a covered work if you
558are a party to an arrangement with a third party that is in the
559business of distributing software, under which you make payment to the
560third party based on the extent of your activity of conveying the
561work, and under which the third party grants, to any of the parties
562who would receive the covered work from you, a discriminatory patent
563license (a) in connection with copies of the covered work conveyed by
564you (or copies made from those copies), or (b) primarily for and in
565connection with specific products or compilations that contain the
566covered work, unless you entered into that arrangement, or that patent
567license was granted, prior to 28 March 2007.
568
569Nothing in this License shall be construed as excluding or limiting
570any implied license or other defenses to infringement that may
571otherwise be available to you under applicable patent law.
572
573@item No Surrender of Others' Freedom.
574
575If conditions are imposed on you (whether by court order, agreement or
576otherwise) that contradict the conditions of this License, they do not
577excuse you from the conditions of this License. If you cannot convey
578a covered work so as to satisfy simultaneously your obligations under
579this License and any other pertinent obligations, then as a
580consequence you may not convey it at all. For example, if you agree
581to terms that obligate you to collect a royalty for further conveying
582from those to whom you convey the Program, the only way you could
583satisfy both those terms and this License would be to refrain entirely
584from conveying the Program.
585
586@item Use with the GNU Affero General Public License.
587
588Notwithstanding any other provision of this License, you have
589permission to link or combine any covered work with a work licensed
590under version 3 of the GNU Affero General Public License into a single
591combined work, and to convey the resulting work. The terms of this
592License will continue to apply to the part which is the covered work,
593but the special requirements of the GNU Affero General Public License,
594section 13, concerning interaction through a network will apply to the
595combination as such.
596
597@item Revised Versions of this License.
598
599The Free Software Foundation may publish revised and/or new versions
600of the GNU General Public License from time to time. Such new
601versions will be similar in spirit to the present version, but may
602differ in detail to address new problems or concerns.
603
604Each version is given a distinguishing version number. If the Program
605specifies that a certain numbered version of the GNU General Public
606License ``or any later version'' applies to it, you have the option of
607following the terms and conditions either of that numbered version or
608of any later version published by the Free Software Foundation. If
609the Program does not specify a version number of the GNU General
610Public License, you may choose any version ever published by the Free
611Software Foundation.
612
613If the Program specifies that a proxy can decide which future versions
614of the GNU General Public License can be used, that proxy's public
615statement of acceptance of a version permanently authorizes you to
616choose that version for the Program.
617
618Later license versions may give you additional or different
619permissions. However, no additional obligations are imposed on any
620author or copyright holder as a result of your choosing to follow a
621later version.
622
623@item Disclaimer of Warranty.
624
625THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
626APPLICABLE LAW@. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
627HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
628WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
629LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
630A PARTICULAR PURPOSE@. THE ENTIRE RISK AS TO THE QUALITY AND
631PERFORMANCE OF THE PROGRAM IS WITH YOU@. SHOULD THE PROGRAM PROVE
632DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
633CORRECTION.
634
635@item Limitation of Liability.
636
637IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
638WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
639CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
640INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
641ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
642NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
643LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
644TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
645PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
646
647@item Interpretation of Sections 15 and 16.
648
649If the disclaimer of warranty and limitation of liability provided
650above cannot be given local legal effect according to their terms,
651reviewing courts shall apply local law that most closely approximates
652an absolute waiver of all civil liability in connection with the
653Program, unless a warranty or assumption of liability accompanies a
654copy of the Program in return for a fee.
655
656@end enumerate
657
658@heading END OF TERMS AND CONDITIONS
659
660@heading How to Apply These Terms to Your New Programs
661
662If you develop a new program, and you want it to be of the greatest
663possible use to the public, the best way to achieve this is to make it
664free software which everyone can redistribute and change under these
665terms.
666
667To do so, attach the following notices to the program. It is safest
668to attach them to the start of each source file to most effectively
669state the exclusion of warranty; and each file should have at least
670the ``copyright'' line and a pointer to where the full notice is found.
671
672@smallexample
673@var{one line to give the program's name and a brief idea of what it does.}
674Copyright (C) @var{year} @var{name of author}
675
676This program is free software: you can redistribute it and/or modify
677it under the terms of the GNU General Public License as published by
678the Free Software Foundation, either version 3 of the License, or (at
679your option) any later version.
680
681This program is distributed in the hope that it will be useful, but
682WITHOUT ANY WARRANTY; without even the implied warranty of
683MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU
684General Public License for more details.
685
686You should have received a copy of the GNU General Public License
687along with this program. If not, see @url{http://www.gnu.org/licenses/}.
688@end smallexample
689
690Also add information on how to contact you by electronic and paper mail.
691
692If the program does terminal interaction, make it output a short
693notice like this when it starts in an interactive mode:
694
695@smallexample
696@var{program} Copyright (C) @var{year} @var{name of author}
697This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
698This is free software, and you are welcome to redistribute it
699under certain conditions; type @samp{show c} for details.
700@end smallexample
701
702The hypothetical commands @samp{show w} and @samp{show c} should show
703the appropriate parts of the General Public License. Of course, your
704program's commands might be different; for a GUI interface, you would
705use an ``about box''.
706
707You should also get your employer (if you work as a programmer) or school,
708if any, to sign a ``copyright disclaimer'' for the program, if necessary.
709For more information on this, and how to apply and follow the GNU GPL, see
710@url{http://www.gnu.org/licenses/}.
711
712The GNU General Public License does not permit incorporating your
713program into proprietary programs. If your program is a subroutine
714library, you may consider it more useful to permit linking proprietary
715applications with the library. If this is what you want to do, use
716the GNU Lesser General Public License instead of this License. But
717first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
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/documentation/images/daemon_lego_block.png b/doc/documentation/images/daemon_lego_block.png
new file mode 100644
index 000000000..5a088b532
--- /dev/null
+++ b/doc/documentation/images/daemon_lego_block.png
Binary files differ
diff --git a/doc/documentation/images/daemon_lego_block.svg b/doc/documentation/images/daemon_lego_block.svg
new file mode 100644
index 000000000..38ad90d13
--- /dev/null
+++ b/doc/documentation/images/daemon_lego_block.svg
@@ -0,0 +1,126 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 width="744.09448819"
13 height="1052.3622047"
14 id="svg6781"
15 version="1.1"
16 inkscape:version="0.48.2 r9819"
17 sodipodi:docname="New document 58">
18 <defs
19 id="defs6783" />
20 <sodipodi:namedview
21 id="base"
22 pagecolor="#ffffff"
23 bordercolor="#666666"
24 borderopacity="1.0"
25 inkscape:pageopacity="0.0"
26 inkscape:pageshadow="2"
27 inkscape:zoom="0.35"
28 inkscape:cx="375"
29 inkscape:cy="520"
30 inkscape:document-units="px"
31 inkscape:current-layer="layer1"
32 showgrid="false"
33 inkscape:window-width="1366"
34 inkscape:window-height="721"
35 inkscape:window-x="-2"
36 inkscape:window-y="-3"
37 inkscape:window-maximized="1" />
38 <metadata
39 id="metadata6786">
40 <rdf:RDF>
41 <cc:Work
42 rdf:about="">
43 <dc:format>image/svg+xml</dc:format>
44 <dc:type
45 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
46 <dc:title></dc:title>
47 </cc:Work>
48 </rdf:RDF>
49 </metadata>
50 <g
51 inkscape:label="Layer 1"
52 inkscape:groupmode="layer"
53 id="layer1">
54 <g
55 transform="translate(-4.5298577,-148.04661)"
56 id="g6746">
57 <path
58 style="fill:#5fd38d;fill-opacity:1;stroke:#faf6a2;stroke-width:1.99014676;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
59 d="m 183.84284,595.7683 350.8064,0 0,202.04036 -350.8064,0 z"
60 id="path6693"
61 inkscape:connector-curvature="0" />
62 <rect
63 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.22747946;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
64 id="rect6695"
65 width="66.670067"
66 height="75.18058"
67 x="223.74881"
68 y="737.19458" />
69 <rect
70 y="737.19458"
71 x="331.83514"
72 height="67.323441"
73 width="66.670067"
74 id="rect6697"
75 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.10787106;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
76 <rect
77 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.06117821;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
78 id="rect6699"
79 width="66.670067"
80 height="64.373825"
81 x="434.8707"
82 y="737.19458" />
83 <path
84 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
85 d="m 223.60976,736.21851 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
86 id="path6701"
87 inkscape:connector-curvature="0"
88 sodipodi:nodetypes="ccccc" />
89 <path
90 sodipodi:nodetypes="ccccc"
91 inkscape:connector-curvature="0"
92 id="path6703"
93 d="m 331.69608,736.21851 67.23534,0.3894 0,23.98466 -67.23534,37.68524 z"
94 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:0.99090236;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
95 <path
96 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
97 d="m 434.73164,736.21851 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
98 id="path6705"
99 inkscape:connector-curvature="0"
100 sodipodi:nodetypes="ccccc" />
101 <path
102 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:1.92068994;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
103 d="m 533.72659,595.02309 56.12366,-29.34622 -1.01015,190.24271 -55.11351,41.45733 z"
104 id="path6707"
105 inkscape:connector-curvature="0"
106 sodipodi:nodetypes="ccccc" />
107 <path
108 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:1.99424875;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
109 d="m 245.46708,566.47881 345.46203,-1.01015 -56.56854,31.31472 -349.50264,-1.01014 z"
110 id="path6709"
111 inkscape:connector-curvature="0"
112 sodipodi:nodetypes="ccccc" />
113 <text
114 sodipodi:linespacing="125%"
115 id="text6715"
116 y="677.59558"
117 x="234.35539"
118 style="font-size:36px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
119 xml:space="preserve"><tspan
120 y="677.59558"
121 x="234.35539"
122 id="tspan6717"
123 sodipodi:role="line">User Interface</tspan></text>
124 </g>
125 </g>
126</svg>
diff --git a/doc/documentation/images/gnunet-0-10-peerinfo.png b/doc/documentation/images/gnunet-0-10-peerinfo.png
new file mode 100644
index 000000000..c5e711aff
--- /dev/null
+++ b/doc/documentation/images/gnunet-0-10-peerinfo.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png b/doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png
new file mode 100644
index 000000000..d7993cc46
--- /dev/null
+++ b/doc/documentation/images/gnunet-fs-gtk-0-10-star-tab.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-download-area.png b/doc/documentation/images/gnunet-gtk-0-10-download-area.png
new file mode 100644
index 000000000..8500d46c9
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-download-area.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-menu.png b/doc/documentation/images/gnunet-gtk-0-10-fs-menu.png
new file mode 100644
index 000000000..dc20c45a9
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-menu.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png
new file mode 100644
index 000000000..6f9f75ea6
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-editing.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png
new file mode 100644
index 000000000..50672e379
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-select.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png
new file mode 100644
index 000000000..b46542563
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file.png
Binary files differ
diff --git a/doc/documentation/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
new file mode 100644
index 000000000..b46542563
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish-with-file_0.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-publish.png b/doc/documentation/images/gnunet-gtk-0-10-fs-publish.png
new file mode 100644
index 000000000..033b38fa5
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-publish.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-published.png b/doc/documentation/images/gnunet-gtk-0-10-fs-published.png
new file mode 100644
index 000000000..fbd3dd6a3
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-published.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs-search.png b/doc/documentation/images/gnunet-gtk-0-10-fs-search.png
new file mode 100644
index 000000000..bb64ab92e
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs-search.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-fs.png b/doc/documentation/images/gnunet-gtk-0-10-fs.png
new file mode 100644
index 000000000..c7a294878
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-fs.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png b/doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png
new file mode 100644
index 000000000..f8231b3a6
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns-a-done.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-gns-a.png b/doc/documentation/images/gnunet-gtk-0-10-gns-a.png
new file mode 100644
index 000000000..39858d72c
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns-a.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-gns.png b/doc/documentation/images/gnunet-gtk-0-10-gns.png
new file mode 100644
index 000000000..c71a2bd7b
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-gns.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-identity.png b/doc/documentation/images/gnunet-gtk-0-10-identity.png
new file mode 100644
index 000000000..d0b426098
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-identity.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-search-selected.png b/doc/documentation/images/gnunet-gtk-0-10-search-selected.png
new file mode 100644
index 000000000..da1ad4d31
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-search-selected.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10-traffic.png b/doc/documentation/images/gnunet-gtk-0-10-traffic.png
new file mode 100644
index 000000000..76458f717
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10-traffic.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-gtk-0-10.png b/doc/documentation/images/gnunet-gtk-0-10.png
new file mode 100644
index 000000000..3615849a7
--- /dev/null
+++ b/doc/documentation/images/gnunet-gtk-0-10.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-namestore-gtk-phone.png b/doc/documentation/images/gnunet-namestore-gtk-phone.png
new file mode 100644
index 000000000..3bb859629
--- /dev/null
+++ b/doc/documentation/images/gnunet-namestore-gtk-phone.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-namestore-gtk-vpn.png b/doc/documentation/images/gnunet-namestore-gtk-vpn.png
new file mode 100644
index 000000000..c716729ba
--- /dev/null
+++ b/doc/documentation/images/gnunet-namestore-gtk-vpn.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-setup-exit.png b/doc/documentation/images/gnunet-setup-exit.png
new file mode 100644
index 000000000..66bd972bc
--- /dev/null
+++ b/doc/documentation/images/gnunet-setup-exit.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-tutorial-service.png b/doc/documentation/images/gnunet-tutorial-service.png
new file mode 100644
index 000000000..6daed2f35
--- /dev/null
+++ b/doc/documentation/images/gnunet-tutorial-service.png
Binary files differ
diff --git a/doc/documentation/images/gnunet-tutorial-system.png b/doc/documentation/images/gnunet-tutorial-system.png
new file mode 100644
index 000000000..8b54e16cf
--- /dev/null
+++ b/doc/documentation/images/gnunet-tutorial-system.png
Binary files differ
diff --git a/doc/documentation/images/iceweasel-preferences.png b/doc/documentation/images/iceweasel-preferences.png
new file mode 100644
index 000000000..e62c2c4d9
--- /dev/null
+++ b/doc/documentation/images/iceweasel-preferences.png
Binary files differ
diff --git a/doc/documentation/images/iceweasel-proxy.png b/doc/documentation/images/iceweasel-proxy.png
new file mode 100644
index 000000000..9caad4508
--- /dev/null
+++ b/doc/documentation/images/iceweasel-proxy.png
Binary files differ
diff --git a/doc/documentation/images/lego_stack.svg b/doc/documentation/images/lego_stack.svg
new file mode 100644
index 000000000..a0e8017c3
--- /dev/null
+++ b/doc/documentation/images/lego_stack.svg
@@ -0,0 +1,737 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
6 xmlns:dc="http://purl.org/dc/elements/1.1/"
7 xmlns:cc="http://creativecommons.org/ns#"
8 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
9 xmlns:svg="http://www.w3.org/2000/svg"
10 xmlns="http://www.w3.org/2000/svg"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="744.09448819"
14 height="1052.3622047"
15 id="svg2"
16 version="1.1"
17 inkscape:version="0.48.1 r9760"
18 sodipodi:docname="System.svg">
19 <defs
20 id="defs4">
21 <linearGradient
22 id="linearGradient6602">
23 <stop
24 style="stop-color:#df8060;stop-opacity:1;"
25 offset="0"
26 id="stop6604" />
27 <stop
28 style="stop-color:#df8002;stop-opacity:0;"
29 offset="1"
30 id="stop6606" />
31 </linearGradient>
32 <linearGradient
33 id="linearGradient4392"
34 osb:paint="solid">
35 <stop
36 style="stop-color:#faf6a6;stop-opacity:1;"
37 offset="0"
38 id="stop4394" />
39 </linearGradient>
40 <inkscape:perspective
41 sodipodi:type="inkscape:persp3d"
42 inkscape:vp_x="883.99395 : 559.99673 : 1"
43 inkscape:vp_y="13.319386 : 993.87659 : 0"
44 inkscape:vp_z="285.3157 : 504.79962 : 1"
45 inkscape:persp3d-origin="481.39556 : 281.96355 : 1"
46 id="perspective3070" />
47 <inkscape:perspective
48 sodipodi:type="inkscape:persp3d"
49 inkscape:vp_x="76.097926 : 349.87282 : 1"
50 inkscape:vp_y="-13.319386 : 979.366 : 0"
51 inkscape:vp_z="752.55793 : 376.31441 : 1"
52 inkscape:persp3d-origin="373.64045 : 350.98006 : 1"
53 id="perspective3012" />
54 </defs>
55 <sodipodi:namedview
56 id="base"
57 pagecolor="#ffffff"
58 bordercolor="#666666"
59 borderopacity="1.0"
60 inkscape:pageopacity="0.0"
61 inkscape:pageshadow="2"
62 inkscape:zoom="0.98994949"
63 inkscape:cx="322.06882"
64 inkscape:cy="568.82291"
65 inkscape:document-units="px"
66 inkscape:current-layer="layer1"
67 showgrid="false"
68 inkscape:window-width="846"
69 inkscape:window-height="963"
70 inkscape:window-x="59"
71 inkscape:window-y="0"
72 inkscape:window-maximized="0" />
73 <metadata
74 id="metadata7">
75 <rdf:RDF>
76 <cc:Work
77 rdf:about="">
78 <dc:format>image/svg+xml</dc:format>
79 <dc:type
80 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
81 <dc:title />
82 </cc:Work>
83 </rdf:RDF>
84 </metadata>
85 <g
86 inkscape:label="Layer 1"
87 inkscape:groupmode="layer"
88 id="layer1">
89 <text
90 xml:space="preserve"
91 style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
92 x="352.03815"
93 y="-190.12544"
94 id="text6623"
95 sodipodi:linespacing="125%"><tspan
96 sodipodi:role="line"
97 id="tspan6625"
98 x="352.03815"
99 y="-190.12544" /></text>
100 <text
101 xml:space="preserve"
102 style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
103 x="338.40109"
104 y="-300.73715"
105 id="text6627"
106 sodipodi:linespacing="125%"><tspan
107 sodipodi:role="line"
108 id="tspan6629"
109 x="338.40109"
110 y="-300.73715" /></text>
111 <g
112 style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
113 id="text6643" />
114 <text
115 xml:space="preserve"
116 style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
117 x="71.720833"
118 y="95.747719"
119 id="text6648"
120 sodipodi:linespacing="125%"><tspan
121 sodipodi:role="line"
122 id="tspan6650"
123 x="71.720833"
124 y="95.747719" /></text>
125 <text
126 xml:space="preserve"
127 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
128 x="262.63965"
129 y="666.48389"
130 id="text6711"
131 sodipodi:linespacing="125%"><tspan
132 sodipodi:role="line"
133 id="tspan6713"
134 x="262.63965"
135 y="666.48389" /></text>
136 <path
137 inkscape:connector-curvature="0"
138 id="path3506"
139 d="m 198.00647,673.76257 236.93358,0 0,158.2919 -236.93358,0 z"
140 style="fill:#000000;fill-opacity:1;stroke:#faf6a2;stroke-width:1.44768786;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
141 <path
142 sodipodi:nodetypes="ccccc"
143 inkscape:connector-curvature="0"
144 id="path3432"
145 d="m 169.32669,654.90334 464.83332,-2.26992 -33.76593,25.73079 -483.97287,-0.12904 z"
146 style="fill:#deaa87;fill-opacity:1;stroke:#faf6a2;stroke-width:2.18398547;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
147 <rect
148 style="fill:#000000;fill-opacity:1;stroke:#59000c;stroke-width:1.35822594;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0.48230088;stroke-dasharray:none;stroke-dashoffset:0"
149 id="rect3416"
150 width="28.495705"
151 height="172.2845"
152 x="464.19418"
153 y="518.96954" />
154 <rect
155 style="fill:#000000;fill-opacity:1;stroke:#59000c;stroke-width:1.36876941;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0.48230088;stroke-dasharray:none;stroke-dashoffset:0"
156 id="rect3414"
157 width="34.729141"
158 height="170.67587"
159 x="340.86124"
160 y="517.93475" />
161 <path
162 style="fill:#deaa87;fill-opacity:1;stroke:#faf6a2;stroke-width:2.04969239;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
163 d="m 246.8138,499.06358 386.50295,-0.94821 -41.88736,26.04231 -413.96081,0 z"
164 id="rect6568-0"
165 inkscape:connector-curvature="0"
166 sodipodi:nodetypes="ccccc" />
167 <path
168 style="fill:#ffdd55;fill-opacity:1;stroke:#faf6a2;stroke-width:1.49989259;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
169 d="m 276.05867,399.52042 323.05541,0 0,124.61741 -323.05541,0 z"
170 id="rect5973"
171 inkscape:connector-curvature="0" />
172 <path
173 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:1.19094384;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
174 d="m 599.16863,399.06078 34.35465,-18.10059 0,117.34068 -34.35465,25.57066 z"
175 id="rect6542"
176 inkscape:connector-curvature="0"
177 sodipodi:nodetypes="ccccc" />
178 <rect
179 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:1.50087094;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
180 id="rect6557"
181 width="322.88623"
182 height="30.529778"
183 x="276.67755"
184 y="368.99368" />
185 <path
186 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:0.50882494;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
187 d="m 598.94047,368.99367 34.58281,-16.82253 0,28.66061 -34.58281,18.06864 z"
188 id="rect6561"
189 inkscape:connector-curvature="0"
190 sodipodi:nodetypes="ccccc" />
191 <path
192 sodipodi:nodetypes="ccccc"
193 inkscape:connector-curvature="0"
194 id="path6564"
195 d="m 598.94047,369.07046 34.30741,-17.12981 0,29.18412 -34.30741,18.39868 z"
196 style="fill:#c87137;fill-opacity:1;stroke:#faf6a2;stroke-width:0.51140249;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
197 inkscape:transform-center-x="-70.147578"
198 inkscape:transform-center-y="15.429055" />
199 <path
200 style="fill:#d38d5f;fill-opacity:1;stroke:#faf6a2;stroke-width:1.47079194;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
201 d="m 330.2508,353.23478 302.87005,-0.62306 -38.33414,16.82253 -318.87597,0 z"
202 id="rect6568"
203 inkscape:connector-curvature="0"
204 sodipodi:nodetypes="ccccc" />
205 <text
206 xml:space="preserve"
207 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
208 x="391.63083"
209 y="461.858"
210 id="text6656"
211 sodipodi:linespacing="125%"
212 transform="scale(1.0052948,0.9947331)"><tspan
213 sodipodi:role="line"
214 id="tspan6658"
215 x="391.63083"
216 y="461.858">Service</tspan></text>
217 <path
218 sodipodi:nodetypes="ccccc"
219 inkscape:connector-curvature="0"
220 id="path6707"
221 d="m 598.75503,244.83802 34.98432,-18.10059 0.26082,125.2709 -35.24514,17.64044 z"
222 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:1.19094384;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
223 <path
224 sodipodi:nodetypes="ccccc"
225 inkscape:connector-curvature="0"
226 id="path6709"
227 d="m 419.07032,228.1132 214.71185,-1.24611 -34.63196,19.9378 L 381.29,246.18184 z"
228 style="fill:#37c871;fill-opacity:1;stroke:#faf6a2;stroke-width:1.23655474;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
229 <rect
230 style="fill:#5fd38d;fill-opacity:1;stroke:#c48069;stroke-width:1.23640049;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
231 id="rect7224"
232 width="217.86653"
233 height="122.74216"
234 x="381.70358"
235 y="246.25151" />
236 <text
237 xml:space="preserve"
238 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
239 x="409.16376"
240 y="302.05649"
241 id="text6715"
242 sodipodi:linespacing="125%"
243 transform="scale(1.0052948,0.9947331)"><tspan
244 sodipodi:role="line"
245 id="tspan6717"
246 x="409.16376"
247 y="302.05649">User Interface</tspan></text>
248 <g
249 id="g7219"
250 transform="matrix(0.62334353,0,0,0.61679464,281.18563,257.70936)">
251 <rect
252 y="119.99139"
253 x="198.49498"
254 height="60.609154"
255 width="66.670067"
256 id="rect6571"
257 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
258 <text
259 sodipodi:linespacing="125%"
260 id="text6631"
261 y="160.39748"
262 x="206.07112"
263 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
264 xml:space="preserve"><tspan
265 y="160.39748"
266 x="206.07112"
267 id="tspan6633"
268 sodipodi:role="line">API</tspan></text>
269 </g>
270 <g
271 transform="matrix(0.62334353,0,0,0.61679464,344.78251,257.70936)"
272 id="g7226">
273 <rect
274 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
275 id="rect7228"
276 width="66.670067"
277 height="60.609154"
278 x="198.49498"
279 y="119.99139" />
280 <text
281 xml:space="preserve"
282 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
283 x="206.07112"
284 y="160.39748"
285 id="text7230"
286 sodipodi:linespacing="125%"><tspan
287 sodipodi:role="line"
288 id="tspan7232"
289 x="206.07112"
290 y="160.39748">API</tspan></text>
291 </g>
292 <g
293 id="g7234"
294 transform="matrix(0.62334353,0,0,0.61679464,409.3239,257.70936)">
295 <rect
296 y="119.99139"
297 x="198.49498"
298 height="60.609154"
299 width="66.670067"
300 id="rect7236"
301 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
302 <text
303 sodipodi:linespacing="125%"
304 id="text7238"
305 y="160.39748"
306 x="206.07112"
307 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
308 xml:space="preserve"><tspan
309 y="160.39748"
310 x="206.07112"
311 id="tspan7240"
312 sodipodi:role="line">API</tspan></text>
313 </g>
314 <g
315 transform="matrix(0.62334353,0,0,0.61679464,175.75806,412.85048)"
316 id="g7242">
317 <rect
318 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
319 id="rect7244"
320 width="66.670067"
321 height="60.609154"
322 x="198.49498"
323 y="119.99139" />
324 <text
325 xml:space="preserve"
326 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
327 x="206.07112"
328 y="160.39748"
329 id="text7246"
330 sodipodi:linespacing="125%"><tspan
331 sodipodi:role="line"
332 id="tspan7248"
333 x="206.07112"
334 y="160.39748">API</tspan></text>
335 </g>
336 <g
337 id="g7250"
338 transform="matrix(0.62334353,0,0,0.61679464,240.79871,413.29105)">
339 <rect
340 y="119.99139"
341 x="198.49498"
342 height="60.609154"
343 width="66.670067"
344 id="rect7252"
345 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
346 <text
347 sodipodi:linespacing="125%"
348 id="text7254"
349 y="160.39748"
350 x="206.07112"
351 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
352 xml:space="preserve"><tspan
353 y="160.39748"
354 x="206.07112"
355 id="tspan7256"
356 sodipodi:role="line">API</tspan></text>
357 </g>
358 <g
359 transform="matrix(0.62334353,0,0,0.61679464,303.79756,412.40991)"
360 id="g7258">
361 <rect
362 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
363 id="rect7260"
364 width="66.670067"
365 height="60.609154"
366 x="198.49498"
367 y="119.99139" />
368 <text
369 xml:space="preserve"
370 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
371 x="206.07112"
372 y="160.39748"
373 id="text7262"
374 sodipodi:linespacing="125%"><tspan
375 sodipodi:role="line"
376 id="tspan7264"
377 x="206.07112"
378 y="160.39748">API</tspan></text>
379 </g>
380 <g
381 id="g7266"
382 transform="matrix(0.62334353,0,0,0.61679464,369.88148,412.40991)">
383 <rect
384 y="119.99139"
385 x="198.49498"
386 height="60.609154"
387 width="66.670067"
388 id="rect7268"
389 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
390 <text
391 sodipodi:linespacing="125%"
392 id="text7270"
393 y="160.39748"
394 x="206.07112"
395 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
396 xml:space="preserve"><tspan
397 y="160.39748"
398 x="206.07112"
399 id="tspan7272"
400 sodipodi:role="line">API</tspan></text>
401 </g>
402 <path
403 style="fill:#ffeeaa;fill-opacity:1;stroke:#faf6a2;stroke-width:0.91879815;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
404 d="m 478.56081,554.09281 121.22633,0 0,124.61741 -121.22633,0 z"
405 id="rect5973-1"
406 inkscape:connector-curvature="0" />
407 <g
408 transform="matrix(0.62334353,0,0,0.61679464,422.424,566.60858)"
409 id="g3474">
410 <rect
411 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
412 id="rect3476"
413 width="66.670067"
414 height="60.609154"
415 x="198.49498"
416 y="119.99139" />
417 <text
418 xml:space="preserve"
419 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
420 x="206.07112"
421 y="160.39748"
422 id="text3478"
423 sodipodi:linespacing="125%"><tspan
424 sodipodi:role="line"
425 id="tspan3480"
426 x="206.07112"
427 y="160.39748">API</tspan></text>
428 </g>
429 <path
430 style="fill:#ffe680;fill-opacity:1;stroke:#faf6a2;stroke-width:1.18771458;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
431 d="m 599.60339,554.02055 33.72575,-29.55535 0.88568,128.35487 -34.61143,26.01123 z"
432 id="rect6542-8"
433 inkscape:connector-curvature="0"
434 sodipodi:nodetypes="ccccc" />
435 <path
436 sodipodi:nodetypes="ccccc"
437 inkscape:connector-curvature="0"
438 id="path6564-2"
439 d="m 598.92998,524.03024 34.30741,-25.94116 0,26.5407 -34.30741,29.85344 z"
440 style="fill:#d38d5f;fill-opacity:1;stroke:#faf6a2;stroke-width:0.51140249;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
441 inkscape:transform-center-x="-70.147578"
442 inkscape:transform-center-y="15.429055" />
443 <path
444 inkscape:transform-center-y="15.492457"
445 inkscape:transform-center-x="-70.147578"
446 style="fill:#c87137;fill-opacity:1;stroke:#faf6a2;stroke-width:0.51245213;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
447 d="m 598.92998,524.13683 34.30741,-26.04775 0,26.64977 -34.30741,29.97611 z"
448 id="path3402"
449 inkscape:connector-curvature="0"
450 sodipodi:nodetypes="ccccc" />
451 <path
452 sodipodi:nodetypes="ccccc"
453 inkscape:connector-curvature="0"
454 id="path3404"
455 d="m 599.82047,678.2289 34.30741,-25.94116 0,26.5407 -34.30741,34.25912 z"
456 style="fill:#c87137;fill-opacity:1;stroke:#faf6a2;stroke-width:0.51140249;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
457 inkscape:transform-center-x="-70.147578"
458 inkscape:transform-center-y="15.429055" />
459 <path
460 sodipodi:nodetypes="ccccc"
461 inkscape:connector-curvature="0"
462 id="path3406"
463 d="m 600.04863,707.77865 33.90941,-29.55535 0.89049,128.35487 -34.7999,26.01123 z"
464 style="fill:#37c837;fill-opacity:1;stroke:#faf6a2;stroke-width:1.19094384;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
465 <path
466 inkscape:connector-curvature="0"
467 id="path3410"
468 d="m 356.56358,554.09281 120.92249,0 0,124.19268 -120.92249,0 z"
469 style="fill:#ffeeaa;fill-opacity:1;stroke:#faf6a2;stroke-width:0.91608089;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
470 <path
471 style="fill:#ffeeaa;fill-opacity:1;stroke:#faf6a2;stroke-width:1.11023378;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
472 d="m 177.52518,554.09281 177.51841,0 0,124.25702 -177.51841,0 z"
473 id="path3412"
474 inkscape:connector-curvature="0" />
475 <rect
476 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:1.11264122;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
477 id="rect6557-7"
478 width="177.44882"
479 height="30.529778"
480 x="177.65657"
481 y="523.95343" />
482 <rect
483 y="678.1521"
484 x="116.73995"
485 height="29.53463"
486 width="177.54182"
487 id="rect3408"
488 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:1.09464383;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
489 <rect
490 y="523.95343"
491 x="356.55023"
492 height="30.529778"
493 width="120.86897"
494 id="rect3420"
495 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:0.91828173;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
496 <rect
497 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:0.91828173;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
498 id="rect3422"
499 width="120.86897"
500 height="30.529778"
501 x="478.54919"
502 y="523.95343" />
503 <text
504 xml:space="preserve"
505 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
506 x="372.34232"
507 y="622.53217"
508 id="text6656-2"
509 sodipodi:linespacing="125%"
510 transform="scale(1.0052948,0.9947331)"><tspan
511 sodipodi:role="line"
512 id="tspan6658-2"
513 x="372.34232"
514 y="622.53217">Service</tspan></text>
515 <text
516 sodipodi:linespacing="125%"
517 id="text3424"
518 y="622.53217"
519 x="220.56013"
520 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
521 xml:space="preserve"
522 transform="scale(1.0052948,0.9947331)"><tspan
523 y="622.53217"
524 x="220.56013"
525 id="tspan3426"
526 sodipodi:role="line">Service</tspan></text>
527 <text
528 xml:space="preserve"
529 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
530 x="493.85532"
531 y="622.54492"
532 id="text3428"
533 sodipodi:linespacing="125%"
534 transform="scale(1.0052948,0.9947331)"><tspan
535 sodipodi:role="line"
536 id="tspan3430"
537 x="493.85532"
538 y="622.54492">Service</tspan></text>
539 <g
540 id="g3434"
541 transform="matrix(0.62334353,0,0,0.61679464,120.10238,566.60858)">
542 <rect
543 y="119.99139"
544 x="198.49498"
545 height="60.609154"
546 width="66.670067"
547 id="rect3436"
548 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
549 <text
550 sodipodi:linespacing="125%"
551 id="text3438"
552 y="160.39748"
553 x="206.07112"
554 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
555 xml:space="preserve"><tspan
556 y="160.39748"
557 x="206.07112"
558 id="tspan3440"
559 sodipodi:role="line">API</tspan></text>
560 </g>
561 <g
562 transform="matrix(0.62334353,0,0,0.61679464,181.54625,566.60858)"
563 id="g3442">
564 <rect
565 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
566 id="rect3444"
567 width="66.670067"
568 height="60.609154"
569 x="198.49498"
570 y="119.99139" />
571 <text
572 xml:space="preserve"
573 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
574 x="206.07112"
575 y="160.39748"
576 id="text3446"
577 sodipodi:linespacing="125%"><tspan
578 sodipodi:role="line"
579 id="tspan3448"
580 x="206.07112"
581 y="160.39748">API</tspan></text>
582 </g>
583 <g
584 id="g3450"
585 transform="matrix(0.62334353,0,0,0.61679464,242.09962,566.60858)">
586 <rect
587 y="119.99139"
588 x="198.49498"
589 height="60.609154"
590 width="66.670067"
591 id="rect3452"
592 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
593 <text
594 sodipodi:linespacing="125%"
595 id="text3454"
596 y="160.39748"
597 x="206.07112"
598 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
599 xml:space="preserve"><tspan
600 y="160.39748"
601 x="206.07112"
602 id="tspan3456"
603 sodipodi:role="line">API</tspan></text>
604 </g>
605 <g
606 transform="matrix(0.62334353,0,0,0.61679464,303.54348,566.60858)"
607 id="g3458">
608 <rect
609 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
610 id="rect3460"
611 width="66.670067"
612 height="60.609154"
613 x="198.49498"
614 y="119.99139" />
615 <text
616 xml:space="preserve"
617 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
618 x="206.07112"
619 y="160.39748"
620 id="text3462"
621 sodipodi:linespacing="125%"><tspan
622 sodipodi:role="line"
623 id="tspan3464"
624 x="206.07112"
625 y="160.39748">API</tspan></text>
626 </g>
627 <g
628 id="g3466"
629 transform="matrix(0.62334353,0,0,0.61679464,362.76112,566.60858)">
630 <rect
631 y="119.99139"
632 x="198.49498"
633 height="60.609154"
634 width="66.670067"
635 id="rect3468"
636 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
637 <text
638 sodipodi:linespacing="125%"
639 id="text3470"
640 y="160.39748"
641 x="206.07112"
642 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
643 xml:space="preserve"><tspan
644 y="160.39748"
645 x="206.07112"
646 id="tspan3472"
647 sodipodi:role="line">API</tspan></text>
648 </g>
649 <path
650 style="fill:#5fd35f;fill-opacity:1;stroke:#faf6a2;stroke-width:1.11993289;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
651 d="m 420.2626,707.53388 180.11119,0 0,124.61741 -180.11119,0 z"
652 id="path3490"
653 inkscape:connector-curvature="0" />
654 <g
655 transform="matrix(0.62334353,0,0,0.61679464,62.665728,566.60858)"
656 id="g3492">
657 <rect
658 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
659 id="rect3494"
660 width="66.670067"
661 height="60.609154"
662 x="198.49498"
663 y="119.99139" />
664 <text
665 xml:space="preserve"
666 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
667 x="206.07112"
668 y="160.39748"
669 id="text3496"
670 sodipodi:linespacing="125%"><tspan
671 sodipodi:role="line"
672 id="tspan3498"
673 x="206.07112"
674 y="160.39748">API</tspan></text>
675 </g>
676 <path
677 inkscape:connector-curvature="0"
678 id="path3500"
679 d="m 116.52597,707.54132 177.63643,0 0,124.61741 -177.63643,0 z"
680 style="fill:#5fd35f;fill-opacity:1;stroke:#faf6a2;stroke-width:1.11221218;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
681 <path
682 style="fill:#5fd35f;fill-opacity:1;stroke:#faf6a2;stroke-width:0.92545629;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
683 d="m 295.65636,707.63061 122.98965,0 0,124.61741 -122.98965,0 z"
684 id="path3502"
685 inkscape:connector-curvature="0" />
686 <text
687 xml:space="preserve"
688 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
689 x="162.54019"
690 y="779.76184"
691 id="text3508"
692 sodipodi:linespacing="125%"
693 transform="scale(1.0052948,0.9947331)"><tspan
694 sodipodi:role="line"
695 id="tspan3510"
696 x="162.54019"
697 y="779.76184">Service</tspan></text>
698 <text
699 sodipodi:linespacing="125%"
700 id="text3512"
701 y="779.7619"
702 x="313.56918"
703 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
704 xml:space="preserve"
705 transform="scale(1.0052948,0.9947331)"><tspan
706 y="779.7619"
707 x="313.56918"
708 id="tspan3514"
709 sodipodi:role="line">Service</tspan></text>
710 <text
711 xml:space="preserve"
712 style="font-size:22.32217598px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
713 x="465.48401"
714 y="779.7619"
715 id="text3516"
716 sodipodi:linespacing="125%"
717 transform="scale(1.0052948,0.9947331)"><tspan
718 sodipodi:role="line"
719 id="tspan3518"
720 x="465.48401"
721 y="779.7619">Service</tspan></text>
722 <rect
723 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:0.91063529;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
724 id="rect3520"
725 width="122.86946"
726 height="29.53463"
727 x="295.75125"
728 y="678.1521" />
729 <rect
730 y="678.1521"
731 x="420.27423"
732 height="29.53463"
733 width="179.80205"
734 id="rect3522"
735 style="fill:#c87137;fill-opacity:1;stroke:#c48069;stroke-width:1.10158956;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
736 </g>
737</svg>
diff --git a/doc/documentation/images/service_lego_block.png b/doc/documentation/images/service_lego_block.png
new file mode 100644
index 000000000..56caf6b9c
--- /dev/null
+++ b/doc/documentation/images/service_lego_block.png
Binary files differ
diff --git a/doc/documentation/images/service_lego_block.svg b/doc/documentation/images/service_lego_block.svg
new file mode 100644
index 000000000..ef0d0234f
--- /dev/null
+++ b/doc/documentation/images/service_lego_block.svg
@@ -0,0 +1,345 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
6 xmlns:dc="http://purl.org/dc/elements/1.1/"
7 xmlns:cc="http://creativecommons.org/ns#"
8 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
9 xmlns:svg="http://www.w3.org/2000/svg"
10 xmlns="http://www.w3.org/2000/svg"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="744.09448819"
14 height="1052.3622047"
15 id="svg2"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="Lego block 3.svg">
19 <defs
20 id="defs4">
21 <linearGradient
22 id="linearGradient6602">
23 <stop
24 style="stop-color:#df8060;stop-opacity:1;"
25 offset="0"
26 id="stop6604" />
27 <stop
28 style="stop-color:#df8002;stop-opacity:0;"
29 offset="1"
30 id="stop6606" />
31 </linearGradient>
32 <linearGradient
33 id="linearGradient4392"
34 osb:paint="solid">
35 <stop
36 style="stop-color:#faf6a6;stop-opacity:1;"
37 offset="0"
38 id="stop4394" />
39 </linearGradient>
40 <inkscape:perspective
41 sodipodi:type="inkscape:persp3d"
42 inkscape:vp_x="883.99395 : 559.99673 : 1"
43 inkscape:vp_y="13.319386 : 993.87659 : 0"
44 inkscape:vp_z="285.3157 : 504.79962 : 1"
45 inkscape:persp3d-origin="481.39556 : 281.96355 : 1"
46 id="perspective3070" />
47 <inkscape:perspective
48 sodipodi:type="inkscape:persp3d"
49 inkscape:vp_x="76.097926 : 349.87282 : 1"
50 inkscape:vp_y="-13.319386 : 979.366 : 0"
51 inkscape:vp_z="752.55793 : 376.31441 : 1"
52 inkscape:persp3d-origin="373.64045 : 350.98006 : 1"
53 id="perspective3012" />
54 </defs>
55 <sodipodi:namedview
56 id="base"
57 pagecolor="#ffffff"
58 bordercolor="#666666"
59 borderopacity="1.0"
60 inkscape:pageopacity="0.0"
61 inkscape:pageshadow="2"
62 inkscape:zoom="0.49497475"
63 inkscape:cx="385.59974"
64 inkscape:cy="826.03166"
65 inkscape:document-units="px"
66 inkscape:current-layer="layer1"
67 showgrid="false"
68 inkscape:window-width="1366"
69 inkscape:window-height="721"
70 inkscape:window-x="-2"
71 inkscape:window-y="-3"
72 inkscape:window-maximized="1" />
73 <metadata
74 id="metadata7">
75 <rdf:RDF>
76 <cc:Work
77 rdf:about="">
78 <dc:format>image/svg+xml</dc:format>
79 <dc:type
80 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
81 <dc:title></dc:title>
82 </cc:Work>
83 </rdf:RDF>
84 </metadata>
85 <g
86 inkscape:label="Layer 1"
87 inkscape:groupmode="layer"
88 id="layer1">
89 <path
90 style="fill:#ffdd55;fill-opacity:1;stroke:#faf6a2;stroke-width:2.26315212;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
91 d="m 74.934278,230.09308 453.654042,0 0,202.04036 -453.654042,0 z"
92 id="rect5973"
93 inkscape:connector-curvature="0" />
94 <path
95 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:1.92068994;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
96 d="m 528.67583,229.34787 55.11351,-29.34622 0,190.24271 -55.11351,41.45733 z"
97 id="rect6542"
98 inkscape:connector-curvature="0"
99 sodipodi:nodetypes="ccccc" />
100 <rect
101 style="fill:#d38d5f;fill-opacity:1;stroke:#c48069;stroke-width:2.2674458;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
102 id="rect6557"
103 width="454.54535"
104 height="49.497475"
105 x="74.764442"
106 y="180.60052" />
107 <path
108 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:0.8206054;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
109 d="m 528.30981,180.60052 55.47954,-27.27412 0,46.46702 -55.47954,29.29442 z"
110 id="rect6561"
111 inkscape:connector-curvature="0"
112 sodipodi:nodetypes="ccccc" />
113 <path
114 sodipodi:nodetypes="ccccc"
115 inkscape:connector-curvature="0"
116 id="path6564"
117 d="m 528.30981,180.72501 55.03773,-27.7723 0,47.31578 -55.03773,29.8295 z"
118 style="fill:#d38d5f;fill-opacity:1;stroke:#faf6a2;stroke-width:0.82476228;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
119 inkscape:transform-center-x="-70.147578"
120 inkscape:transform-center-y="15.429055" />
121 <path
122 style="fill:#deaa87;fill-opacity:1;stroke:#faf6a2;stroke-width:2.23265362;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
123 d="m 153.39374,154.33657 430.4643,-1.01015 -54.4837,27.27411 -453.213248,0 z"
124 id="rect6568"
125 inkscape:connector-curvature="0"
126 sodipodi:nodetypes="ccccc" />
127 <text
128 xml:space="preserve"
129 style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
130 x="352.03815"
131 y="-190.12544"
132 id="text6623"
133 sodipodi:linespacing="125%"><tspan
134 sodipodi:role="line"
135 id="tspan6625"
136 x="352.03815"
137 y="-190.12544" /></text>
138 <text
139 xml:space="preserve"
140 style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
141 x="338.40109"
142 y="-300.73715"
143 id="text6627"
144 sodipodi:linespacing="125%"><tspan
145 sodipodi:role="line"
146 id="tspan6629"
147 x="338.40109"
148 y="-300.73715" /></text>
149 <rect
150 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
151 id="rect6571"
152 width="66.670067"
153 height="60.609154"
154 x="198.49498"
155 y="119.99139" />
156 <path
157 style="fill:#ff6600;fill-opacity:1;stroke:#faf6a2;stroke-width:1.98413372;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
158 d="m 265.16503,119.45792 44.95179,-22.465406 0,57.057986 -44.95179,26.55003 z"
159 id="path6600"
160 inkscape:connector-curvature="0"
161 sodipodi:nodetypes="ccccc" />
162 <path
163 style="fill:#ff6600;fill-opacity:1;stroke:#c48069;stroke-width:1.99687159;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
164 d="m 243.06977,97.26295 66.86223,10e-7 -45.08135,22.728439 -66.3557,0 z"
165 id="path6617"
166 inkscape:connector-curvature="0"
167 sodipodi:nodetypes="ccccc" />
168 <text
169 xml:space="preserve"
170 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
171 x="206.07112"
172 y="160.39748"
173 id="text6631"
174 sodipodi:linespacing="125%"><tspan
175 sodipodi:role="line"
176 id="tspan6633"
177 x="206.07112"
178 y="160.39748">API</tspan></text>
179 <rect
180 y="119.99139"
181 x="313.65237"
182 height="60.609154"
183 width="66.670067"
184 id="rect6573"
185 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
186 <path
187 sodipodi:nodetypes="ccccc"
188 inkscape:connector-curvature="0"
189 id="path6598"
190 d="m 379.81735,119.56755 44.95179,-22.425126 0,56.955676 -44.95179,26.50243 z"
191 style="fill:#ff6600;fill-opacity:1;stroke:#faf6a2;stroke-width:1.98235416;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
192 <path
193 sodipodi:nodetypes="ccccc"
194 inkscape:connector-curvature="0"
195 id="path6615"
196 d="m 358.25117,97.26295 66.89824,10e-7 -45.10563,22.728439 -66.39143,0 z"
197 style="fill:#ff6600;fill-opacity:1;stroke:#c48069;stroke-width:1.99740911;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
198 <text
199 sodipodi:linespacing="125%"
200 id="text6635"
201 y="160.39748"
202 x="322.23865"
203 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
204 xml:space="preserve"><tspan
205 y="160.39748"
206 x="322.23865"
207 id="tspan6637"
208 sodipodi:role="line">API</tspan></text>
209 <rect
210 style="fill:#ff9955;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
211 id="rect6575"
212 width="66.670067"
213 height="60.609154"
214 x="428.80978"
215 y="119.99139" />
216 <path
217 style="fill:#ff6600;fill-opacity:1;stroke:#faf6a2;stroke-width:1.98960423;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
218 d="m 494.97474,119.62537 44.95179,-22.589454 0,57.373054 -44.95179,26.69664 z"
219 id="rect6595"
220 inkscape:connector-curvature="0"
221 sodipodi:nodetypes="ccccc" />
222 <path
223 style="fill:#ff6600;fill-opacity:1;stroke:#c48069;stroke-width:1.99399996;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
224 d="m 473.25645,97.26295 66.67007,10e-7 -44.95179,22.728439 -66.16499,0 z"
225 id="rect6612"
226 inkscape:connector-curvature="0"
227 sodipodi:nodetypes="ccccc" />
228 <text
229 xml:space="preserve"
230 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
231 x="439.41635"
232 y="159.89241"
233 id="text6639"
234 sodipodi:linespacing="125%"><tspan
235 sodipodi:role="line"
236 id="tspan6641"
237 x="439.41635"
238 y="159.89241">API</tspan></text>
239 <g
240 style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
241 id="text6643" />
242 <text
243 xml:space="preserve"
244 style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
245 x="71.720833"
246 y="95.747719"
247 id="text6648"
248 sodipodi:linespacing="125%"><tspan
249 sodipodi:role="line"
250 id="tspan6650"
251 x="71.720833"
252 y="95.747719" /></text>
253 <text
254 xml:space="preserve"
255 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
256 x="176.77669"
257 y="216.96603"
258 id="text6652"
259 sodipodi:linespacing="125%"><tspan
260 sodipodi:role="line"
261 id="tspan6654"
262 x="176.77669"
263 y="216.96603">Network Protocol</tspan></text>
264 <text
265 xml:space="preserve"
266 style="font-size:36px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
267 x="233.34526"
268 y="312.93051"
269 id="text6656"
270 sodipodi:linespacing="125%"><tspan
271 sodipodi:role="line"
272 id="tspan6658"
273 x="233.34526"
274 y="312.93051">Service</tspan></text>
275 <rect
276 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.09665918;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
277 id="rect6660"
278 width="66.670067"
279 height="66.609154"
280 x="216.67773"
281 y="371.51938" />
282 <rect
283 y="371.51938"
284 x="322.74374"
285 height="64.373825"
286 width="66.670067"
287 id="rect6662"
288 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.06117821;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
289 <rect
290 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
291 id="rect6664"
292 width="66.670067"
293 height="60.609154"
294 x="423.75903"
295 y="372.52951" />
296 <path
297 sodipodi:nodetypes="ccccc"
298 inkscape:connector-curvature="0"
299 id="path6666"
300 d="m 423.61996,372.56359 67.23534,-0.62641 0,19.59587 -68.24549,41.17879 z"
301 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
302 <path
303 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
304 d="m 322.60471,371.55344 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
305 id="path6668"
306 inkscape:connector-curvature="0"
307 sodipodi:nodetypes="ccccc" />
308 <path
309 sodipodi:nodetypes="ccccc"
310 inkscape:connector-curvature="0"
311 id="path6670"
312 d="m 322.60471,371.55344 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
313 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
314 <path
315 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0"
316 d="m 216.53869,371.55344 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
317 id="path6672"
318 inkscape:connector-curvature="0"
319 sodipodi:nodetypes="ccccc" />
320 <text
321 xml:space="preserve"
322 style="font-size:32px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
323 x="262.63965"
324 y="666.48389"
325 id="text6711"
326 sodipodi:linespacing="125%"><tspan
327 sodipodi:role="line"
328 id="tspan6713"
329 x="262.63965"
330 y="666.48389" /></text>
331 <rect
332 y="371.51938"
333 x="111.62187"
334 height="70.798637"
335 width="66.670067"
336 id="rect6721"
337 style="fill:#ffffff;fill-opacity:1;stroke:#faf6a2;stroke-width:2.1615901;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0" />
338 <path
339 sodipodi:nodetypes="ccccc"
340 inkscape:connector-curvature="0"
341 id="path6723"
342 d="m 111.48283,370.54329 67.23534,0.38374 0,23.63648 -67.23534,37.13818 z"
343 style="fill:#ffcc00;fill-opacity:1;stroke:#faf6a2;stroke-width:0.98368376;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0;stroke-dashoffset:0" />
344 </g>
345</svg>
diff --git a/doc/documentation/images/service_stack.png b/doc/documentation/images/service_stack.png
new file mode 100644
index 000000000..747d087b2
--- /dev/null
+++ b/doc/documentation/images/service_stack.png
Binary files differ
diff --git a/doc/documentation/images/structure.dot b/doc/documentation/images/structure.dot
new file mode 100644
index 000000000..a53db90b8
--- /dev/null
+++ b/doc/documentation/images/structure.dot
@@ -0,0 +1,124 @@
1// house = application
2// circle (default) = service
3// box = daemon
4// diamond = library
5// black line = dependency
6// blue line = extension via plugin
7// red line = possibly useful
8// dashed = in planning
9
10// this is what we have...o
11digraph dependencies {
12splines = true;
13
14 voting [shape=house];
15 voting -> consensus;
16 voting -> identity;
17 voting -> cadet;
18 voting -> secretsharing;
19 secretsharing -> consensus;
20
21 fs [shape=house];
22 fs -> dht;
23 fs -> core;
24 fs -> datastore;
25 fs -> cadet;
26 fs -> ats;
27 fs -> block [style=dotted,color=blue];
28 fs -> identity;
29 exit [shape=box];
30 exit -> cadet;
31 exit -> tun;
32 exit -> dnsstub;
33 vpn -> cadet;
34 vpn -> regex;
35 vpn -> tun;
36 pt [shape=house];
37 pt -> cadet;
38 pt -> vpn;
39 pt -> dns;
40 pt -> dnsparser;
41 dns -> tun;
42 dns -> dnsstub;
43 zonemaster [shape=house];
44 zonemaster -> namestore;
45 zonemaster -> dht;
46 gns -> dns;
47 gns -> dht;
48 gns -> block [style=dotted,color=blue];
49 gns -> revocation;
50 gns -> vpn;
51 gns -> dnsparser;
52 gns -> dnsstub;
53 gns -> identity;
54 revocation -> core;
55 revocation -> set;
56 namestore -> identity;
57 namestore -> gnsrecord;
58 dnsparser -> gnsrecord [style=dotted,color=blue];
59 conversation -> gnsrecord [style=dotted,color=blue];
60 gns -> gnsrecord;
61 dht -> core;
62 dht -> nse;
63 dht -> block;
64 dht -> datacache;
65 dht -> peerinfo;
66 dht -> hello;
67 nse -> core;
68 regex -> block [style=dotted,color=blue];
69 block [shape=diamond];
70 datacache [shape=diamond];
71 cadet -> core [weight=2];
72 cadet -> dht;
73 cadet -> block [style=dotted,color=blue];
74 conversation [shape=house];
75 conversation -> cadet;
76 conversation -> gns;
77 conversation -> speaker;
78 conversation -> microphone;
79 speaker [shape=diamond];
80 microphone [shape=diamond];
81 regex -> dht;
82 core -> transport;
83 topology [shape=box];
84 topology -> peerinfo;
85 topology -> transport;
86 topology -> core;
87 topology -> hello;
88 hostlist [shape=box];
89 hostlist -> core;
90 hostlist -> peerinfo;
91 hostlist -> hello;
92 transport -> ats;
93 transport -> hello;
94 transport -> peerinfo;
95 transport -> nat;
96 transport -> fragmentation;
97 consensus -> set;
98 consensus -> cadet;
99 scalarproduct -> set;
100 scalarproduct -> cadet;
101 set -> cadet;
102 peerinfo -> hello;
103 fragmentation [shape=diamond];
104 hello [shape=diamond];
105 nat [shape=diamond];
106 tun [shape=diamond];
107 dnsparser [shape=diamond];
108 dnsstub [shape=diamond];
109
110 secushare [shape=house];
111 multicast;
112 psyc;
113 social -> psyc;
114 social -> gns;
115 psyc -> psycstore;
116 psycstore;
117 social;
118 secushare -> social;
119 psyc -> multicast;
120 multicast -> cadet;
121
122 rps;
123 rps -> core;
124}
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/documentation/testbed_test.c b/doc/documentation/testbed_test.c
new file mode 100644
index 000000000..1696234b0
--- /dev/null
+++ b/doc/documentation/testbed_test.c
@@ -0,0 +1,99 @@
1#include <unistd.h>
2#include <gnunet/platform.h>
3#include <gnunet/gnunet_util_lib.h>
4#include <gnunet/gnunet_testbed_service.h>
5#include <gnunet/gnunet_dht_service.h>
6
7#define NUM_PEERS 20
8
9static struct GNUNET_TESTBED_Operation *dht_op;
10
11static struct GNUNET_DHT_Handle *dht_handle;
12
13
14struct MyContext
15{
16 int ht_len;
17} ctxt;
18
19
20static int result;
21
22
23static void
24shutdown_task (void *cls)
25{
26 if (NULL != dht_op)
27 {
28 GNUNET_TESTBED_operation_done (dht_op);
29 dht_op = NULL;
30 dht_handle = NULL;
31 }
32 result = GNUNET_OK;
33}
34
35
36static void
37service_connect_comp (void *cls,
38 struct GNUNET_TESTBED_Operation *op,
39 void *ca_result,
40 const char *emsg)
41{
42 GNUNET_assert (op == dht_op);
43 dht_handle = ca_result;
44 // Do work here...
45 GNUNET_SCHEDULER_shutdown ();
46}
47
48
49static void *
50dht_ca (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
51{
52 struct MyContext *ctxt = cls;
53
54 dht_handle = GNUNET_DHT_connect (cfg, ctxt->ht_len);
55 return dht_handle;
56}
57
58
59static void
60dht_da (void *cls, void *op_result)
61{
62 struct MyContext *ctxt = cls;
63
64 GNUNET_DHT_disconnect ((struct GNUNET_DHT_Handle *) op_result);
65 dht_handle = NULL;
66}
67
68
69static void
70test_master (void *cls,
71 struct GNUNET_TESTBED_RunHandle *h,
72 unsigned int num_peers,
73 struct GNUNET_TESTBED_Peer **peers,
74 unsigned int links_succeeded,
75 unsigned int links_failed)
76{
77 ctxt.ht_len = 10;
78 dht_op = GNUNET_TESTBED_service_connect
79 (NULL, peers[0], "dht",
80 &service_connect_comp, NULL,
81 &dht_ca, &dht_da, &ctxt);
82 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
83}
84
85
86int
87main (int argc, char **argv)
88{
89 int ret;
90
91 result = GNUNET_SYSERR;
92 ret = GNUNET_TESTBED_test_run
93 ("awesome-test", "template.conf",
94 NUM_PEERS, 0LL,
95 NULL, NULL, &test_master, NULL);
96 if ( (GNUNET_OK != ret) || (GNUNET_OK != result) )
97 return 1;
98 return 0;
99}
diff --git a/doc/documentation/tutorial-examples/001.c b/doc/documentation/tutorial-examples/001.c
new file mode 100644
index 000000000..7f6699dd2
--- /dev/null
+++ b/doc/documentation/tutorial-examples/001.c
@@ -0,0 +1,29 @@
1#include <gnunet/platform.h>
2#include <gnunet/gnunet_util_lib.h>
3
4static int ret;
5
6static void
7run (void *cls,
8 char *const *args,
9 const char *cfgfile,
10 const struct GNUNET_CONFIGURATION_Handle *cfg)
11{
12 // main code here
13 ret = 0;
14}
15
16int
17main (int argc, char *const *argv)
18{
19 struct GNUNET_GETOPT_CommandLineOption options[] = {
20 GNUNET_GETOPT_OPTION_END
21 };
22 return (GNUNET_OK ==
23 GNUNET_PROGRAM_run (argc,
24 argv,
25 "binary-name",
26 gettext_noop ("binary description text"),
27 options, &run, NULL)) ? ret : 1;
28}
29
diff --git a/doc/documentation/tutorial-examples/002.c b/doc/documentation/tutorial-examples/002.c
new file mode 100644
index 000000000..02233fd61
--- /dev/null
+++ b/doc/documentation/tutorial-examples/002.c
@@ -0,0 +1,17 @@
1static char *string_option;
2static int a_flag;
3
4// ...
5 struct GNUNET_GETOPT_CommandLineOption options[] = {
6 GNUNET_GETOPT_option_string ('s', "name", "SOMESTRING",
7 gettext_noop ("text describing the string_option NAME"),
8 &string_option},
9 GNUNET_GETOPT_option_flag ('f', "flag",
10 gettext_noop ("text describing the flag option"),
11 &a_flag),
12 GNUNET_GETOPT_OPTION_END
13 };
14 string_option = NULL;
15 a_flag = GNUNET_SYSERR;
16// ...
17
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/documentation/tutorial-examples/004.c b/doc/documentation/tutorial-examples/004.c
new file mode 100644
index 000000000..0ef007907
--- /dev/null
+++ b/doc/documentation/tutorial-examples/004.c
@@ -0,0 +1,5 @@
1struct GNUNET_MessageHeader
2{
3 uint16_t size GNUNET_PACKED;
4 uint16_t type GNUNET_PACKED;
5};
diff --git a/doc/documentation/tutorial-examples/005.c b/doc/documentation/tutorial-examples/005.c
new file mode 100644
index 000000000..0c459f509
--- /dev/null
+++ b/doc/documentation/tutorial-examples/005.c
@@ -0,0 +1,8 @@
1struct GNUNET_MQ_Envelope *env;
2struct GNUNET_MessageHeader *msg;
3
4env = GNUNET_MQ_msg_extra (msg, payload_size, GNUNET_MY_MESSAGE_TYPE);
5memcpy (&msg[1], &payload, payload_size);
6// Send message via message queue 'mq'
7GNUNET_mq_send (mq, env);
8
diff --git a/doc/documentation/tutorial-examples/006.c b/doc/documentation/tutorial-examples/006.c
new file mode 100644
index 000000000..944d2b18c
--- /dev/null
+++ b/doc/documentation/tutorial-examples/006.c
@@ -0,0 +1,31 @@
1static void
2handle_fix (void *cls, const struct MyMessage *msg)
3{
4 // process 'msg'
5}
6
7static int
8check_var (void *cls, const struct MyVarMessage *msg)
9{
10 // check 'msg' is well-formed
11 return GNUNET_OK;
12}
13
14static void
15handle_var (void *cls, const struct MyVarMessage *msg)
16{
17 // process 'msg'
18}
19
20struct GNUNET_MQ_MessageHandler handlers[] = {
21 GNUNET_MQ_hd_fixed_size (fix,
22 GNUNET_MESSAGE_TYPE_MY_FIX,
23 struct MyMessage,
24 NULL),
25 GNUNET_MQ_hd_fixed_size (var,
26 GNUNET_MESSAGE_TYPE_MY_VAR,
27 struct MyVarMessage,
28 NULL),
29
30 GNUNET_MQ_handler_end ()
31};
diff --git a/doc/documentation/tutorial-examples/007.c b/doc/documentation/tutorial-examples/007.c
new file mode 100644
index 000000000..096539e43
--- /dev/null
+++ b/doc/documentation/tutorial-examples/007.c
@@ -0,0 +1,10 @@
1GNUNET_SERVICE_MAIN
2("service-name",
3 GNUNET_SERVICE_OPTION_NONE,
4 &run,
5 &client_connect_cb,
6 &client_disconnect_cb,
7 NULL,
8 GNUNET_MQ_hd_fixed_size (...),
9 GNUNET_MQ_hd_var_size (...),
10 GNUNET_MQ_handler_end ());
diff --git a/doc/documentation/tutorial-examples/008.c b/doc/documentation/tutorial-examples/008.c
new file mode 100644
index 000000000..2dffe2cf9
--- /dev/null
+++ b/doc/documentation/tutorial-examples/008.c
@@ -0,0 +1,22 @@
1static void
2run (void *cls,
3 const struct GNUNET_CONFIGURATION_Handle *c,
4 struct GNUNET_SERVICE_Handle *service)
5{
6}
7
8static void *
9client_connect_cb (void *cls,
10 struct GNUNET_SERVICE_Client *c,
11 struct GNUNET_MQ_Handle *mq)
12{
13 return c;
14}
15
16static void
17client_disconnect_cb (void *cls,
18 struct GNUNET_SERVICE_Client *c,
19 void *internal_cls)
20{
21 GNUNET_assert (c == internal_cls);
22}
diff --git a/doc/documentation/tutorial-examples/009.c b/doc/documentation/tutorial-examples/009.c
new file mode 100644
index 000000000..26d918fb0
--- /dev/null
+++ b/doc/documentation/tutorial-examples/009.c
@@ -0,0 +1,9 @@
1#include <gnunet/gnunet_core_service.h>
2
3struct GNUNET_CORE_Handle *
4GNUNET_CORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
5 void *cls,
6 GNUNET_CORE_StartupCallback init,
7 GNUNET_CORE_ConnectEventHandler connects,
8 GNUNET_CORE_DisconnectEventHandler disconnects,
9 const struct GNUNET_MQ_MessageHandler *handlers);
diff --git a/doc/documentation/tutorial-examples/010.c b/doc/documentation/tutorial-examples/010.c
new file mode 100644
index 000000000..33494490d
--- /dev/null
+++ b/doc/documentation/tutorial-examples/010.c
@@ -0,0 +1,8 @@
1void *
2connects (void *cls,
3 const struct GNUNET_PeerIdentity *peer,
4 struct GNUNET_MQ_Handle *mq)
5{
6 return mq;
7}
8
diff --git a/doc/documentation/tutorial-examples/011.c b/doc/documentation/tutorial-examples/011.c
new file mode 100644
index 000000000..23bc051de
--- /dev/null
+++ b/doc/documentation/tutorial-examples/011.c
@@ -0,0 +1,8 @@
1void
2disconnects (void *cls,
3 const struct GNUNET_PeerIdentity * peer)
4{
5 /* Remove peer's identity from known peers */
6 /* Make sure no messages are sent to peer from now on */
7}
8
diff --git a/doc/documentation/tutorial-examples/012.c b/doc/documentation/tutorial-examples/012.c
new file mode 100644
index 000000000..cb21d78ab
--- /dev/null
+++ b/doc/documentation/tutorial-examples/012.c
@@ -0,0 +1,4 @@
1#include "gnunet_peerstore_service.h"
2
3peerstore_handle = GNUNET_PEERSTORE_connect (cfg);
4
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/documentation/tutorial-examples/013.c b/doc/documentation/tutorial-examples/013.c
new file mode 100644
index 000000000..6792417e1
--- /dev/null
+++ b/doc/documentation/tutorial-examples/013.c
@@ -0,0 +1,12 @@
1struct GNUNET_PEERSTORE_StoreContext *
2GNUNET_PEERSTORE_store (struct GNUNET_PEERSTORE_Handle *h,
3 const char *sub_system,
4 const struct GNUNET_PeerIdentity *peer,
5 const char *key,
6 const void *value,
7 size_t size,
8 struct GNUNET_TIME_Absolute expiry,
9 enum GNUNET_PEERSTORE_StoreOption options,
10 GNUNET_PEERSTORE_Continuation cont,
11 void *cont_cls);
12
diff --git a/doc/documentation/tutorial-examples/014.c b/doc/documentation/tutorial-examples/014.c
new file mode 100644
index 000000000..ce204f795
--- /dev/null
+++ b/doc/documentation/tutorial-examples/014.c
@@ -0,0 +1,9 @@
1struct GNUNET_PEERSTORE_IterateContext *
2GNUNET_PEERSTORE_iterate (struct GNUNET_PEERSTORE_Handle *h,
3 const char *sub_system,
4 const struct GNUNET_PeerIdentity *peer,
5 const char *key,
6 struct GNUNET_TIME_Relative timeout,
7 GNUNET_PEERSTORE_Processor callback,
8 void *callback_cls);
9
diff --git a/doc/documentation/tutorial-examples/015.c b/doc/documentation/tutorial-examples/015.c
new file mode 100644
index 000000000..0dd267e8e
--- /dev/null
+++ b/doc/documentation/tutorial-examples/015.c
@@ -0,0 +1,8 @@
1struct GNUNET_PEERSTORE_WatchContext *
2GNUNET_PEERSTORE_watch (struct GNUNET_PEERSTORE_Handle *h,
3 const char *sub_system,
4 const struct GNUNET_PeerIdentity *peer,
5 const char *key,
6 GNUNET_PEERSTORE_Processor callback,
7 void *callback_cls);
8
diff --git a/doc/documentation/tutorial-examples/016.c b/doc/documentation/tutorial-examples/016.c
new file mode 100644
index 000000000..d169da16d
--- /dev/null
+++ b/doc/documentation/tutorial-examples/016.c
@@ -0,0 +1,4 @@
1void
2GNUNET_PEERSTORE_watch_cancel (struct GNUNET_PEERSTORE_WatchContext
3 *wc);
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/documentation/tutorial-examples/018.c b/doc/documentation/tutorial-examples/018.c
new file mode 100644
index 000000000..3fc22584c
--- /dev/null
+++ b/doc/documentation/tutorial-examples/018.c
@@ -0,0 +1,2 @@
1dht_handle = GNUNET_DHT_connect (cfg, parallel_requests);
2
diff --git a/doc/documentation/tutorial-examples/019.c b/doc/documentation/tutorial-examples/019.c
new file mode 100644
index 000000000..aaf001516
--- /dev/null
+++ b/doc/documentation/tutorial-examples/019.c
@@ -0,0 +1,18 @@
1message_sent_cont (void *cls,
2 const struct GNUNET_SCHEDULER_TaskContext *tc)
3{
4 // Request has left local node
5}
6
7struct GNUNET_DHT_PutHandle *
8GNUNET_DHT_put (struct GNUNET_DHT_Handle *handle,
9 const struct GNUNET_HashCode *key,
10 uint32_t desired_replication_level,
11 enum GNUNET_DHT_RouteOption options,
12 enum GNUNET_BLOCK_Type type,
13 size_t size,
14 const void *data,
15 struct GNUNET_TIME_Absolute exp,
16 struct GNUNET_TIME_Relative timeout,
17 GNUNET_DHT_PutContinuation cont, void *cont_cls)
18
diff --git a/doc/documentation/tutorial-examples/020.c b/doc/documentation/tutorial-examples/020.c
new file mode 100644
index 000000000..596db3069
--- /dev/null
+++ b/doc/documentation/tutorial-examples/020.c
@@ -0,0 +1,25 @@
1static void
2get_result_iterator (void *cls, struct GNUNET_TIME_Absolute expiration,
3 const struct GNUNET_HashCode *key,
4 const struct GNUNET_PeerIdentity *get_path,
5 unsigned int get_path_length,
6 const struct GNUNET_PeerIdentity *put_path,
7 unsigned int put_path_length,
8 enum GNUNET_BLOCK_Type type, size_t size,
9 const void *data)
10{
11 // Optionally:
12 GNUNET_DHT_get_stop (get_handle);
13}
14
15get_handle =
16 GNUNET_DHT_get_start (dht_handle,
17 block_type,
18 &key,
19 replication,
20 GNUNET_DHT_RO_NONE,
21 NULL,
22 0,
23 &get_result_iterator,
24 cls)
25
diff --git a/doc/documentation/tutorial-examples/021.c b/doc/documentation/tutorial-examples/021.c
new file mode 100644
index 000000000..688a31fe0
--- /dev/null
+++ b/doc/documentation/tutorial-examples/021.c
@@ -0,0 +1,13 @@
1static enum GNUNET_BLOCK_EvaluationResult
2block_plugin_SERVICE_evaluate (void *cls,
3 enum GNUNET_BLOCK_Type type,
4 struct GNUNET_BlockGroup *bg,
5 const GNUNET_HashCode *query,
6 const void *xquery,
7 size_t xquery_size,
8 const void *reply_block,
9 size_t reply_block_size)
10{
11 // Verify type, block and bg
12}
13
diff --git a/doc/documentation/tutorial-examples/022.c b/doc/documentation/tutorial-examples/022.c
new file mode 100644
index 000000000..a373619bd
--- /dev/null
+++ b/doc/documentation/tutorial-examples/022.c
@@ -0,0 +1,8 @@
1static int
2block_plugin_SERVICE_get_key (void *cls, enum GNUNET_BLOCK_Type type,
3 const void *block, size_t block_size,
4 struct GNUNET_HashCode *key)
5{
6 // Store the key in the key argument, return GNUNET_OK on success.
7}
8
diff --git a/doc/documentation/tutorial-examples/023.c b/doc/documentation/tutorial-examples/023.c
new file mode 100644
index 000000000..820c38b10
--- /dev/null
+++ b/doc/documentation/tutorial-examples/023.c
@@ -0,0 +1,17 @@
1void *
2libgnunet_plugin_block_SERVICE_init (void *cls)
3{
4 static enum GNUNET_BLOCK_Type types[] =
5 {
6 GNUNET_BLOCK_TYPE_SERVICE_BLOCKYPE,
7 GNUNET_BLOCK_TYPE_ANY
8 };
9 struct GNUNET_BLOCK_PluginFunctions *api;
10
11 api = GNUNET_new (struct GNUNET_BLOCK_PluginFunctions);
12 api->evaluate = &block_plugin_SERICE_evaluate;
13 api->get_key = &block_plugin_SERVICE_get_key;
14 api->types = types;
15 return api;
16}
17
diff --git a/doc/documentation/tutorial-examples/024.c b/doc/documentation/tutorial-examples/024.c
new file mode 100644
index 000000000..2e84b5905
--- /dev/null
+++ b/doc/documentation/tutorial-examples/024.c
@@ -0,0 +1,9 @@
1void *
2libgnunet_plugin_block_SERVICE_done (void *cls)
3{
4 struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
5
6 GNUNET_free (api);
7 return NULL;
8}
9
diff --git a/doc/documentation/tutorial-examples/025.c b/doc/documentation/tutorial-examples/025.c
new file mode 100644
index 000000000..66d4f80ec
--- /dev/null
+++ b/doc/documentation/tutorial-examples/025.c
@@ -0,0 +1,15 @@
1 plugindir = $(libdir)/gnunet
2
3 plugin_LTLIBRARIES = \
4 libgnunet_plugin_block_ext.la
5 libgnunet_plugin_block_ext_la_SOURCES = \
6 plugin_block_ext.c
7 libgnunet_plugin_block_ext_la_LIBADD = \
8 $(prefix)/lib/libgnunethello.la \
9 $(prefix)/lib/libgnunetblock.la \
10 $(prefix)/lib/libgnunetutil.la
11 libgnunet_plugin_block_ext_la_LDFLAGS = \
12 $(GN_PLUGIN_LDFLAGS)
13 libgnunet_plugin_block_ext_la_DEPENDENCIES = \
14 $(prefix)/lib/libgnunetblock.la
15
diff --git a/doc/documentation/tutorial-examples/026.c b/doc/documentation/tutorial-examples/026.c
new file mode 100644
index 000000000..264e0b6b9
--- /dev/null
+++ b/doc/documentation/tutorial-examples/026.c
@@ -0,0 +1,52 @@
1static void
2get_callback (void *cls,
3 enum GNUNET_DHT_RouteOption options,
4 enum GNUNET_BLOCK_Type type,
5 uint32_t hop_count,
6 uint32_t desired_replication_level,
7 unsigned int path_length,
8 const struct GNUNET_PeerIdentity *path,
9 const struct GNUNET_HashCode * key)
10{
11}
12
13
14static void
15get_resp_callback (void *cls,
16 enum GNUNET_BLOCK_Type type,
17 const struct GNUNET_PeerIdentity *get_path,
18 unsigned int get_path_length,
19 const struct GNUNET_PeerIdentity *put_path,
20 unsigned int put_path_length,
21 struct GNUNET_TIME_Absolute exp,
22 const struct GNUNET_HashCode * key,
23 const void *data,
24 size_t size)
25{
26}
27
28
29static void
30put_callback (void *cls,
31 enum GNUNET_DHT_RouteOption options,
32 enum GNUNET_BLOCK_Type type,
33 uint32_t hop_count,
34 uint32_t desired_replication_level,
35 unsigned int path_length,
36 const struct GNUNET_PeerIdentity *path,
37 struct GNUNET_TIME_Absolute exp,
38 const struct GNUNET_HashCode * key,
39 const void *data,
40 size_t size)
41{
42}
43
44
45monitor_handle = GNUNET_DHT_monitor_start (dht_handle,
46 block_type,
47 key,
48 &get_callback,
49 &get_resp_callback,
50 &put_callback,
51 cls);
52