aboutsummaryrefslogtreecommitdiff
path: root/doc/documentation
diff options
context:
space:
mode:
Diffstat (limited to 'doc/documentation')
-rw-r--r--doc/documentation/Makefile.am233
-rw-r--r--doc/documentation/README.txt104
-rw-r--r--doc/documentation/chapters/configuration.texi5
-rw-r--r--doc/documentation/chapters/contributing.texi102
-rw-r--r--doc/documentation/chapters/developer.texi8341
-rw-r--r--doc/documentation/chapters/installation.texi4123
-rw-r--r--doc/documentation/chapters/philosophy.texi427
-rw-r--r--doc/documentation/chapters/user.texi2032
-rw-r--r--doc/documentation/chapters/vocabulary.texi72
-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.texi1540
-rw-r--r--doc/documentation/gnunet.texi236
-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.html35
-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
81 files changed, 21714 insertions, 0 deletions
diff --git a/doc/documentation/Makefile.am b/doc/documentation/Makefile.am
new file mode 100644
index 000000000..7b844b985
--- /dev/null
+++ b/doc/documentation/Makefile.am
@@ -0,0 +1,233 @@
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 chapters/contributing.texi \
120 fdl-1.3.texi \
121 gpl-3.0.texi
122
123EXTRA_DIST = \
124 $(gnunet_TEXINFOS) \
125 $(gnunet_tutorial_examples) \
126 htmlxref.cnf \
127 run-gendocs.sh \
128 docstyle.css
129
130
131# $(DOT_FILES) \
132# $(DOT_VECTOR_GRAPHICS)
133
134DISTCLEANFILES = \
135 gnunet.cps \
136 gnunet-c-tutorial.cps \
137 chapters/developer.cps \
138 chapters/installation.cps \
139 chapter/philosophy.cps \
140 chapters/user.cps \
141 chapters/configuration.cps \
142 chapters/vocabulary.cps \
143 fdl-1.3.cps \
144 gpl-3.0.cps
145
146# if HAVE_EXTENDED_DOCUMENTATION_BUILDING
147daemon_lego_block.png: images/daemon_lego_block.svg
148 convert images/daemon_lego_block.svg images/daemon_lego_block.png &&
149 pngcrush images/daemon_lego_block.png images/daemon_lego_block.png
150
151service_lego_block.png: images/service_lego_block.svg
152 convert images/service_lego_block.svg images/service_lego_block.png &&
153 pngcrush images/service_lego_block.png images/serivce_lego_block.png
154
155lego_stack.png: images/lego_stack.svg
156 convert images/lego_stack.svg images/lego_stack.png &&
157 pngcrush images/lego_stack.png images/lego_stack.png
158
159# FIXME: The usage of 'date' strings causes a warning.
160# version.texi:
161# echo "@set UPDATED $(date +'%d %B %Y')" > $@
162# echo "@set UPDATED-MONTH $(date +'%B %Y')" >> $@
163# echo "@set EDITION $(PACKAGE_VERSION)" >> $@
164# echo "@set VERSION $(PACKAGE_VERSION)" >> $@
165
166# Workaround for makeinfo error. Whcih in turn introduces more
167# date-related 'warnings'. Well.
168version2.texi:
169 echo "@set UPDATED $(date +'%d %B %Y')" > $@
170 echo "@set UPDATED-MONTH $(date +'%B %Y')" >> $@
171 echo "@set EDITION $(PACKAGE_VERSION)" >> $@
172 echo "@set VERSION $(PACKAGE_VERSION)" >> $@
173
174# FIXME: rm *.html and *.pdf
175#doc-clean:
176# @rm *.aux *.log *.toc *.cp *.cps
177
178doc-all-install:
179 @mkdir -p $(DESTDIR)/$(docdir)
180 @mkdir -p $(DESTDIR)/$(infoimagedir)
181 @mkdir -p $(DESTDIR)/$(infodir)
182 @install -m 0755 gnunet.pdf $(DESTDIR)/$(docdir)
183 @install -m 0755 gnunet-c-tutorial.pdf $(DESTDIR)/$(docdir)
184 @install -m 0755 gnunet-c-tutorial.info $(DESTDIR)/$(infodir)
185 @install -m 0755 gnunet.info $(DESTDIR)/$(infodir)
186 @install gnunet.html $(DESTDIR)/$(docdir)
187 @install gnunet-c-tutorial.html $(DESTDIR)/$(docdir)
188
189doc-gendoc-install:
190 @mkdir -p $(DESTDIR)/$(docdir)
191 @cp -r manual $(DESTDIR)/$(docdir)
192
193# @cp -r images $(DESTDIR)/$(infoimagedir)
194
195dev-build: version.texi version2.texi
196 @makeinfo --pdf gnunet.texi
197 @makeinfo --pdf gnunet-c-tutorial.texi
198 @makeinfo --html gnunet.texi
199 @makeinfo --html gnunet-c-tutorial.texi
200 @makeinfo --no-split gnunet.texi
201 @makeinfo --no-split gnunet-c-tutorial.texi
202
203# TODO: Add more to clean.
204clean:
205 @rm -f gnunet.pdf
206 @rm -f gnunet.html
207 @rm -f gnunet.info
208 @rm -f gnunet.info-1
209 @rm -f gnunet.info-2
210 @rm -f gnunet.info-3
211 @rm -f gnunet-c-tutorial.pdf
212 @rm -f gnunet-c-tutorial.info
213 @rm -f gnunet-c-tutorial.html
214 @rm -fr gnunet.t2p
215 @rm -fr gnunet-c-tutorial.t2p
216 @rm -fr manual
217
218# CLEANFILES = \
219# gnunet.log \
220# gnunet-c-tutorial.log \
221# $(wildcard *.aux) \
222# $(wildcard *.toc) \
223# $(wildcard *.cp) \
224# $(wildcard *.cps)
225
226#.PHONY: version.texi
227# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_PDF
228
229# if HAVE_EXTENDED_DOCUMENTATION_BUILDING_HTML
230
231# endif
232# endif
233# endif
diff --git a/doc/documentation/README.txt b/doc/documentation/README.txt
new file mode 100644
index 000000000..e3eb6c8ac
--- /dev/null
+++ b/doc/documentation/README.txt
@@ -0,0 +1,104 @@
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
174.1 So, when you refer to a user in general or addressing the user,
18 refer to (1).
194.1.1 Unsolved exceptions for canonical reasons:
20 When refering to Alice, use "she".
21 When refering to Bob, use "he".
22 These are long established examples and they
23 should either be replaced (avoid Alice and Bob
24 examples when you can) or followed.
25
265. Use 2 spaces between sentences, so instead of:
27
28 We do this and the other thing. This is done by foo.
29
30 Write:
31
32 We do this and the other thing. This is done by foo.
33
346. Use @footnote{} instead of putting an @*ref{} to the footnote on a
35 collected footnote-page.
36 In a 200+ pages handbook it's better to have footnotes accessible
37 without having to skip over to the end.
38
396.1 Avoid unnecessary footnotes, keep the text self-explanatory and
40 in a simple language where possible/necessary.
41
42* Completion Levels:
43
44** chapters/philosophy: around 100% fixed after initial export.
45
46* What's left to do
47
48- Which Texlive modules are needed? Decrease the size.
49 - distro specific, or can we set requirements?
50- Update the content of gnunet documentation.
51- XXX: images are only generated for the html documentation
52 with gendoc.sh … FIXME!
53- XXX: png,dot, and svg images MUST be converted to eps by the
54 build system. Right now they aren't, as a result: No images.
55
56* How to use (hack) on this
57
58** with guix
59
60Adjust accordingly, ie read the Guix Documentation:
61setenv GUIX_PACKAGE_PATH "gnunet/contrib/packages/guix/packages"
62guix environment gnunet-doc
63and
64guix build -f contrib/packages/guix/gnunet-doc.scm
65
66** without guix
67
68You need to have Texinfo and Texlive in your path.
69sh bootstrap
70./configure --enable-documentation
71cd doc
72make (format you want)
73
74for example: make html, make info, make pdf
75
76* structure (relations)
77
78** gnunet.texi
79 -> chapters/developer.texi
80 -> chapters/installation.texi
81 -> chapters/philosophy.texi
82 -> chapters/user.texi
83 -> chapters/vocabulary.texi
84 -> images/*
85 -> gpl-3.0.texi
86 -> fdl-1.3.texi
87
88** gnunet-c-tutorial.texi
89 -> figs/Service.pdf
90 -> figs/System.pdf
91 -> tutorial-examples/*.c
92 -> gpl-3.0.texi
93 -> fdl-1.3.texi
94
95- gnunet-c-tutorial-v1.pdf: original LaTeX "gnunet-c-tutorial.pdf".
96- man folder: the man pages.
97- doxygen folder
98- outdated-and-old-installation-instructions.txt: self described within the file.
99
100
101Use `gendocs', add to the manual/ directory of the web site.
102
103 $ cd doc
104 $ 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/contributing.texi b/doc/documentation/chapters/contributing.texi
new file mode 100644
index 000000000..5844fb497
--- /dev/null
+++ b/doc/documentation/chapters/contributing.texi
@@ -0,0 +1,102 @@
1@node GNUnet Contributors Handbook
2@chapter GNUnet Contributors Handbook
3
4@menu
5* Contributing to GNUnet::
6* Licenses of contributions::
7* Copyright Assignment::
8* Contributing to the Reference Manual::
9@end menu
10
11@node Contributing to GNUnet
12@section Contributing to GNUnet
13
14@node Licenses of contributions
15@section Licenses of contributions
16
17GNUnet is a @uref{https://www.gnu.org/, GNU} package.
18All code contributions must thus be put under the
19@uref{https://www.gnu.org/copyleft/gpl.html, GNU Public License (GPL)}.
20All documentation should be put under FSF approved licenses
21(see @uref{https://www.gnu.org/copyleft/fdl.html, fdl}).
22
23By submitting documentation, translations, and other content to GNUnet
24you automatically grant the right to publish code under the
25GNU Public License and documentation under either or both the
26GNU Public License or the GNU Free Documentation License.
27When contributing to the GNUnet project, GNU standards and the
28@uref{https://www.gnu.org/philosophy/philosophy.html, GNU philosophy}
29should be adhered to.
30
31@cindex copyright assignment
32@node Copyright Assignment
33@section Copyright Assignment
34We require a formal copyright assignment for GNUnet contributors
35to GNUnet e.V.; nevertheless, we do allow pseudonymous contributions.
36By signing the copyright agreement and submitting your code (or
37documentation) to us, you agree to share the rights to your code
38with GNUnet e.V.; GNUnet e.V. receives non-exclusive ownership
39rights, and in particular is allowed to dual-license the code. You
40retain non-exclusive rights to your contributions, so you can also
41share your contributions freely with other projects.
42
43GNUnet e.V. will publish all accepted contributions under the GPLv3
44or any later version. The association may decide to publish
45contributions under additional licenses (dual-licensing).
46
47We do not intentionally remove your name from your contributions;
48however, due to extensive editing it is not always trivial to
49attribute contributors properly. If you find that you significantly
50contributed to a file (or the project as a whole) and are not listed
51in the respective authors file or section, please do let us know.
52
53@node Contributing to the Reference Manual
54@section Contributing to the Reference Manual
55
56@itemize @bullet
57
58@item When writing documentation, please use
59@uref{https://en.wikipedia.org/wiki/Singular_they, gender-neutral wording}
60when referring to people, such as singular “they”, “their”, “them”, and so
61forth.
62
63@item Keep line length below 74 characters, except for URLs.
64URLs break in the PDF output when they contain linebreaks.
65
66@item Do not use tab characters (see chapter 2.1 texinfo manual)
67
68@item Use neutral language and third person perspective in the text
69
70@item So, when you refer to a user in general or addressing the user,
71refer to (1).
72@itemize @bullet
73@item Unsolved exceptions for canonical reasons: When refering to Alice,
74use "she". When refering to Bob, use "he". These are long established
75examples and they should either be replaced (avoid Alice and Bob
76examples when you can) or followed.
77@end itemize
78
79@c FIXME: This is questionable, it feels like bike shed painging to do
80@c this for several k lines. It only helps to jump between sentences in
81@c editors afaik.
82@c @item Use 2 spaces between sentences, so instead of:
83
84@c @example
85@c We do this and the other thing. This is done by foo.
86@c @end example
87
88@c Write:
89
90@c @example
91@c We do this and the other thing. This is done by foo.
92@c @end example
93
94@item Use @@footnote@{@} instead of putting an @@*ref@{@} to the
95footnote on a collected footnote-page.
96In a 200+ pages handbook it's better to have footnotes accessible
97without having to skip over to the end.
98
99@item Avoid unnecessary footnotes, keep the text self-explanatory and
100in a simple language where possible/necessary.
101
102@end itemize
diff --git a/doc/documentation/chapters/developer.texi b/doc/documentation/chapters/developer.texi
new file mode 100644
index 000000000..70fd7c7eb
--- /dev/null
+++ b/doc/documentation/chapters/developer.texi
@@ -0,0 +1,8341 @@
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.
8
9For developers, GNUnet is:
10
11@itemize @bullet
12@item developed by a community that believes in the GNU philosophy
13@item Free Software (Free as in Freedom), licensed under the
14GNU General Public License
15@item A set of standards, including coding conventions and
16architectural rules
17@item A set of layered protocols, both specifying the communication
18between peers as well as the communication between components
19of a single peer
20@item A set of libraries with well-defined APIs suitable for
21writing extensions
22@end itemize
23
24In particular, the architecture specifies that a peer consists of many
25processes communicating via protocols. Processes can be written in almost
26any language.
27C and Java @footnote{As well as Guile} APIs exist for accessing existing
28services and for writing extensions.
29It is possible to write extensions in other languages by
30implementing the necessary IPC protocols.
31
32GNUnet can be extended and improved along many possible dimensions, and
33anyone interested in Free Software and Freedom-enhancing Networking is
34welcome to join the effort. This Developer Handbook attempts to provide
35an initial introduction to some of the key design choices and central
36components of the system.
37This part of the GNUNet documentation is far from complete,
38and we welcome informed contributions, be it in the form of
39new chapters, sections or insightful comments.
40
41@menu
42* Developer Introduction::
43* Code overview::
44* System Architecture::
45* Subsystem stability::
46* Naming conventions and coding style guide::
47* Build-system::
48* Developing extensions for GNUnet using the gnunet-ext template::
49* Writing testcases::
50* TESTING library::
51* Performance regression analysis with Gauger::
52* TESTBED Subsystem::
53* libgnunetutil::
54* Automatic Restart Manager (ARM)::
55* TRANSPORT Subsystem::
56* NAT library::
57* Distance-Vector plugin::
58* SMTP plugin::
59* Bluetooth plugin::
60* WLAN plugin::
61* ATS Subsystem::
62* CORE Subsystem::
63* CADET Subsystem::
64* NSE Subsystem::
65* HOSTLIST Subsystem::
66* IDENTITY Subsystem::
67* NAMESTORE Subsystem::
68* PEERINFO Subsystem::
69* PEERSTORE Subsystem::
70* SET Subsystem::
71* STATISTICS Subsystem::
72* Distributed Hash Table (DHT)::
73* GNU Name System (GNS)::
74* GNS Namecache::
75* REVOCATION Subsystem::
76* File-sharing (FS) Subsystem::
77* REGEX Subsystem::
78@end menu
79
80@node Developer Introduction
81@section Developer Introduction
82
83This Developer Handbook is intended as first introduction to GNUnet for
84new developers that want to extend the GNUnet framework. After the
85introduction, each of the GNUnet subsystems (directories in the
86@file{src/} tree) is (supposed to be) covered in its own chapter. In
87addition to this documentation, GNUnet developers should be aware of the
88services available on the GNUnet server to them.
89
90New developers can have a look a the GNUnet tutorials for C and java
91available in the @file{src/} directory of the repository or under the
92following links:
93
94@c ** FIXME: Link to files in source, not online.
95@c ** FIXME: Where is the Java tutorial?
96@itemize @bullet
97@item @uref{https://gnunet.org/git/gnunet.git/plain/doc/gnunet-c-tutorial.pdf, GNUnet C tutorial}
98@item GNUnet Java tutorial
99@end itemize
100
101In addition to the GNUnet Reference Documentation you are reading,
102the GNUnet server at @uref{https://gnunet.org} contains
103various resources for GNUnet developers and those
104who aspire to become regular contributors.
105They are all conveniently reachable via the "Developer"
106entry in the navigation menu. Some additional tools (such as static
107analysis reports) require a special developer access to perform certain
108operations. If you want (or require) access, you should contact
109@uref{http://grothoff.org/christian/, Christian Grothoff},
110GNUnet's maintainer.
111
112The public subsystems on the GNUnet server that help developers are:
113
114@itemize @bullet
115
116@item The version control system (git) keeps our code and enables
117distributed development.
118It is pubclicly accessible at @uref{https://gnunet.org/git/}.
119Only developers with write access can commit code, everyone else is
120encouraged to submit patches to the
121@uref{https://lists.gnu.org/mailman/listinfo/gnunet-developers, GNUnet-developers mailinglist}.
122
123@item The bugtracking system (Mantis).
124We use it to track feature requests, open bug reports and their
125resolutions.
126It can be accessed at @uref{https://gnunet.org/bugs/}.
127Anyone can report bugs, but only developers can claim to have fixed them.
128
129@item Our site installation of the
130CI@footnote{Continuous Integration} system @code{Buildbot} is used
131to check GNUnet builds automatically on a range of platforms.
132The web interface of this CI is exposed at
133@uref{https://gnunet.org/buildbot/}.
134Builds are triggered automatically 30 minutes after the last commit to
135our repository was made.
136
137@item The current quality of our automated test suite is assessed using
138Code coverage analysis. This analysis is run daily; however the webpage
139is only updated if all automated tests pass at that time. Testcases that
140improve our code coverage are always welcome.
141
142@item We try to automatically find bugs using a static analysis scan.
143This scan is run daily; however the webpage is only updated if all
144automated tests pass at the time. Note that not everything that is
145flagged by the analysis is a bug, sometimes even good code can be marked
146as possibly problematic. Nevertheless, developers are encouraged to at
147least be aware of all issues in their code that are listed.
148
149@item We use Gauger for automatic performance regression visualization.
150Details on how to use Gauger are here.
151
152@item We use @uref{http://junit.org/, junit} to automatically test
153@command{gnunet-java}.
154Automatically generated, current reports on the test suite are here.
155
156@item We use Cobertura to generate test coverage reports for gnunet-java.
157Current reports on test coverage are here.
158
159@end itemize
160
161
162
163@c ***********************************************************************
164@menu
165* Project overview::
166@end menu
167
168@node Project overview
169@subsection Project overview
170
171The GNUnet project consists at this point of several sub-projects. This
172section is supposed to give an initial overview about the various
173sub-projects. Note that this description also lists projects that are far
174from complete, including even those that have literally not a single line
175of code in them yet.
176
177GNUnet sub-projects in order of likely relevance are currently:
178
179@table @asis
180
181@item @command{gnunet}
182Core of the P2P framework, including file-sharing, VPN and
183chat applications; this is what the Developer Handbook covers mostly
184@item @command{gnunet-gtk}
185Gtk+-based user interfaces, including:
186
187@itemize @bullet
188@item @command{gnunet-fs-gtk} (file-sharing),
189@item @command{gnunet-statistics-gtk} (statistics over time),
190@item @command{gnunet-peerinfo-gtk}
191(information about current connections and known peers),
192@item @command{gnunet-chat-gtk} (chat GUI) and
193@item @command{gnunet-setup} (setup tool for "everything")
194@end itemize
195
196@item @command{gnunet-fuse}
197Mounting directories shared via GNUnet's file-sharing
198on GNU/Linux distributions
199@item @command{gnunet-update}
200Installation and update tool
201@item @command{gnunet-ext}
202Template for starting 'external' GNUnet projects
203@item @command{gnunet-java}
204Java APIs for writing GNUnet services and applications
205@c ** FIXME: Point to new website repository once we have it:
206@c ** @item svn/gnunet-www/ Code and media helping drive the GNUnet
207@c website
208@item @command{eclectic}
209Code to run GNUnet nodes on testbeds for research, development,
210testing and evaluation
211@c ** FIXME: Solve the status and location of gnunet-qt
212@item @command{gnunet-qt}
213Qt-based GNUnet GUI (is it depreacated?)
214@item @command{gnunet-cocoa}
215cocoa-based GNUnet GUI (is it depreacated?)
216@item @command{gnunet-guile}
217
218@end table
219
220We are also working on various supporting libraries and tools:
221@c ** FIXME: What about gauger, and what about libmwmodem?
222
223@table @asis
224@item @command{libextractor}
225GNU libextractor (meta data extraction)
226@item @command{libmicrohttpd}
227GNU libmicrohttpd (embedded HTTP(S) server library)
228@item @command{gauger}
229Tool for performance regression analysis
230@item @command{monkey}
231Tool for automated debugging of distributed systems
232@item @command{libmwmodem}
233Library for accessing satellite connection quality
234reports
235@item @command{libgnurl}
236gnURL (feature-restricted variant of cURL/libcurl)
237@end table
238
239Finally, there are various external projects (see links for a list of
240those that have a public website) which build on top of the GNUnet
241framework.
242
243@c ***********************************************************************
244@node Code overview
245@section Code overview
246
247This section gives a brief overview of the GNUnet source code.
248Specifically, we sketch the function of each of the subdirectories in
249the @file{gnunet/src/} directory. The order given is roughly bottom-up
250(in terms of the layers of the system).
251
252@table @asis
253@item @file{util/} --- libgnunetutil
254Library with general utility functions, all
255GNUnet binaries link against this library. Anything from memory
256allocation and data structures to cryptography and inter-process
257communication. The goal is to provide an OS-independent interface and
258more 'secure' or convenient implementations of commonly used primitives.
259The API is spread over more than a dozen headers, developers should study
260those closely to avoid duplicating existing functions.
261@pxref{libgnunetutil}.
262@item @file{hello/} --- libgnunethello
263HELLO messages are used to
264describe under which addresses a peer can be reached (for example,
265protocol, IP, port). This library manages parsing and generating of HELLO
266messages.
267@item @file{block/} --- libgnunetblock
268The DHT and other components of GNUnet
269store information in units called 'blocks'. Each block has a type and the
270type defines a particular format and how that binary format is to be
271linked to a hash code (the key for the DHT and for databases). The block
272library is a wapper around block plugins which provide the necessary
273functions for each block type.
274@item @file{statistics/} --- statistics service
275The statistics service enables associating
276values (of type uint64_t) with a componenet name and a string. The main
277uses is debugging (counting events), performance tracking and user
278entertainment (what did my peer do today?).
279@item @file{arm/} --- Automatic Restart Manager (ARM)
280The automatic-restart-manager (ARM) service
281is the GNUnet master service. Its role is to start gnunet-services, to
282re-start them when they crashed and finally to shut down the system when
283requested.
284@item @file{peerinfo/} --- peerinfo service
285The peerinfo service keeps track of which peers are known
286to the local peer and also tracks the validated addresses for each peer
287(in the form of a HELLO message) for each of those peers. The peer is not
288necessarily connected to all peers known to the peerinfo service.
289Peerinfo provides persistent storage for peer identities --- peers are
290not forgotten just because of a system restart.
291@item @file{datacache/} --- libgnunetdatacache
292The datacache library provides (temporary) block storage for the DHT.
293Existing plugins can store blocks in Sqlite, Postgres or MySQL databases.
294All data stored in the cache is lost when the peer is stopped or
295restarted (datacache uses temporary tables).
296@item @file{datastore/} --- datastore service
297The datastore service stores file-sharing blocks in
298databases for extended periods of time. In contrast to the datacache, data
299is not lost when peers restart. However, quota restrictions may still
300cause old, expired or low-priority data to be eventually discarded.
301Existing plugins can store blocks in Sqlite, Postgres or MySQL databases.
302@item @file{template/} --- service template
303Template for writing a new service. Does nothing.
304@item @file{ats/} --- Automatic Transport Selection
305The automatic transport selection (ATS) service
306is responsible for deciding which address (i.e.
307which transport plugin) should be used for communication with other peers,
308and at what bandwidth.
309@item @file{nat/} --- libgnunetnat
310Library that provides basic functions for NAT traversal.
311The library supports NAT traversal with
312manual hole-punching by the user, UPnP and ICMP-based autonomous NAT
313traversal. The library also includes an API for testing if the current
314configuration works and the @code{gnunet-nat-server} which provides an
315external service to test the local configuration.
316@item @file{fragmentation/} --- libgnunetfragmentation
317Some transports (UDP and WLAN, mostly) have restrictions on the maximum
318transfer unit (MTU) for packets. The fragmentation library can be used to
319break larger packets into chunks of at most 1k and transmit the resulting
320fragments reliabily (with acknowledgement, retransmission, timeouts,
321etc.).
322@item @file{transport/} --- transport service
323The transport service is responsible for managing the
324basic P2P communication. It uses plugins to support P2P communication
325over TCP, UDP, HTTP, HTTPS and other protocols.The transport service
326validates peer addresses, enforces bandwidth restrictions, limits the
327total number of connections and enforces connectivity restrictions (i.e.
328friends-only).
329@item @file{peerinfo-tool/} --- gnunet-peerinfo
330This directory contains the gnunet-peerinfo binary which can be used to
331inspect the peers and HELLOs known to the peerinfo service.
332@item @file{core/}
333The core service is responsible for establishing encrypted, authenticated
334connections with other peers, encrypting and decrypting messages and
335forwarding messages to higher-level services that are interested in them.
336@item @file{testing/} --- libgnunettesting
337The testing library allows starting (and stopping) peers
338for writing testcases.
339It also supports automatic generation of configurations for peers
340ensuring that the ports and paths are disjoint. libgnunettesting is also
341the foundation for the testbed service
342@item @file{testbed/} --- testbed service
343The testbed service is used for creating small or large scale deployments
344of GNUnet peers for evaluation of protocols.
345It facilitates peer depolyments on multiple
346hosts (for example, in a cluster) and establishing varous network
347topologies (both underlay and overlay).
348@item @file{nse/} --- Network Size Estimation
349The network size estimation (NSE) service
350implements a protocol for (securely) estimating the current size of the
351P2P network.
352@item @file{dht/} --- distributed hash table
353The distributed hash table (DHT) service provides a
354distributed implementation of a hash table to store blocks under hash
355keys in the P2P network.
356@item @file{hostlist/} --- hostlist service
357The hostlist service allows learning about
358other peers in the network by downloading HELLO messages from an HTTP
359server, can be configured to run such an HTTP server and also implements
360a P2P protocol to advertise and automatically learn about other peers
361that offer a public hostlist server.
362@item @file{topology/} --- topology service
363The topology service is responsible for
364maintaining the mesh topology. It tries to maintain connections to friends
365(depending on the configuration) and also tries to ensure that the peer
366has a decent number of active connections at all times. If necessary, new
367connections are added. All peers should run the topology service,
368otherwise they may end up not being connected to any other peer (unless
369some other service ensures that core establishes the required
370connections). The topology service also tells the transport service which
371connections are permitted (for friend-to-friend networking)
372@item @file{fs/} --- file-sharing
373The file-sharing (FS) service implements GNUnet's
374file-sharing application. Both anonymous file-sharing (using gap) and
375non-anonymous file-sharing (using dht) are supported.
376@item @file{cadet/} --- cadet service
377The CADET service provides a general-purpose routing abstraction to create
378end-to-end encrypted tunnels in mesh networks. We wrote a paper
379documenting key aspects of the design.
380@item @file{tun/} --- libgnunettun
381Library for building IPv4, IPv6 packets and creating
382checksums for UDP, TCP and ICMP packets. The header
383defines C structs for common Internet packet formats and in particular
384structs for interacting with TUN (virtual network) interfaces.
385@item @file{mysql/} --- libgnunetmysql
386Library for creating and executing prepared MySQL
387statements and to manage the connection to the MySQL database.
388Essentially a lightweight wrapper for the interaction between GNUnet
389components and libmysqlclient.
390@item @file{dns/}
391Service that allows intercepting and modifying DNS requests of
392the local machine. Currently used for IPv4-IPv6 protocol translation
393(DNS-ALG) as implemented by "pt/" and for the GNUnet naming system. The
394service can also be configured to offer an exit service for DNS traffic.
395@item @file{vpn/} --- VPN service
396The virtual public network (VPN) service provides a virtual
397tunnel interface (VTUN) for IP routing over GNUnet.
398Needs some other peers to run an "exit" service to work.
399Can be activated using the "gnunet-vpn" tool or integrated with DNS using
400the "pt" daemon.
401@item @file{exit/}
402Daemon to allow traffic from the VPN to exit this
403peer to the Internet or to specific IP-based services of the local peer.
404Currently, an exit service can only be restricted to IPv4 or IPv6, not to
405specific ports and or IP address ranges. If this is not acceptable,
406additional firewall rules must be added manually. exit currently only
407works for normal UDP, TCP and ICMP traffic; DNS queries need to leave the
408system via a DNS service.
409@item @file{pt/}
410protocol translation daemon. This daemon enables 4-to-6,
4116-to-4, 4-over-6 or 6-over-4 transitions for the local system. It
412essentially uses "DNS" to intercept DNS replies and then maps results to
413those offered by the VPN, which then sends them using mesh to some daemon
414offering an appropriate exit service.
415@item @file{identity/}
416Management of egos (alter egos) of a user; identities are
417essentially named ECC private keys and used for zones in the GNU name
418system and for namespaces in file-sharing, but might find other uses later
419@item @file{revocation/}
420Key revocation service, can be used to revoke the
421private key of an identity if it has been compromised
422@item @file{namecache/}
423Cache for resolution results for the GNU name system;
424data is encrypted and can be shared among users,
425loss of the data should ideally only result in a
426performance degradation (persistence not required)
427@item @file{namestore/}
428Database for the GNU name system with per-user private information,
429persistence required
430@item @file{gns/}
431GNU name system, a GNU approach to DNS and PKI.
432@item @file{dv/}
433A plugin for distance-vector (DV)-based routing.
434DV consists of a service and a transport plugin to provide peers
435with the illusion of a direct P2P connection for connections
436that use multiple (typically up to 3) hops in the actual underlay network.
437@item @file{regex/}
438Service for the (distributed) evaluation of regular expressions.
439@item @file{scalarproduct/}
440The scalar product service offers an API to perform a secure multiparty
441computation which calculates a scalar product between two peers
442without exposing the private input vectors of the peers to each other.
443@item @file{consensus/}
444The consensus service will allow a set of peers to agree
445on a set of values via a distributed set union computation.
446@item @file{rest/}
447The rest API allows access to GNUnet services using RESTful interaction.
448The services provide plugins that can exposed by the rest server.
449@item @file{experimentation/}
450The experimentation daemon coordinates distributed
451experimentation to evaluate transport and ATS properties.
452@end table
453
454@c ***********************************************************************
455@node System Architecture
456@section System Architecture
457
458GNUnet developers like LEGOs. The blocks are indestructible, can be
459stacked together to construct complex buildings and it is generally easy
460to swap one block for a different one that has the same shape. GNUnet's
461architecture is based on LEGOs:
462
463@c images here
464
465This chapter documents the GNUnet LEGO system, also known as GNUnet's
466system architecture.
467
468The most common GNUnet component is a service. Services offer an API (or
469several, depending on what you count as "an API") which is implemented as
470a library. The library communicates with the main process of the service
471using a service-specific network protocol. The main process of the service
472typically doesn't fully provide everything that is needed --- it has holes
473to be filled by APIs to other services.
474
475A special kind of component in GNUnet are user interfaces and daemons.
476Like services, they have holes to be filled by APIs of other services.
477Unlike services, daemons do not implement their own network protocol and
478they have no API:
479
480The GNUnet system provides a range of services, daemons and user
481interfaces, which are then combined into a layered GNUnet instance (also
482known as a peer).
483
484Note that while it is generally possible to swap one service for another
485compatible service, there is often only one implementation. However,
486during development we often have a "new" version of a service in parallel
487with an "old" version. While the "new" version is not working, developers
488working on other parts of the service can continue their development by
489simply using the "old" service. Alternative design ideas can also be
490easily investigated by swapping out individual components. This is
491typically achieved by simply changing the name of the "BINARY" in the
492respective configuration section.
493
494Key properties of GNUnet services are that they must be separate
495processes and that they must protect themselves by applying tight error
496checking against the network protocol they implement (thereby achieving a
497certain degree of robustness).
498
499On the other hand, the APIs are implemented to tolerate failures of the
500service, isolating their host process from errors by the service. If the
501service process crashes, other services and daemons around it should not
502also fail, but instead wait for the service process to be restarted by
503ARM.
504
505
506@c ***********************************************************************
507@node Subsystem stability
508@section Subsystem stability
509
510This section documents the current stability of the various GNUnet
511subsystems. Stability here describes the expected degree of compatibility
512with future versions of GNUnet. For each subsystem we distinguish between
513compatibility on the P2P network level (communication protocol between
514peers), the IPC level (communication between the service and the service
515library) and the API level (stability of the API). P2P compatibility is
516relevant in terms of which applications are likely going to be able to
517communicate with future versions of the network. IPC communication is
518relevant for the implementation of language bindings that re-implement the
519IPC messages. Finally, API compatibility is relevant to developers that
520hope to be able to avoid changes to applications build on top of the APIs
521of the framework.
522
523The following table summarizes our current view of the stability of the
524respective protocols or APIs:
525
526@multitable @columnfractions .20 .20 .20 .20
527@headitem Subsystem @tab P2P @tab IPC @tab C API
528@item util @tab n/a @tab n/a @tab stable
529@item arm @tab n/a @tab stable @tab stable
530@item ats @tab n/a @tab unstable @tab testing
531@item block @tab n/a @tab n/a @tab stable
532@item cadet @tab testing @tab testing @tab testing
533@item consensus @tab experimental @tab experimental @tab experimental
534@item core @tab stable @tab stable @tab stable
535@item datacache @tab n/a @tab n/a @tab stable
536@item datastore @tab n/a @tab stable @tab stable
537@item dht @tab stable @tab stable @tab stable
538@item dns @tab stable @tab stable @tab stable
539@item dv @tab testing @tab testing @tab n/a
540@item exit @tab testing @tab n/a @tab n/a
541@item fragmentation @tab stable @tab n/a @tab stable
542@item fs @tab stable @tab stable @tab stable
543@item gns @tab stable @tab stable @tab stable
544@item hello @tab n/a @tab n/a @tab testing
545@item hostlist @tab stable @tab stable @tab n/a
546@item identity @tab stable @tab stable @tab n/a
547@item multicast @tab experimental @tab experimental @tab experimental
548@item mysql @tab stable @tab n/a @tab stable
549@item namestore @tab n/a @tab stable @tab stable
550@item nat @tab n/a @tab n/a @tab stable
551@item nse @tab stable @tab stable @tab stable
552@item peerinfo @tab n/a @tab stable @tab stable
553@item psyc @tab experimental @tab experimental @tab experimental
554@item pt @tab n/a @tab n/a @tab n/a
555@item regex @tab stable @tab stable @tab stable
556@item revocation @tab stable @tab stable @tab stable
557@item social @tab experimental @tab experimental @tab experimental
558@item statistics @tab n/a @tab stable @tab stable
559@item testbed @tab n/a @tab testing @tab testing
560@item testing @tab n/a @tab n/a @tab testing
561@item topology @tab n/a @tab n/a @tab n/a
562@item transport @tab stable @tab stable @tab stable
563@item tun @tab n/a @tab n/a @tab stable
564@item vpn @tab testing @tab n/a @tab n/a
565@end multitable
566
567Here is a rough explanation of the values:
568
569@table @samp
570@item stable
571No incompatible changes are planned at this time; for IPC/APIs, if
572there are incompatible changes, they will be minor and might only require
573minimal changes to existing code; for P2P, changes will be avoided if at
574all possible for the 0.10.x-series
575
576@item testing
577No incompatible changes are
578planned at this time, but the code is still known to be in flux; so while
579we have no concrete plans, our expectation is that there will still be
580minor modifications; for P2P, changes will likely be extensions that
581should not break existing code
582
583@item unstable
584Changes are planned and will happen; however, they
585will not be totally radical and the result should still resemble what is
586there now; nevertheless, anticipated changes will break protocol/API
587compatibility
588
589@item experimental
590Changes are planned and the result may look nothing like
591what the API/protocol looks like today
592
593@item unknown
594Someone should think about where this subsystem headed
595
596@item n/a
597This subsystem does not have an API/IPC-protocol/P2P-protocol
598@end table
599
600@c ***********************************************************************
601@node Naming conventions and coding style guide
602@section Naming conventions and coding style guide
603
604Here you can find some rules to help you write code for GNUnet.
605
606@c ***********************************************************************
607@menu
608* Naming conventions::
609* Coding style::
610@end menu
611
612@node Naming conventions
613@subsection Naming conventions
614
615
616@c ***********************************************************************
617@menu
618* include files::
619* binaries::
620* logging::
621* configuration::
622* exported symbols::
623* private (library-internal) symbols (including structs and macros)::
624* testcases::
625* performance tests::
626* src/ directories::
627@end menu
628
629@node include files
630@subsubsection include files
631
632@itemize @bullet
633@item _lib: library without need for a process
634@item _service: library that needs a service process
635@item _plugin: plugin definition
636@item _protocol: structs used in network protocol
637@item exceptions:
638@itemize @bullet
639@item gnunet_config.h --- generated
640@item platform.h --- first included
641@item plibc.h --- external library
642@item gnunet_common.h --- fundamental routines
643@item gnunet_directories.h --- generated
644@item gettext.h --- external library
645@end itemize
646@end itemize
647
648@c ***********************************************************************
649@node binaries
650@subsubsection binaries
651
652@itemize @bullet
653@item gnunet-service-xxx: service process (has listen socket)
654@item gnunet-daemon-xxx: daemon process (no listen socket)
655@item gnunet-helper-xxx[-yyy]: SUID helper for module xxx
656@item gnunet-yyy: command-line tool for end-users
657@item libgnunet_plugin_xxx_yyy.so: plugin for API xxx
658@item libgnunetxxx.so: library for API xxx
659@end itemize
660
661@c ***********************************************************************
662@node logging
663@subsubsection logging
664
665@itemize @bullet
666@item services and daemons use their directory name in
667@code{GNUNET_log_setup} (i.e. 'core') and log using
668plain 'GNUNET_log'.
669@item command-line tools use their full name in
670@code{GNUNET_log_setup} (i.e. 'gnunet-publish') and log using
671plain 'GNUNET_log'.
672@item service access libraries log using
673'@code{GNUNET_log_from}' and use '@code{DIRNAME-api}' for the
674component (i.e. 'core-api')
675@item pure libraries (without associated service) use
676'@code{GNUNET_log_from}' with the component set to their
677library name (without lib or '@file{.so}'),
678which should also be their directory name (i.e. '@file{nat}')
679@item plugins should use '@code{GNUNET_log_from}'
680with the directory name and the plugin name combined to produce
681the component name (i.e. 'transport-tcp').
682@item logging should be unified per-file by defining a
683@code{LOG} macro with the appropriate arguments,
684along these lines:
685
686@example
687#define LOG(kind,...)
688GNUNET_log_from (kind, "example-api",__VA_ARGS__)
689@end example
690
691@end itemize
692
693@c ***********************************************************************
694@node configuration
695@subsubsection configuration
696
697@itemize @bullet
698@item paths (that are substituted in all filenames) are in PATHS
699(have as few as possible)
700@item all options for a particular module (@file{src/MODULE})
701are under @code{[MODULE]}
702@item options for a plugin of a module
703are under @code{[MODULE-PLUGINNAME]}
704@end itemize
705
706@c ***********************************************************************
707@node exported symbols
708@subsubsection exported symbols
709
710@itemize @bullet
711@item must start with @code{GNUNET_modulename_} and be defined in
712@file{modulename.c}
713@item exceptions: those defined in @file{gnunet_common.h}
714@end itemize
715
716@c ***********************************************************************
717@node private (library-internal) symbols (including structs and macros)
718@subsubsection private (library-internal) symbols (including structs and macros)
719
720@itemize @bullet
721@item must NOT start with any prefix
722@item must not be exported in a way that linkers could use them or@ other
723libraries might see them via headers; they must be either
724declared/defined in C source files or in headers that are in the
725respective directory under @file{src/modulename/} and NEVER be declared
726in @file{src/include/}.
727@end itemize
728
729@node testcases
730@subsubsection testcases
731
732@itemize @bullet
733@item must be called @file{test_module-under-test_case-description.c}
734@item "case-description" maybe omitted if there is only one test
735@end itemize
736
737@c ***********************************************************************
738@node performance tests
739@subsubsection performance tests
740
741@itemize @bullet
742@item must be called @file{perf_module-under-test_case-description.c}
743@item "case-description" maybe omitted if there is only one performance
744test
745@item Must only be run if @code{HAVE_BENCHMARKS} is satisfied
746@end itemize
747
748@c ***********************************************************************
749@node src/ directories
750@subsubsection src/ directories
751
752@itemize @bullet
753@item gnunet-NAME: end-user applications (i.e., gnunet-search, gnunet-arm)
754@item gnunet-service-NAME: service processes with accessor library (i.e.,
755gnunet-service-arm)
756@item libgnunetNAME: accessor library (_service.h-header) or standalone
757library (_lib.h-header)
758@item gnunet-daemon-NAME: daemon process without accessor library (i.e.,
759gnunet-daemon-hostlist) and no GNUnet management port
760@item libgnunet_plugin_DIR_NAME: loadable plugins (i.e.,
761libgnunet_plugin_transport_tcp)
762@end itemize
763
764@cindex Coding style
765@node Coding style
766@subsection Coding style
767
768@c XXX: Adjust examples to GNU Standards!
769@itemize @bullet
770@item We follow the GNU Coding Standards (@pxref{Top, The GNU Coding Standards,, standards, The GNU Coding Standards});
771@item Indentation is done with spaces, two per level, no tabs;
772@item C99 struct initialization is fine;
773@item declare only one variable per line, for example:
774
775@noindent
776instead of
777
778@example
779int i,j;
780@end example
781
782@noindent
783write:
784
785@example
786int i;
787int j;
788@end example
789
790@c TODO: include actual example from a file in source
791
792@noindent
793This helps keep diffs small and forces developers to think precisely about
794the type of every variable.
795Note that @code{char *} is different from @code{const char*} and
796@code{int} is different from @code{unsigned int} or @code{uint32_t}.
797Each variable type should be chosen with care.
798
799@item While @code{goto} should generally be avoided, having a
800@code{goto} to the end of a function to a block of clean up
801statements (free, close, etc.) can be acceptable.
802
803@item Conditions should be written with constants on the left (to avoid
804accidental assignment) and with the 'true' target being either the
805'error' case or the significantly simpler continuation. For example:
806
807@example
808if (0 != stat ("filename," &sbuf)) @{
809 error();
810 @}
811 else @{
812 /* handle normal case here */
813 @}
814@end example
815
816@noindent
817instead of
818
819@example
820if (stat ("filename," &sbuf) == 0) @{
821 /* handle normal case here */
822 @} else @{
823 error();
824 @}
825@end example
826
827@noindent
828If possible, the error clause should be terminated with a 'return' (or
829'goto' to some cleanup routine) and in this case, the 'else' clause
830should be omitted:
831
832@example
833if (0 != stat ("filename," &sbuf)) @{
834 error();
835 return;
836 @}
837/* handle normal case here */
838@end example
839
840This serves to avoid deep nesting. The 'constants on the left' rule
841applies to all constants (including. @code{GNUNET_SCHEDULER_NO_TASK}),
842NULL, and enums). With the two above rules (constants on left, errors in
843'true' branch), there is only one way to write most branches correctly.
844
845@item Combined assignments and tests are allowed if they do not hinder
846code clarity. For example, one can write:
847
848@example
849if (NULL == (value = lookup_function())) @{
850 error();
851 return;
852 @}
853@end example
854
855@item Use @code{break} and @code{continue} wherever possible to avoid
856deep(er) nesting. Thus, we would write:
857
858@example
859next = head;
860while (NULL != (pos = next)) @{
861 next = pos->next;
862 if (! should_free (pos))
863 continue;
864 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
865 GNUNET_free (pos);
866 @}
867@end example
868
869instead of
870
871@example
872next = head; while (NULL != (pos = next)) @{
873 next = pos->next;
874 if (should_free (pos)) @{
875 /* unnecessary nesting! */
876 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
877 GNUNET_free (pos);
878 @}
879 @}
880@end example
881
882@item We primarily use @code{for} and @code{while} loops.
883A @code{while} loop is used if the method for advancing in the loop is
884not a straightforward increment operation. In particular, we use:
885
886@example
887next = head;
888while (NULL != (pos = next))
889@{
890 next = pos->next;
891 if (! should_free (pos))
892 continue;
893 GNUNET_CONTAINER_DLL_remove (head, tail, pos);
894 GNUNET_free (pos);
895@}
896@end example
897
898to free entries in a list (as the iteration changes the structure of the
899list due to the free; the equivalent @code{for} loop does no longer
900follow the simple @code{for} paradigm of @code{for(INIT;TEST;INC)}).
901However, for loops that do follow the simple @code{for} paradigm we do
902use @code{for}, even if it involves linked lists:
903
904@example
905/* simple iteration over a linked list */
906for (pos = head;
907 NULL != pos;
908 pos = pos->next)
909@{
910 use (pos);
911@}
912@end example
913
914
915@item The first argument to all higher-order functions in GNUnet must be
916declared to be of type @code{void *} and is reserved for a closure. We do
917not use inner functions, as trampolines would conflict with setups that
918use non-executable stacks.
919The first statement in a higher-order function, which unusually should
920be part of the variable declarations, should assign the
921@code{cls} argument to the precise expected type. For example:
922
923@example
924int callback (void *cls, char *args) @{
925 struct Foo *foo = cls;
926 int other_variables;
927
928 /* rest of function */
929@}
930@end example
931
932
933@item It is good practice to write complex @code{if} expressions instead
934of using deeply nested @code{if} statements. However, except for addition
935and multiplication, all operators should use parens. This is fine:
936
937@example
938if ( (1 == foo) || ((0 == bar) && (x != y)) )
939 return x;
940@end example
941
942
943However, this is not:
944
945@example
946if (1 == foo)
947 return x;
948if (0 == bar && x != y)
949 return x;
950@end example
951
952@noindent
953Note that splitting the @code{if} statement above is debateable as the
954@code{return x} is a very trivial statement. However, once the logic after
955the branch becomes more complicated (and is still identical), the "or"
956formulation should be used for sure.
957
958@item There should be two empty lines between the end of the function and
959the comments describing the following function. There should be a single
960empty line after the initial variable declarations of a function. If a
961function has no local variables, there should be no initial empty line. If
962a long function consists of several complex steps, those steps might be
963separated by an empty line (possibly followed by a comment describing the
964following step). The code should not contain empty lines in arbitrary
965places; if in doubt, it is likely better to NOT have an empty line (this
966way, more code will fit on the screen).
967@end itemize
968
969@c ***********************************************************************
970@node Build-system
971@section Build-system
972
973If you have code that is likely not to compile or build rules you might
974want to not trigger for most developers, use @code{if HAVE_EXPERIMENTAL}
975in your @file{Makefile.am}.
976Then it is OK to (temporarily) add non-compiling (or known-to-not-port)
977code.
978
979If you want to compile all testcases but NOT run them, run configure with
980the @code{--enable-test-suppression} option.
981
982If you want to run all testcases, including those that take a while, run
983configure with the @code{--enable-expensive-testcases} option.
984
985If you want to compile and run benchmarks, run configure with the
986@code{--enable-benchmarks} option.
987
988If you want to obtain code coverage results, run configure with the
989@code{--enable-coverage} option and run the @file{coverage.sh} script in
990the @file{contrib/} directory.
991
992@cindex gnunet-ext
993@node Developing extensions for GNUnet using the gnunet-ext template
994@section Developing extensions for GNUnet using the gnunet-ext template
995
996For developers who want to write extensions for GNUnet we provide the
997gnunet-ext template to provide an easy to use skeleton.
998
999gnunet-ext contains the build environment and template files for the
1000development of GNUnet services, command line tools, APIs and tests.
1001
1002First of all you have to obtain gnunet-ext from git:
1003
1004@example
1005git clone https://gnunet.org/git/gnunet-ext.git
1006@end example
1007
1008The next step is to bootstrap and configure it. For configure you have to
1009provide the path containing GNUnet with
1010@code{--with-gnunet=/path/to/gnunet} and the prefix where you want the
1011install the extension using @code{--prefix=/path/to/install}:
1012
1013@example
1014./bootstrap
1015./configure --prefix=/path/to/install --with-gnunet=/path/to/gnunet
1016@end example
1017
1018When your GNUnet installation is not included in the default linker search
1019path, you have to add @code{/path/to/gnunet} to the file
1020@file{/etc/ld.so.conf} and run @code{ldconfig} or your add it to the
1021environmental variable @code{LD_LIBRARY_PATH} by using
1022
1023@example
1024export LD_LIBRARY_PATH=/path/to/gnunet/lib
1025@end example
1026
1027@cindex writing testcases
1028@node Writing testcases
1029@section Writing testcases
1030
1031Ideally, any non-trivial GNUnet code should be covered by automated
1032testcases. Testcases should reside in the same place as the code that is
1033being tested. The name of source files implementing tests should begin
1034with @code{test_} followed by the name of the file that contains
1035the code that is being tested.
1036
1037Testcases in GNUnet should be integrated with the autotools build system.
1038This way, developers and anyone building binary packages will be able to
1039run all testcases simply by running @code{make check}. The final
1040testcases shipped with the distribution should output at most some brief
1041progress information and not display debug messages by default. The
1042success or failure of a testcase must be indicated by returning zero
1043(success) or non-zero (failure) from the main method of the testcase.
1044The integration with the autotools is relatively straightforward and only
1045requires modifications to the @file{Makefile.am} in the directory
1046containing the testcase. For a testcase testing the code in @file{foo.c}
1047the @file{Makefile.am} would contain the following lines:
1048
1049@example
1050check_PROGRAMS = test_foo
1051TESTS = $(check_PROGRAMS)
1052test_foo_SOURCES = test_foo.c
1053test_foo_LDADD = $(top_builddir)/src/util/libgnunetutil.la
1054@end example
1055
1056Naturally, other libraries used by the testcase may be specified in the
1057@code{LDADD} directive as necessary.
1058
1059Often testcases depend on additional input files, such as a configuration
1060file. These support files have to be listed using the @code{EXTRA_DIST}
1061directive in order to ensure that they are included in the distribution.
1062
1063Example:
1064
1065@example
1066EXTRA_DIST = test_foo_data.conf
1067@end example
1068
1069Executing @code{make check} will run all testcases in the current
1070directory and all subdirectories. Testcases can be compiled individually
1071by running @code{make test_foo} and then invoked directly using
1072@code{./test_foo}. Note that due to the use of plugins in GNUnet, it is
1073typically necessary to run @code{make install} before running any
1074testcases. Thus the canonical command @code{make check install} has to be
1075changed to @code{make install check} for GNUnet.
1076
1077@cindex TESTING library
1078@node TESTING library
1079@section TESTING library
1080
1081The TESTING library is used for writing testcases which involve starting a
1082single or multiple peers. While peers can also be started by testcases
1083using the ARM subsystem, using TESTING library provides an elegant way to
1084do this. The configurations of the peers are auto-generated from a given
1085template to have non-conflicting port numbers ensuring that peers'
1086services do not run into bind errors. This is achieved by testing ports'
1087availability by binding a listening socket to them before allocating them
1088to services in the generated configurations.
1089
1090An another advantage while using TESTING is that it shortens the testcase
1091startup time as the hostkeys for peers are copied from a pre-computed set
1092of hostkeys instead of generating them at peer startup which may take a
1093considerable amount of time when starting multiple peers or on an embedded
1094processor.
1095
1096TESTING also allows for certain services to be shared among peers. This
1097feature is invaluable when testing with multiple peers as it helps to
1098reduce the number of services run per each peer and hence the total
1099number of processes run per testcase.
1100
1101TESTING library only handles creating, starting and stopping peers.
1102Features useful for testcases such as connecting peers in a topology are
1103not available in TESTING but are available in the TESTBED subsystem.
1104Furthermore, TESTING only creates peers on the localhost, however by
1105using TESTBED testcases can benefit from creating peers across multiple
1106hosts.
1107
1108@menu
1109* API::
1110* Finer control over peer stop::
1111* Helper functions::
1112* Testing with multiple processes::
1113@end menu
1114
1115@cindex TESTING API
1116@node API
1117@subsection API
1118
1119TESTING abstracts a group of peers as a TESTING system. All peers in a
1120system have common hostname and no two services of these peers have a
1121same port or a UNIX domain socket path.
1122
1123TESTING system can be created with the function
1124@code{GNUNET_TESTING_system_create()} which returns a handle to the
1125system. This function takes a directory path which is used for generating
1126the configurations of peers, an IP address from which connections to the
1127peers' services should be allowed, the hostname to be used in peers'
1128configuration, and an array of shared service specifications of type
1129@code{struct GNUNET_TESTING_SharedService}.
1130
1131The shared service specification must specify the name of the service to
1132share, the configuration pertaining to that shared service and the
1133maximum number of peers that are allowed to share a single instance of
1134the shared service.
1135
1136TESTING system created with @code{GNUNET_TESTING_system_create()} chooses
1137ports from the default range @code{12000} - @code{56000} while
1138auto-generating configurations for peers.
1139This range can be customised with the function
1140@code{GNUNET_TESTING_system_create_with_portrange()}. This function is
1141similar to @code{GNUNET_TESTING_system_create()} except that it take 2
1142additional parameters --- the start and end of the port range to use.
1143
1144A TESTING system is destroyed with the funciton
1145@code{GNUNET_TESTING_system_destory()}. This function takes the handle of
1146the system and a flag to remove the files created in the directory used
1147to generate configurations.
1148
1149A peer is created with the function
1150@code{GNUNET_TESTING_peer_configure()}. This functions takes the system
1151handle, a configuration template from which the configuration for the peer
1152is auto-generated and the index from where the hostkey for the peer has to
1153be copied from. When successfull, this function returs a handle to the
1154peer which can be used to start and stop it and to obtain the identity of
1155the peer. If unsuccessful, a NULL pointer is returned with an error
1156message. This function handles the generated configuration to have
1157non-conflicting ports and paths.
1158
1159Peers can be started and stopped by calling the functions
1160@code{GNUNET_TESTING_peer_start()} and @code{GNUNET_TESTING_peer_stop()}
1161respectively. A peer can be destroyed by calling the function
1162@code{GNUNET_TESTING_peer_destroy}. When a peer is destroyed, the ports
1163and paths in allocated in its configuration are reclaimed for usage in new
1164peers.
1165
1166@c ***********************************************************************
1167@node Finer control over peer stop
1168@subsection Finer control over peer stop
1169
1170Using @code{GNUNET_TESTING_peer_stop()} is normally fine for testcases.
1171However, calling this function for each peer is inefficient when trying to
1172shutdown multiple peers as this function sends the termination signal to
1173the given peer process and waits for it to terminate. It would be faster
1174in this case to send the termination signals to the peers first and then
1175wait on them. This is accomplished by the functions
1176@code{GNUNET_TESTING_peer_kill()} which sends a termination signal to the
1177peer, and the function @code{GNUNET_TESTING_peer_wait()} which waits on
1178the peer.
1179
1180Further finer control can be achieved by choosing to stop a peer
1181asynchronously with the function @code{GNUNET_TESTING_peer_stop_async()}.
1182This function takes a callback parameter and a closure for it in addition
1183to the handle to the peer to stop. The callback function is called with
1184the given closure when the peer is stopped. Using this function
1185eliminates blocking while waiting for the peer to terminate.
1186
1187An asynchronous peer stop can be cancelled by calling the function
1188@code{GNUNET_TESTING_peer_stop_async_cancel()}. Note that calling this
1189function does not prevent the peer from terminating if the termination
1190signal has already been sent to it. It does, however, cancels the
1191callback to be called when the peer is stopped.
1192
1193@c ***********************************************************************
1194@node Helper functions
1195@subsection Helper functions
1196
1197Most of the testcases can benefit from an abstraction which configures a
1198peer and starts it. This is provided by the function
1199@code{GNUNET_TESTING_peer_run()}. This function takes the testing
1200directory pathname, a configuration template, a callback and its closure.
1201This function creates a peer in the given testing directory by using the
1202configuration template, starts the peer and calls the given callback with
1203the given closure.
1204
1205The function @code{GNUNET_TESTING_peer_run()} starts the ARM service of
1206the peer which starts the rest of the configured services. A similar
1207function @code{GNUNET_TESTING_service_run} can be used to just start a
1208single service of a peer. In this case, the peer's ARM service is not
1209started; instead, only the given service is run.
1210
1211@c ***********************************************************************
1212@node Testing with multiple processes
1213@subsection Testing with multiple processes
1214
1215When testing GNUnet, the splitting of the code into a services and clients
1216often complicates testing. The solution to this is to have the testcase
1217fork @code{gnunet-service-arm}, ask it to start the required server and
1218daemon processes and then execute appropriate client actions (to test the
1219client APIs or the core module or both). If necessary, multiple ARM
1220services can be forked using different ports (!) to simulate a network.
1221However, most of the time only one ARM process is needed. Note that on
1222exit, the testcase should shutdown ARM with a @code{TERM} signal (to give
1223it the chance to cleanly stop its child processes).
1224
1225The following code illustrates spawning and killing an ARM process from a
1226testcase:
1227
1228@example
1229static void run (void *cls,
1230 char *const *args,
1231 const char *cfgfile,
1232 const struct GNUNET_CONFIGURATION_Handle *cfg) @{
1233 struct GNUNET_OS_Process *arm_pid;
1234 arm_pid = GNUNET_OS_start_process (NULL,
1235 NULL,
1236 "gnunet-service-arm",
1237 "gnunet-service-arm",
1238 "-c",
1239 cfgname,
1240 NULL);
1241 /* do real test work here */
1242 if (0 != GNUNET_OS_process_kill (arm_pid, SIGTERM))
1243 GNUNET_log_strerror
1244 (GNUNET_ERROR_TYPE_WARNING, "kill");
1245 GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (arm_pid));
1246 GNUNET_OS_process_close (arm_pid); @}
1247
1248GNUNET_PROGRAM_run (argc, argv,
1249 "NAME-OF-TEST",
1250 "nohelp",
1251 options,
1252 &run,
1253 cls);
1254@end example
1255
1256
1257An alternative way that works well to test plugins is to implement a
1258mock-version of the environment that the plugin expects and then to
1259simply load the plugin directly.
1260
1261@c ***********************************************************************
1262@node Performance regression analysis with Gauger
1263@section Performance regression analysis with Gauger
1264
1265To help avoid performance regressions, GNUnet uses Gauger. Gauger is a
1266simple logging tool that allows remote hosts to send performance data to
1267a central server, where this data can be analyzed and visualized. Gauger
1268shows graphs of the repository revisions and the performace data recorded
1269for each revision, so sudden performance peaks or drops can be identified
1270and linked to a specific revision number.
1271
1272In the case of GNUnet, the buildbots log the performance data obtained
1273during the tests after each build. The data can be accesed on GNUnet's
1274Gauger page.
1275
1276The menu on the left allows to select either the results of just one
1277build bot (under "Hosts") or review the data from all hosts for a given
1278test result (under "Metrics"). In case of very different absolute value
1279of the results, for instance arm vs. amd64 machines, the option
1280"Normalize" on a metric view can help to get an idea about the
1281performance evolution across all hosts.
1282
1283Using Gauger in GNUnet and having the performance of a module tracked over
1284time is very easy. First of course, the testcase must generate some
1285consistent metric, which makes sense to have logged. Highly volatile or
1286random dependant metrics probably are not ideal candidates for meaningful
1287regression detection.
1288
1289To start logging any value, just include @code{gauger.h} in your testcase
1290code. Then, use the macro @code{GAUGER()} to make the Buildbots log
1291whatever value is of interest for you to @code{gnunet.org}'s Gauger
1292server. No setup is necessary as most Buildbots have already everything
1293in place and new metrics are created on demand. To delete a metric, you
1294need to contact a member of the GNUnet development team (a file will need
1295to be removed manually from the respective directory).
1296
1297The code in the test should look like this:
1298
1299@example
1300[other includes]
1301#include <gauger.h>
1302
1303int main (int argc, char *argv[]) @{
1304
1305 [run test, generate data]
1306 GAUGER("YOUR_MODULE",
1307 "METRIC_NAME",
1308 (float)value,
1309 "UNIT"); @}
1310@end example
1311
1312Where:
1313
1314@table @asis
1315
1316@item @strong{YOUR_MODULE} is a category in the gauger page and should be
1317the name of the module or subsystem like "Core" or "DHT"
1318@item @strong{METRIC} is
1319the name of the metric being collected and should be concise and
1320descriptive, like "PUT operations in sqlite-datastore".
1321@item @strong{value} is the value
1322of the metric that is logged for this run.
1323@item @strong{UNIT} is the unit in
1324which the value is measured, for instance "kb/s" or "kb of RAM/node".
1325@end table
1326
1327If you wish to use Gauger for your own project, you can grab a copy of the
1328latest stable release or check out Gauger's Subversion repository.
1329
1330@cindex TESTBED Subsystem
1331@node TESTBED Subsystem
1332@section TESTBED Subsystem
1333
1334The TESTBED subsystem facilitates testing and measuring of multi-peer
1335deployments on a single host or over multiple hosts.
1336
1337The architecture of the testbed module is divided into the following:
1338@itemize @bullet
1339
1340@item Testbed API: An API which is used by the testing driver programs. It
1341provides with functions for creating, destroying, starting, stopping
1342peers, etc.
1343
1344@item Testbed service (controller): A service which is started through the
1345Testbed API. This service handles operations to create, destroy, start,
1346stop peers, connect them, modify their configurations.
1347
1348@item Testbed helper: When a controller has to be started on a host, the
1349testbed API starts the testbed helper on that host which in turn starts
1350the controller. The testbed helper receives a configuration for the
1351controller through its stdin and changes it to ensure the controller
1352doesn't run into any port conflict on that host.
1353@end itemize
1354
1355
1356The testbed service (controller) is different from the other GNUnet
1357services in that it is not started by ARM and is not supposed to be run
1358as a daemon. It is started by the testbed API through a testbed helper.
1359In a typical scenario involving multiple hosts, a controller is started
1360on each host. Controllers take up the actual task of creating peers,
1361starting and stopping them on the hosts they run.
1362
1363While running deployments on a single localhost the testbed API starts the
1364testbed helper directly as a child process. When running deployments on
1365remote hosts the testbed API starts Testbed Helpers on each remote host
1366through remote shell. By default testbed API uses SSH as a remote shell.
1367This can be changed by setting the environmental variable
1368GNUNET_TESTBED_RSH_CMD to the required remote shell program. This
1369variable can also contain parameters which are to be passed to the remote
1370shell program. For e.g:
1371
1372@example
1373export GNUNET_TESTBED_RSH_CMD="ssh -o BatchMode=yes \
1374-o NoHostAuthenticationForLocalhost=yes %h"
1375@end example
1376
1377Substitutions are allowed in the command string above,
1378this allows for substitutions through placemarks which begin with a `%'.
1379At present the following substitutions are supported
1380
1381@itemize @bullet
1382@item %h: hostname
1383@item %u: username
1384@item %p: port
1385@end itemize
1386
1387Note that the substitution placemark is replaced only when the
1388corresponding field is available and only once. Specifying
1389
1390@example
1391%u@atchar{}%h
1392@end example
1393
1394doesn't work either. If you want to user username substitutions for
1395@command{SSH}, use the argument @code{-l} before the
1396username substitution.
1397
1398For example:
1399@example
1400ssh -l %u -p %p %h
1401@end example
1402
1403The testbed API and the helper communicate through the helpers stdin and
1404stdout. As the helper is started through a remote shell on remote hosts
1405any output messages from the remote shell interfere with the communication
1406and results in a failure while starting the helper. For this reason, it is
1407suggested to use flags to make the remote shells produce no output
1408messages and to have password-less logins. The default remote shell, SSH,
1409the default options are:
1410
1411@example
1412-o BatchMode=yes -o NoHostBasedAuthenticationForLocalhost=yes"
1413@end example
1414
1415Password-less logins should be ensured by using SSH keys.
1416
1417Since the testbed API executes the remote shell as a non-interactive
1418shell, certain scripts like .bashrc, .profiler may not be executed. If
1419this is the case testbed API can be forced to execute an interactive
1420shell by setting up the environmental variable
1421@code{GNUNET_TESTBED_RSH_CMD_SUFFIX} to a shell program.
1422
1423An example could be:
1424
1425@example
1426export GNUNET_TESTBED_RSH_CMD_SUFFIX="sh -lc"
1427@end example
1428
1429The testbed API will then execute the remote shell program as:
1430
1431@example
1432$GNUNET_TESTBED_RSH_CMD -p $port $dest $GNUNET_TESTBED_RSH_CMD_SUFFIX \
1433gnunet-helper-testbed
1434@end example
1435
1436On some systems, problems may arise while starting testbed helpers if
1437GNUnet is installed into a custom location since the helper may not be
1438found in the standard path. This can be addressed by setting the variable
1439`@code{HELPER_BINARY_PATH}' to the path of the testbed helper.
1440Testbed API will then use this path to start helper binaries both
1441locally and remotely.
1442
1443Testbed API can accessed by including the
1444@file{gnunet_testbed_service.h} file and linking with
1445@code{-lgnunettestbed}.
1446
1447@c ***********************************************************************
1448@menu
1449* Supported Topologies::
1450* Hosts file format::
1451* Topology file format::
1452* Testbed Barriers::
1453* Automatic large-scale deployment in the PlanetLab testbed::
1454* TESTBED Caveats::
1455@end menu
1456
1457@node Supported Topologies
1458@subsection Supported Topologies
1459
1460While testing multi-peer deployments, it is often needed that the peers
1461are connected in some topology. This requirement is addressed by the
1462function @code{GNUNET_TESTBED_overlay_connect()} which connects any given
1463two peers in the testbed.
1464
1465The API also provides a helper function
1466@code{GNUNET_TESTBED_overlay_configure_topology()} to connect a given set
1467of peers in any of the following supported topologies:
1468
1469@itemize @bullet
1470
1471@item @code{GNUNET_TESTBED_TOPOLOGY_CLIQUE}: All peers are connected with
1472each other
1473
1474@item @code{GNUNET_TESTBED_TOPOLOGY_LINE}: Peers are connected to form a
1475line
1476
1477@item @code{GNUNET_TESTBED_TOPOLOGY_RING}: Peers are connected to form a
1478ring topology
1479
1480@item @code{GNUNET_TESTBED_TOPOLOGY_2D_TORUS}: Peers are connected to
1481form a 2 dimensional torus topology. The number of peers may not be a
1482perfect square, in that case the resulting torus may not have the uniform
1483poloidal and toroidal lengths
1484
1485@item @code{GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI}: Topology is generated
1486to form a random graph. The number of links to be present should be given
1487
1488@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD}: Peers are connected to
1489form a 2D Torus with some random links among them. The number of random
1490links are to be given
1491
1492@item @code{GNUNET_TESTBED_TOPOLOGY_SMALL_WORLD_RING}: Peers are
1493connected to form a ring with some random links among them. The number of
1494random links are to be given
1495
1496@item @code{GNUNET_TESTBED_TOPOLOGY_SCALE_FREE}: Connects peers in a
1497topology where peer connectivity follows power law - new peers are
1498connected with high probabililty to well connected peers.
1499@footnote{See Emergence of Scaling in Random Networks. Science 286,
1500509-512, 1999
1501(@uref{https://gnunet.org/git/bibliography.git/plain/docs/emergence_of_scaling_in_random_networks__barabasi_albert_science_286__1999.pdf, pdf})}
1502
1503@item @code{GNUNET_TESTBED_TOPOLOGY_FROM_FILE}: The topology information
1504is loaded from a file. The path to the file has to be given.
1505@xref{Topology file format}, for the format of this file.
1506
1507@item @code{GNUNET_TESTBED_TOPOLOGY_NONE}: No topology
1508@end itemize
1509
1510
1511The above supported topologies can be specified respectively by setting
1512the variable @code{OVERLAY_TOPOLOGY} to the following values in the
1513configuration passed to Testbed API functions
1514@code{GNUNET_TESTBED_test_run()} and
1515@code{GNUNET_TESTBED_run()}:
1516
1517@itemize @bullet
1518@item @code{CLIQUE}
1519@item @code{RING}
1520@item @code{LINE}
1521@item @code{2D_TORUS}
1522@item @code{RANDOM}
1523@item @code{SMALL_WORLD}
1524@item @code{SMALL_WORLD_RING}
1525@item @code{SCALE_FREE}
1526@item @code{FROM_FILE}
1527@item @code{NONE}
1528@end itemize
1529
1530
1531Topologies @code{RANDOM}, @code{SMALL_WORLD} and @code{SMALL_WORLD_RING}
1532require the option @code{OVERLAY_RANDOM_LINKS} to be set to the number of
1533random links to be generated in the configuration. The option will be
1534ignored for the rest of the topologies.
1535
1536Topology @code{SCALE_FREE} requires the options
1537@code{SCALE_FREE_TOPOLOGY_CAP} to be set to the maximum number of peers
1538which can connect to a peer and @code{SCALE_FREE_TOPOLOGY_M} to be set to
1539how many peers a peer should be atleast connected to.
1540
1541Similarly, the topology @code{FROM_FILE} requires the option
1542@code{OVERLAY_TOPOLOGY_FILE} to contain the path of the file containing
1543the topology information. This option is ignored for the rest of the
1544topologies. @xref{Topology file format}, for the format of this file.
1545
1546@c ***********************************************************************
1547@node Hosts file format
1548@subsection Hosts file format
1549
1550The testbed API offers the function
1551@code{GNUNET_TESTBED_hosts_load_from_file()} to load from a given file
1552details about the hosts which testbed can use for deploying peers.
1553This function is useful to keep the data about hosts
1554separate instead of hard coding them in code.
1555
1556Another helper function from testbed API, @code{GNUNET_TESTBED_run()}
1557also takes a hosts file name as its parameter. It uses the above
1558function to populate the hosts data structures and start controllers to
1559deploy peers.
1560
1561These functions require the hosts file to be of the following format:
1562@itemize @bullet
1563@item Each line is interpreted to have details about a host
1564@item Host details should include the username to use for logging into the
1565host, the hostname of the host and the port number to use for the remote
1566shell program. All thee values should be given.
1567@item These details should be given in the following format:
1568@example
1569<username>@@<hostname>:<port>
1570@end example
1571@end itemize
1572
1573Note that having canonical hostnames may cause problems while resolving
1574the IP addresses (See this bug). Hence it is advised to provide the hosts'
1575IP numerical addresses as hostnames whenever possible.
1576
1577@c ***********************************************************************
1578@node Topology file format
1579@subsection Topology file format
1580
1581A topology file describes how peers are to be connected. It should adhere
1582to the following format for testbed to parse it correctly.
1583
1584Each line should begin with the target peer id. This should be followed by
1585a colon(`:') and origin peer ids seperated by `|'. All spaces except for
1586newline characters are ignored. The API will then try to connect each
1587origin peer to the target peer.
1588
1589For example, the following file will result in 5 overlay connections:
1590[2->1], [3->1],[4->3], [0->3], [2->0]@
1591@code{@ 1:2|3@ 3:4| 0@ 0: 2@ }
1592
1593@c ***********************************************************************
1594@node Testbed Barriers
1595@subsection Testbed Barriers
1596
1597The testbed subsystem's barriers API facilitates coordination among the
1598peers run by the testbed and the experiment driver. The concept is
1599similar to the barrier synchronisation mechanism found in parallel
1600programming or multi-threading paradigms - a peer waits at a barrier upon
1601reaching it until the barrier is reached by a predefined number of peers.
1602This predefined number of peers required to cross a barrier is also called
1603quorum. We say a peer has reached a barrier if the peer is waiting for the
1604barrier to be crossed. Similarly a barrier is said to be reached if the
1605required quorum of peers reach the barrier. A barrier which is reached is
1606deemed as crossed after all the peers waiting on it are notified.
1607
1608The barriers API provides the following functions:
1609@itemize @bullet
1610@item @strong{@code{GNUNET_TESTBED_barrier_init()}:} function to
1611initialse a barrier in the experiment
1612@item @strong{@code{GNUNET_TESTBED_barrier_cancel()}:} function to cancel
1613a barrier which has been initialised before
1614@item @strong{@code{GNUNET_TESTBED_barrier_wait()}:} function to signal
1615barrier service that the caller has reached a barrier and is waiting for
1616it to be crossed
1617@item @strong{@code{GNUNET_TESTBED_barrier_wait_cancel()}:} function to
1618stop waiting for a barrier to be crossed
1619@end itemize
1620
1621
1622Among the above functions, the first two, namely
1623@code{GNUNET_TESTBED_barrier_init()} and
1624@code{GNUNET_TESTBED_barrier_cancel()} are used by experiment drivers. All
1625barriers should be initialised by the experiment driver by calling
1626@code{GNUNET_TESTBED_barrier_init()}. This function takes a name to
1627identify the barrier, the quorum required for the barrier to be crossed
1628and a notification callback for notifying the experiment driver when the
1629barrier is crossed. @code{GNUNET_TESTBED_barrier_cancel()} cancels an
1630initialised barrier and frees the resources allocated for it. This
1631function can be called upon a initialised barrier before it is crossed.
1632
1633The remaining two functions @code{GNUNET_TESTBED_barrier_wait()} and
1634@code{GNUNET_TESTBED_barrier_wait_cancel()} are used in the peer's
1635processes. @code{GNUNET_TESTBED_barrier_wait()} connects to the local
1636barrier service running on the same host the peer is running on and
1637registers that the caller has reached the barrier and is waiting for the
1638barrier to be crossed. Note that this function can only be used by peers
1639which are started by testbed as this function tries to access the local
1640barrier service which is part of the testbed controller service. Calling
1641@code{GNUNET_TESTBED_barrier_wait()} on an uninitialised barrier results
1642in failure. @code{GNUNET_TESTBED_barrier_wait_cancel()} cancels the
1643notification registered by @code{GNUNET_TESTBED_barrier_wait()}.
1644
1645
1646@c ***********************************************************************
1647@menu
1648* Implementation::
1649@end menu
1650
1651@node Implementation
1652@subsubsection Implementation
1653
1654Since barriers involve coordination between experiment driver and peers,
1655the barrier service in the testbed controller is split into two
1656components. The first component responds to the message generated by the
1657barrier API used by the experiment driver (functions
1658@code{GNUNET_TESTBED_barrier_init()} and
1659@code{GNUNET_TESTBED_barrier_cancel()}) and the second component to the
1660messages generated by barrier API used by peers (functions
1661@code{GNUNET_TESTBED_barrier_wait()} and
1662@code{GNUNET_TESTBED_barrier_wait_cancel()}).
1663
1664Calling @code{GNUNET_TESTBED_barrier_init()} sends a
1665@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_INIT} message to the master
1666controller. The master controller then registers a barrier and calls
1667@code{GNUNET_TESTBED_barrier_init()} for each its subcontrollers. In this
1668way barrier initialisation is propagated to the controller hierarchy.
1669While propagating initialisation, any errors at a subcontroller such as
1670timeout during further propagation are reported up the hierarchy back to
1671the experiment driver.
1672
1673Similar to @code{GNUNET_TESTBED_barrier_init()},
1674@code{GNUNET_TESTBED_barrier_cancel()} propagates
1675@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_CANCEL} message which causes
1676controllers to remove an initialised barrier.
1677
1678The second component is implemented as a separate service in the binary
1679`gnunet-service-testbed' which already has the testbed controller service.
1680Although this deviates from the gnunet process architecture of having one
1681service per binary, it is needed in this case as this component needs
1682access to barrier data created by the first component. This component
1683responds to @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages from
1684local peers when they call @code{GNUNET_TESTBED_barrier_wait()}. Upon
1685receiving @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} message, the
1686service checks if the requested barrier has been initialised before and
1687if it was not initialised, an error status is sent through
1688@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to the local
1689peer and the connection from the peer is terminated. If the barrier is
1690initialised before, the barrier's counter for reached peers is incremented
1691and a notification is registered to notify the peer when the barrier is
1692reached. The connection from the peer is left open.
1693
1694When enough peers required to attain the quorum send
1695@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_WAIT} messages, the controller
1696sends a @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message to its
1697parent informing that the barrier is crossed. If the controller has
1698started further subcontrollers, it delays this message until it receives
1699a similar notification from each of those subcontrollers. Finally, the
1700barriers API at the experiment driver receives the
1701@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} when the barrier is
1702reached at all the controllers.
1703
1704The barriers API at the experiment driver responds to the
1705@code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message by echoing it
1706back to the master controller and notifying the experiment controller
1707through the notification callback that a barrier has been crossed. The
1708echoed @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS} message is
1709propagated by the master controller to the controller hierarchy. This
1710propagation triggers the notifications registered by peers at each of the
1711controllers in the hierarchy. Note the difference between this downward
1712propagation of the @code{GNUNET_MESSAGE_TYPE_TESTBED_BARRIER_STATUS}
1713message from its upward propagation --- the upward propagation is needed
1714for ensuring that the barrier is reached by all the controllers and the
1715downward propagation is for triggering that the barrier is crossed.
1716
1717@cindex PlanetLab testbed
1718@node Automatic large-scale deployment in the PlanetLab testbed
1719@subsection Automatic large-scale deployment in the PlanetLab testbed
1720
1721PlanetLab is a testbed for computer networking and distributed systems
1722research. It was established in 2002 and as of June 2010 was composed of
17231090 nodes at 507 sites worldwide.
1724
1725To automate the GNUnet we created a set of automation tools to simplify
1726the large-scale deployment. We provide you a set of scripts you can use
1727to deploy GNUnet on a set of nodes and manage your installation.
1728
1729Please also check @uref{https://gnunet.org/installation-fedora8-svn} and
1730@uref{https://gnunet.org/installation-fedora12-svn} to find detailled
1731instructions how to install GNUnet on a PlanetLab node.
1732
1733
1734@c ***********************************************************************
1735@menu
1736* PlanetLab Automation for Fedora8 nodes::
1737* Install buildslave on PlanetLab nodes running fedora core 8::
1738* Setup a new PlanetLab testbed using GPLMT::
1739* Why do i get an ssh error when using the regex profiler?::
1740@end menu
1741
1742@node PlanetLab Automation for Fedora8 nodes
1743@subsubsection PlanetLab Automation for Fedora8 nodes
1744
1745@c ***********************************************************************
1746@node Install buildslave on PlanetLab nodes running fedora core 8
1747@subsubsection Install buildslave on PlanetLab nodes running fedora core 8
1748@c ** Actually this is a subsubsubsection, but must be fixed differently
1749@c ** as subsubsection is the lowest.
1750
1751Since most of the PlanetLab nodes are running the very old Fedora core 8
1752image, installing the buildslave software is quite some pain. For our
1753PlanetLab testbed we figured out how to install the buildslave software
1754best.
1755
1756@c This is a vvery terrible way to suggest installing software.
1757@c FIXME: Is there an official, safer way instead of blind-piping a
1758@c script?
1759@c FIXME: Use newer pypi URLs below.
1760Install Distribute for Python:
1761
1762@example
1763curl http://python-distribute.org/distribute_setup.py | sudo python
1764@end example
1765
1766Install Distribute for zope.interface <= 3.8.0 (4.0 and 4.0.1 will not
1767work):
1768
1769@example
1770export PYPI=@value{PYPI-URL}
1771wget $PYPI/z/zope.interface/zope.interface-3.8.0.tar.gz
1772tar zvfz zope.interface-3.8.0.tar.gz
1773cd zope.interface-3.8.0
1774sudo python setup.py install
1775@end example
1776
1777Install the buildslave software (0.8.6 was the latest version):
1778
1779@example
1780export GCODE="http://buildbot.googlecode.com/files"
1781wget $GCODE/buildbot-slave-0.8.6p1.tar.gz
1782tar xvfz buildbot-slave-0.8.6p1.tar.gz
1783cd buildslave-0.8.6p1
1784sudo python setup.py install
1785@end example
1786
1787The setup will download the matching twisted package and install it.
1788It will also try to install the latest version of zope.interface which
1789will fail to install. Buildslave will work anyway since version 3.8.0
1790was installed before!
1791
1792@c ***********************************************************************
1793@node Setup a new PlanetLab testbed using GPLMT
1794@subsubsection Setup a new PlanetLab testbed using GPLMT
1795
1796@itemize @bullet
1797@item Get a new slice and assign nodes
1798Ask your PlanetLab PI to give you a new slice and assign the nodes you
1799need
1800@item Install a buildmaster
1801You can stick to the buildbot documentation:@
1802@uref{http://buildbot.net/buildbot/docs/current/manual/installation.html}
1803@item Install the buildslave software on all nodes
1804To install the buildslave on all nodes assigned to your slice you can use
1805the tasklist @code{install_buildslave_fc8.xml} provided with GPLMT:
1806
1807@example
1808./gplmt.py -c contrib/tumple_gnunet.conf -t \
1809contrib/tasklists/install_buildslave_fc8.xml -a -p <planetlab password>
1810@end example
1811
1812@item Create the buildmaster configuration and the slave setup commands
1813
1814The master and the and the slaves have need to have credentials and the
1815master has to have all nodes configured. This can be done with the
1816@file{create_buildbot_configuration.py} script in the @file{scripts}
1817directory.
1818
1819This scripts takes a list of nodes retrieved directly from PlanetLab or
1820read from a file and a configuration template and creates:
1821
1822@itemize @bullet
1823@item a tasklist which can be executed with gplmt to setup the slaves
1824@item a master.cfg file containing a PlanetLab nodes
1825@end itemize
1826
1827A configuration template is included in the <contrib>, most important is
1828that the script replaces the following tags in the template:
1829
1830%GPLMT_BUILDER_DEFINITION :@ GPLMT_BUILDER_SUMMARY@ GPLMT_SLAVES@
1831%GPLMT_SCHEDULER_BUILDERS
1832
1833Create configuration for all nodes assigned to a slice:
1834
1835@example
1836./create_buildbot_configuration.py -u <planetlab username> \
1837-p <planetlab password> -s <slice> -m <buildmaster+port> \
1838-t <template>
1839@end example
1840
1841Create configuration for some nodes in a file:
1842
1843@example
1844./create_buildbot_configuration.p -f <node_file> \
1845-m <buildmaster+port> -t <template>
1846@end example
1847
1848@item Copy the @file{master.cfg} to the buildmaster and start it
1849Use @code{buildbot start <basedir>} to start the server
1850@item Setup the buildslaves
1851@end itemize
1852
1853@c ***********************************************************************
1854@node Why do i get an ssh error when using the regex profiler?
1855@subsubsection Why do i get an ssh error when using the regex profiler?
1856
1857Why do i get an ssh error "Permission denied (publickey,password)." when
1858using the regex profiler although passwordless ssh to localhost works
1859using publickey and ssh-agent?
1860
1861You have to generate a public/private-key pair with no password:@
1862@code{ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_localhost}@
1863and then add the following to your ~/.ssh/config file:
1864
1865@code{Host 127.0.0.1@ IdentityFile ~/.ssh/id_localhost}
1866
1867now make sure your hostsfile looks like
1868
1869@example
1870[USERNAME]@@127.0.0.1:22@
1871[USERNAME]@@127.0.0.1:22
1872@end example
1873
1874You can test your setup by running @code{ssh 127.0.0.1} in a
1875terminal and then in the opened session run it again.
1876If you were not asked for a password on either login,
1877then you should be good to go.
1878
1879@cindex TESTBED Caveats
1880@node TESTBED Caveats
1881@subsection TESTBED Caveats
1882
1883This section documents a few caveats when using the GNUnet testbed
1884subsystem.
1885
1886@c ***********************************************************************
1887@menu
1888* CORE must be started::
1889* ATS must want the connections::
1890@end menu
1891
1892@node CORE must be started
1893@subsubsection CORE must be started
1894
1895A simple issue is #3993: Your configuration MUST somehow ensure that for
1896each peer the CORE service is started when the peer is setup, otherwise
1897TESTBED may fail to connect peers when the topology is initialized, as
1898TESTBED will start some CORE services but not necessarily all (but it
1899relies on all of them running). The easiest way is to set
1900'FORCESTART = YES' in the '[core]' section of the configuration file.
1901Alternatively, having any service that directly or indirectly depends on
1902CORE being started with FORCESTART will also do. This issue largely arises
1903if users try to over-optimize by not starting any services with
1904FORCESTART.
1905
1906@c ***********************************************************************
1907@node ATS must want the connections
1908@subsubsection ATS must want the connections
1909
1910When TESTBED sets up connections, it only offers the respective HELLO
1911information to the TRANSPORT service. It is then up to the ATS service to
1912@strong{decide} to use the connection. The ATS service will typically
1913eagerly establish any connection if the number of total connections is
1914low (relative to bandwidth). Details may further depend on the
1915specific ATS backend that was configured. If ATS decides to NOT establish
1916a connection (even though TESTBED provided the required information), then
1917that connection will count as failed for TESTBED. Note that you can
1918configure TESTBED to tolerate a certain number of connection failures
1919(see '-e' option of gnunet-testbed-profiler). This issue largely arises
1920for dense overlay topologies, especially if you try to create cliques
1921with more than 20 peers.
1922
1923@cindex libgnunetutil
1924@node libgnunetutil
1925@section libgnunetutil
1926
1927libgnunetutil is the fundamental library that all GNUnet code builds upon.
1928Ideally, this library should contain most of the platform dependent code
1929(except for user interfaces and really special needs that only few
1930applications have). It is also supposed to offer basic services that most
1931if not all GNUnet binaries require. The code of libgnunetutil is in the
1932@file{src/util/} directory. The public interface to the library is in the
1933gnunet_util.h header. The functions provided by libgnunetutil fall
1934roughly into the following categories (in roughly the order of importance
1935for new developers):
1936
1937@itemize @bullet
1938@item logging (common_logging.c)
1939@item memory allocation (common_allocation.c)
1940@item endianess conversion (common_endian.c)
1941@item internationalization (common_gettext.c)
1942@item String manipulation (string.c)
1943@item file access (disk.c)
1944@item buffered disk IO (bio.c)
1945@item time manipulation (time.c)
1946@item configuration parsing (configuration.c)
1947@item command-line handling (getopt*.c)
1948@item cryptography (crypto_*.c)
1949@item data structures (container_*.c)
1950@item CPS-style scheduling (scheduler.c)
1951@item Program initialization (program.c)
1952@item Networking (network.c, client.c, server*.c, service.c)
1953@item message queueing (mq.c)
1954@item bandwidth calculations (bandwidth.c)
1955@item Other OS-related (os*.c, plugin.c, signal.c)
1956@item Pseudonym management (pseudonym.c)
1957@end itemize
1958
1959It should be noted that only developers that fully understand this entire
1960API will be able to write good GNUnet code.
1961
1962Ideally, porting GNUnet should only require porting the gnunetutil
1963library. More testcases for the gnunetutil APIs are therefore a great
1964way to make porting of GNUnet easier.
1965
1966@menu
1967* Logging::
1968* Interprocess communication API (IPC)::
1969* Cryptography API::
1970* Message Queue API::
1971* Service API::
1972* Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps::
1973* CONTAINER_MDLL API::
1974@end menu
1975
1976@cindex Logging
1977@cindex log levels
1978@node Logging
1979@subsection Logging
1980
1981GNUnet is able to log its activity, mostly for the purposes of debugging
1982the program at various levels.
1983
1984@file{gnunet_common.h} defines several @strong{log levels}:
1985@table @asis
1986
1987@item ERROR for errors (really problematic situations, often leading to
1988crashes)
1989@item WARNING for warnings (troubling situations that might have
1990negative consequences, although not fatal)
1991@item INFO for various information.
1992Used somewhat rarely, as GNUnet statistics is used to hold and display
1993most of the information that users might find interesting.
1994@item DEBUG for debugging.
1995Does not produce much output on normal builds, but when extra logging is
1996enabled at compile time, a staggering amount of data is outputted under
1997this log level.
1998@end table
1999
2000
2001Normal builds of GNUnet (configured with @code{--enable-logging[=yes]})
2002are supposed to log nothing under DEBUG level. The
2003@code{--enable-logging=verbose} configure option can be used to create a
2004build with all logging enabled. However, such build will produce large
2005amounts of log data, which is inconvenient when one tries to hunt down a
2006specific problem.
2007
2008To mitigate this problem, GNUnet provides facilities to apply a filter to
2009reduce the logs:
2010@table @asis
2011
2012@item Logging by default When no log levels are configured in any other
2013way (see below), GNUnet will default to the WARNING log level. This
2014mostly applies to GNUnet command line utilities, services and daemons;
2015tests will always set log level to WARNING or, if
2016@code{--enable-logging=verbose} was passed to configure, to DEBUG. The
2017default level is suggested for normal operation.
2018@item The -L option Most GNUnet executables accept an "-L loglevel" or
2019"--log=loglevel" option. If used, it makes the process set a global log
2020level to "loglevel". Thus it is possible to run some processes
2021with -L DEBUG, for example, and others with -L ERROR to enable specific
2022settings to diagnose problems with a particular process.
2023@item Configuration files. Because GNUnet
2024service and deamon processes are usually launched by gnunet-arm, it is not
2025possible to pass different custom command line options directly to every
2026one of them. The options passed to @code{gnunet-arm} only affect
2027gnunet-arm and not the rest of GNUnet. However, one can specify a
2028configuration key "OPTIONS" in the section that corresponds to a service
2029or a daemon, and put a value of "-L loglevel" there. This will make the
2030respective service or daemon set its log level to "loglevel" (as the
2031value of OPTIONS will be passed as a command-line argument).
2032
2033To specify the same log level for all services without creating separate
2034"OPTIONS" entries in the configuration for each one, the user can specify
2035a config key "GLOBAL_POSTFIX" in the [arm] section of the configuration
2036file. The value of GLOBAL_POSTFIX will be appended to all command lines
2037used by the ARM service to run other services. It can contain any option
2038valid for all GNUnet commands, thus in particular the "-L loglevel"
2039option. The ARM service itself is, however, unaffected by GLOBAL_POSTFIX;
2040to set log level for it, one has to specify "OPTIONS" key in the [arm]
2041section.
2042@item Environment variables.
2043Setting global per-process log levels with "-L loglevel" does not offer
2044sufficient log filtering granularity, as one service will call interface
2045libraries and supporting libraries of other GNUnet services, potentially
2046producing lots of debug log messages from these libraries. Also, changing
2047the config file is not always convenient (especially when running the
2048GNUnet test suite).@ To fix that, and to allow GNUnet to use different
2049log filtering at runtime without re-compiling the whole source tree, the
2050log calls were changed to be configurable at run time. To configure them
2051one has to define environment variables "GNUNET_FORCE_LOGFILE",
2052"GNUNET_LOG" and/or "GNUNET_FORCE_LOG":
2053@itemize @bullet
2054
2055@item "GNUNET_LOG" only affects the logging when no global log level is
2056configured by any other means (that is, the process does not explicitly
2057set its own log level, there are no "-L loglevel" options on command line
2058or in configuration files), and can be used to override the default
2059WARNING log level.
2060
2061@item "GNUNET_FORCE_LOG" will completely override any other log
2062configuration options given.
2063
2064@item "GNUNET_FORCE_LOGFILE" will completely override the location of the
2065file to log messages to. It should contain a relative or absolute file
2066name. Setting GNUNET_FORCE_LOGFILE is equivalent to passing
2067"--log-file=logfile" or "-l logfile" option (see below). It supports "[]"
2068format in file names, but not "@{@}" (see below).
2069@end itemize
2070
2071
2072Because environment variables are inherited by child processes when they
2073are launched, starting or re-starting the ARM service with these
2074variables will propagate them to all other services.
2075
2076"GNUNET_LOG" and "GNUNET_FORCE_LOG" variables must contain a specially
2077formatted @strong{logging definition} string, which looks like this:@
2078
2079@c FIXME: Can we close this with [/component] instead?
2080@example
2081[component];[file];[function];[from_line[-to_line]];loglevel[/component...]
2082@end example
2083
2084That is, a logging definition consists of definition entries, separated by
2085slashes ('/'). If only one entry is present, there is no need to add a
2086slash to its end (although it is not forbidden either).@ All definition
2087fields (component, file, function, lines and loglevel) are mandatory, but
2088(except for the loglevel) they can be empty. An empty field means
2089"match anything". Note that even if fields are empty, the semicolon (';')
2090separators must be present.@ The loglevel field is mandatory, and must
2091contain one of the log level names (ERROR, WARNING, INFO or DEBUG).@
2092The lines field might contain one non-negative number, in which case it
2093matches only one line, or a range "from_line-to_line", in which case it
2094matches any line in the interval [from_line;to_line] (that is, including
2095both start and end line).@ GNUnet mostly defaults component name to the
2096name of the service that is implemented in a process ('transport',
2097'core', 'peerinfo', etc), but logging calls can specify custom component
2098names using @code{GNUNET_log_from}.@ File name and function name are
2099provided by the compiler (__FILE__ and __FUNCTION__ built-ins).
2100
2101Component, file and function fields are interpreted as non-extended
2102regular expressions (GNU libc regex functions are used). Matching is
2103case-sensitive, "^" and "$" will match the beginning and the end of the
2104text. If a field is empty, its contents are automatically replaced with
2105a ".*" regular expression, which matches anything. Matching is done in
2106the default way, which means that the expression matches as long as it's
2107contained anywhere in the string. Thus "GNUNET_" will match both
2108"GNUNET_foo" and "BAR_GNUNET_BAZ". Use '^' and/or '$' to make sure that
2109the expression matches at the start and/or at the end of the string.
2110The semicolon (';') can't be escaped, and GNUnet will not use it in
2111component names (it can't be used in function names and file names
2112anyway).
2113
2114@end table
2115
2116
2117Every logging call in GNUnet code will be (at run time) matched against
2118the log definitions passed to the process. If a log definition fields are
2119matching the call arguments, then the call log level is compared the the
2120log level of that definition. If the call log level is less or equal to
2121the definition log level, the call is allowed to proceed. Otherwise the
2122logging call is forbidden, and nothing is logged. If no definitions
2123matched at all, GNUnet will use the global log level or (if a global log
2124level is not specified) will default to WARNING (that is, it will allow
2125the call to proceed, if its level is less or equal to the global log
2126level or to WARNING).
2127
2128That is, definitions are evaluated from left to right, and the first
2129matching definition is used to allow or deny the logging call. Thus it is
2130advised to place narrow definitions at the beginning of the logdef
2131string, and generic definitions - at the end.
2132
2133Whether a call is allowed or not is only decided the first time this
2134particular call is made. The evaluation result is then cached, so that
2135any attempts to make the same call later will be allowed or disallowed
2136right away. Because of that runtime log level evaluation should not
2137significantly affect the process performance.
2138Log definition parsing is only done once, at the first call to
2139GNUNET_log_setup () made by the process (which is usually done soon after
2140it starts).
2141
2142At the moment of writing there is no way to specify logging definitions
2143from configuration files, only via environment variables.
2144
2145At the moment GNUnet will stop processing a log definition when it
2146encounters an error in definition formatting or an error in regular
2147expression syntax, and will not report the failure in any way.
2148
2149
2150@c ***********************************************************************
2151@menu
2152* Examples::
2153* Log files::
2154* Updated behavior of GNUNET_log::
2155@end menu
2156
2157@node Examples
2158@subsubsection Examples
2159
2160@table @asis
2161
2162@item @code{GNUNET_FORCE_LOG=";;;;DEBUG" gnunet-arm -s} Start GNUnet
2163process tree, running all processes with DEBUG level (one should be
2164careful with it, as log files will grow at alarming rate!)
2165@item @code{GNUNET_FORCE_LOG="core;;;;DEBUG" gnunet-arm -s} Start GNUnet
2166process tree, running the core service under DEBUG level (everything else
2167will use configured or default level).
2168
2169@item Start GNUnet process tree, allowing any logging calls from
2170gnunet-service-transport_validation.c (everything else will use
2171configured or default level).
2172
2173@example
2174GNUNET_FORCE_LOG=";gnunet-service-transport_validation.c;;; DEBUG" \
2175gnunet-arm -s
2176@end example
2177
2178@item Start GNUnet process tree, allowing any logging calls from
2179gnunet-gnunet-service-fs_push.c (everything else will use configured or
2180default level).
2181
2182@example
2183GNUNET_FORCE_LOG="fs;gnunet-service-fs_push.c;;;DEBUG" gnunet-arm -s
2184@end example
2185
2186@item Start GNUnet process tree, allowing any logging calls from the
2187GNUNET_NETWORK_socket_select function (everything else will use
2188configured or default level).
2189
2190@example
2191GNUNET_FORCE_LOG=";;GNUNET_NETWORK_socket_select;;DEBUG" gnunet-arm -s
2192@end example
2193
2194@item Start GNUnet process tree, allowing any logging calls from the
2195components that have "transport" in their names, and are made from
2196function that have "send" in their names. Everything else will be allowed
2197to be logged only if it has WARNING level.
2198
2199@example
2200GNUNET_FORCE_LOG="transport.*;;.*send.*;;DEBUG/;;;;WARNING" gnunet-arm -s
2201@end example
2202
2203@end table
2204
2205
2206On Windows, one can use batch files to run GNUnet processes with special
2207environment variables, without affecting the whole system. Such batch
2208file will look like this:
2209
2210@example
2211set GNUNET_FORCE_LOG=;;do_transmit;;DEBUG@ gnunet-arm -s
2212@end example
2213
2214(note the absence of double quotes in the environment variable definition,
2215as opposed to earlier examples, which use the shell).
2216Another limitation, on Windows, GNUNET_FORCE_LOGFILE @strong{MUST} be set
2217in order to GNUNET_FORCE_LOG to work.
2218
2219
2220@cindex Log files
2221@node Log files
2222@subsubsection Log files
2223
2224GNUnet can be told to log everything into a file instead of stderr (which
2225is the default) using the "--log-file=logfile" or "-l logfile" option.
2226This option can also be passed via command line, or from the "OPTION" and
2227"GLOBAL_POSTFIX" configuration keys (see above). The file name passed
2228with this option is subject to GNUnet filename expansion. If specified in
2229"GLOBAL_POSTFIX", it is also subject to ARM service filename expansion,
2230in particular, it may contain "@{@}" (left and right curly brace)
2231sequence, which will be replaced by ARM with the name of the service.
2232This is used to keep logs from more than one service separate, while only
2233specifying one template containing "@{@}" in GLOBAL_POSTFIX.
2234
2235As part of a secondary file name expansion, the first occurrence of "[]"
2236sequence ("left square brace" followed by "right square brace") in the
2237file name will be replaced with a process identifier or the process when
2238it initializes its logging subsystem. As a result, all processes will log
2239into different files. This is convenient for isolating messages of a
2240particular process, and prevents I/O races when multiple processes try to
2241write into the file at the same time. This expansion is done
2242independently of "@{@}" expansion that ARM service does (see above).
2243
2244The log file name that is specified via "-l" can contain format characters
2245from the 'strftime' function family. For example, "%Y" will be replaced
2246with the current year. Using "basename-%Y-%m-%d.log" would include the
2247current year, month and day in the log file. If a GNUnet process runs for
2248long enough to need more than one log file, it will eventually clean up
2249old log files. Currently, only the last three log files (plus the current
2250log file) are preserved. So once the fifth log file goes into use (so
2251after 4 days if you use "%Y-%m-%d" as above), the first log file will be
2252automatically deleted. Note that if your log file name only contains "%Y",
2253then log files would be kept for 4 years and the logs from the first year
2254would be deleted once year 5 begins. If you do not use any date-related
2255string format codes, logs would never be automatically deleted by GNUnet.
2256
2257
2258@c ***********************************************************************
2259
2260@node Updated behavior of GNUNET_log
2261@subsubsection Updated behavior of GNUNET_log
2262
2263It's currently quite common to see constructions like this all over the
2264code:
2265
2266@example
2267#if MESH_DEBUG
2268GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MESH: client disconnected\n");
2269#endif
2270@end example
2271
2272The reason for the #if is not to avoid displaying the message when
2273disabled (GNUNET_ERROR_TYPE takes care of that), but to avoid the
2274compiler including it in the binary at all, when compiling GNUnet for
2275platforms with restricted storage space / memory (MIPS routers,
2276ARM plug computers / dev boards, etc).
2277
2278This presents several problems: the code gets ugly, hard to write and it
2279is very easy to forget to include the #if guards, creating non-consistent
2280code. A new change in GNUNET_log aims to solve these problems.
2281
2282@strong{This change requires to @file{./configure} with at least
2283@code{--enable-logging=verbose} to see debug messages.}
2284
2285Here is an example of code with dense debug statements:
2286
2287@example
2288switch (restrict_topology) @{
2289case GNUNET_TESTING_TOPOLOGY_CLIQUE:#if VERBOSE_TESTING
2290GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but clique
2291topology\n")); #endif unblacklisted_connections = create_clique (pg,
2292&remove_connections, BLACKLIST, GNUNET_NO); break; case
2293GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING: #if VERBOSE_TESTING GNUNET_log
2294(GNUNET_ERROR_TYPE_DEBUG, _("Blacklisting all but small world (ring)
2295topology\n")); #endif unblacklisted_connections = create_small_world_ring
2296(pg,&remove_connections, BLACKLIST); break;
2297@end example
2298
2299
2300Pretty hard to follow, huh?
2301
2302From now on, it is not necessary to include the #if / #endif statements to
2303achieve the same behavior. The GNUNET_log and GNUNET_log_from macros take
2304care of it for you, depending on the configure option:
2305
2306@itemize @bullet
2307@item If @code{--enable-logging} is set to @code{no}, the binary will
2308contain no log messages at all.
2309@item If @code{--enable-logging} is set to @code{yes}, the binary will
2310contain no DEBUG messages, and therefore running with -L DEBUG will have
2311no effect. Other messages (ERROR, WARNING, INFO, etc) will be included.
2312@item If @code{--enable-logging} is set to @code{verbose}, or
2313@code{veryverbose} the binary will contain DEBUG messages (still, it will
2314be neccessary to run with -L DEBUG or set the DEBUG config option to show
2315them).
2316@end itemize
2317
2318
2319If you are a developer:
2320@itemize @bullet
2321@item please make sure that you @code{./configure
2322--enable-logging=@{verbose,veryverbose@}}, so you can see DEBUG messages.
2323@item please remove the @code{#if} statements around @code{GNUNET_log
2324(GNUNET_ERROR_TYPE_DEBUG, ...)} lines, to improve the readibility of your
2325code.
2326@end itemize
2327
2328Since now activating DEBUG automatically makes it VERBOSE and activates
2329@strong{all} debug messages by default, you probably want to use the
2330https://gnunet.org/logging functionality to filter only relevant messages.
2331A suitable configuration could be:
2332
2333@example
2334$ export GNUNET_FORCE_LOG="^YOUR_SUBSYSTEM$;;;;DEBUG/;;;;WARNING"
2335@end example
2336
2337Which will behave almost like enabling DEBUG in that subsytem before the
2338change. Of course you can adapt it to your particular needs, this is only
2339a quick example.
2340
2341@cindex Interprocess communication API
2342@cindex ICP
2343@node Interprocess communication API (IPC)
2344@subsection Interprocess communication API (IPC)
2345
2346In GNUnet a variety of new message types might be defined and used in
2347interprocess communication, in this tutorial we use the
2348@code{struct AddressLookupMessage} as a example to introduce how to
2349construct our own message type in GNUnet and how to implement the message
2350communication between service and client.
2351(Here, a client uses the @code{struct AddressLookupMessage} as a request
2352to ask the server to return the address of any other peer connecting to
2353the service.)
2354
2355
2356@c ***********************************************************************
2357@menu
2358* Define new message types::
2359* Define message struct::
2360* Client - Establish connection::
2361* Client - Initialize request message::
2362* Client - Send request and receive response::
2363* Server - Startup service::
2364* Server - Add new handles for specified messages::
2365* Server - Process request message::
2366* Server - Response to client::
2367* Server - Notification of clients::
2368* Conversion between Network Byte Order (Big Endian) and Host Byte Order::
2369@end menu
2370
2371@node Define new message types
2372@subsubsection Define new message types
2373
2374First of all, you should define the new message type in
2375@file{gnunet_protocols.h}:
2376
2377@example
2378 // Request to look addresses of peers in server.
2379#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP 29
2380 // Response to the address lookup request.
2381#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY 30
2382@end example
2383
2384@c ***********************************************************************
2385@node Define message struct
2386@subsubsection Define message struct
2387
2388After the type definition, the specified message structure should also be
2389described in the header file, e.g. transport.h in our case.
2390
2391@example
2392struct AddressLookupMessage @{
2393 struct GNUNET_MessageHeader header;
2394 int32_t numeric_only GNUNET_PACKED;
2395 struct GNUNET_TIME_AbsoluteNBO timeout;
2396 uint32_t addrlen GNUNET_PACKED;
2397 /* followed by 'addrlen' bytes of the actual address, then
2398 followed by the 0-terminated name of the transport */ @};
2399GNUNET_NETWORK_STRUCT_END
2400@end example
2401
2402
2403Please note @code{GNUNET_NETWORK_STRUCT_BEGIN} and @code{GNUNET_PACKED}
2404which both ensure correct alignment when sending structs over the network.
2405
2406@menu
2407@end menu
2408
2409@c ***********************************************************************
2410@node Client - Establish connection
2411@subsubsection Client - Establish connection
2412@c %**end of header
2413
2414
2415At first, on the client side, the underlying API is employed to create a
2416new connection to a service, in our example the transport service would be
2417connected.
2418
2419@example
2420struct GNUNET_CLIENT_Connection *client;
2421client = GNUNET_CLIENT_connect ("transport", cfg);
2422@end example
2423
2424@c ***********************************************************************
2425@node Client - Initialize request message
2426@subsubsection Client - Initialize request message
2427@c %**end of header
2428
2429When the connection is ready, we initialize the message. In this step,
2430all the fields of the message should be properly initialized, namely the
2431size, type, and some extra user-defined data, such as timeout, name of
2432transport, address and name of transport.
2433
2434@example
2435struct AddressLookupMessage *msg;
2436size_t len = sizeof (struct AddressLookupMessage)
2437 + addressLen
2438 + strlen (nameTrans)
2439 + 1;
2440msg->header->size = htons (len);
2441msg->header->type = htons
2442(GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP);
2443msg->timeout = GNUNET_TIME_absolute_hton (abs_timeout);
2444msg->addrlen = htonl (addressLen);
2445char *addrbuf = (char *) &msg[1];
2446memcpy (addrbuf, address, addressLen);
2447char *tbuf = &addrbuf[addressLen];
2448memcpy (tbuf, nameTrans, strlen (nameTrans) + 1);
2449@end example
2450
2451Note that, here the functions @code{htonl}, @code{htons} and
2452@code{GNUNET_TIME_absolute_hton} are applied to convert little endian
2453into big endian, about the usage of the big/small edian order and the
2454corresponding conversion function please refer to Introduction of
2455Big Endian and Little Endian.
2456
2457@c ***********************************************************************
2458@node Client - Send request and receive response
2459@subsubsection Client - Send request and receive response
2460@c %**end of header
2461
2462@b{FIXME: This is very outdated, see the tutorial for the current API!}
2463
2464Next, the client would send the constructed message as a request to the
2465service and wait for the response from the service. To accomplish this
2466goal, there are a number of API calls that can be used. In this example,
2467@code{GNUNET_CLIENT_transmit_and_get_response} is chosen as the most
2468appropriate function to use.
2469
2470@example
2471GNUNET_CLIENT_transmit_and_get_response
2472(client, msg->header, timeout, GNUNET_YES, &address_response_processor,
2473arp_ctx);
2474@end example
2475
2476the argument @code{address_response_processor} is a function with
2477@code{GNUNET_CLIENT_MessageHandler} type, which is used to process the
2478reply message from the service.
2479
2480@node Server - Startup service
2481@subsubsection Server - Startup service
2482
2483After receiving the request message, we run a standard GNUnet service
2484startup sequence using @code{GNUNET_SERVICE_run}, as follows,
2485
2486@example
2487int main(int argc, char**argv) @{
2488 GNUNET_SERVICE_run(argc, argv, "transport"
2489 GNUNET_SERVICE_OPTION_NONE, &run, NULL)); @}
2490@end example
2491
2492@c ***********************************************************************
2493@node Server - Add new handles for specified messages
2494@subsubsection Server - Add new handles for specified messages
2495@c %**end of header
2496
2497in the function above the argument @code{run} is used to initiate
2498transport service,and defined like this:
2499
2500@example
2501static void run (void *cls,
2502struct GNUNET_SERVER_Handle *serv,
2503const struct GNUNET_CONFIGURATION_Handle *cfg) @{
2504 GNUNET_SERVER_add_handlers (serv, handlers); @}
2505@end example
2506
2507
2508Here, @code{GNUNET_SERVER_add_handlers} must be called in the run
2509function to add new handlers in the service. The parameter
2510@code{handlers} is a list of @code{struct GNUNET_SERVER_MessageHandler}
2511to tell the service which function should be called when a particular
2512type of message is received, and should be defined in this way:
2513
2514@example
2515static struct GNUNET_SERVER_MessageHandler handlers[] = @{
2516 @{&handle_start,
2517 NULL,
2518 GNUNET_MESSAGE_TYPE_TRANSPORT_START,
2519 0@},
2520 @{&handle_send,
2521 NULL,
2522 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND,
2523 0@},
2524 @{&handle_try_connect,
2525 NULL,
2526 GNUNET_MESSAGE_TYPE_TRANSPORT_TRY_CONNECT,
2527 sizeof (struct TryConnectMessage)
2528 @},
2529 @{&handle_address_lookup,
2530 NULL,
2531 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP,
2532 0@},
2533 @{NULL,
2534 NULL,
2535 0,
2536 0@}
2537@};
2538@end example
2539
2540
2541As shown, the first member of the struct in the first area is a callback
2542function, which is called to process the specified message types, given
2543as the third member. The second parameter is the closure for the callback
2544function, which is set to @code{NULL} in most cases, and the last
2545parameter is the expected size of the message of this type, usually we
2546set it to 0 to accept variable size, for special cases the exact size of
2547the specified message also can be set. In addition, the terminator sign
2548depicted as @code{@{NULL, NULL, 0, 0@}} is set in the last aera.
2549
2550@c ***********************************************************************
2551@node Server - Process request message
2552@subsubsection Server - Process request message
2553@c %**end of header
2554
2555After the initialization of transport service, the request message would
2556be processed. Before handling the main message data, the validity of this
2557message should be checked out, e.g., to check whether the size of message
2558is correct.
2559
2560@example
2561size = ntohs (message->size);
2562if (size < sizeof (struct AddressLookupMessage)) @{
2563 GNUNET_break_op (0);
2564 GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
2565 return; @}
2566@end example
2567
2568
2569Note that, opposite to the construction method of the request message in
2570the client, in the server the function @code{nothl} and @code{ntohs}
2571should be employed during the extraction of the data from the message, so
2572that the data in big endian order can be converted back into little
2573endian order. See more in detail please refer to Introduction of
2574Big Endian and Little Endian.
2575
2576Moreover in this example, the name of the transport stored in the message
2577is a 0-terminated string, so we should also check whether the name of the
2578transport in the received message is 0-terminated:
2579
2580@example
2581nameTransport = (const char *) &address[addressLen];
2582if (nameTransport[size - sizeof
2583 (struct AddressLookupMessage)
2584 - addressLen - 1] != '\0') @{
2585 GNUNET_break_op (0);
2586 GNUNET_SERVER_receive_done (client,
2587 GNUNET_SYSERR);
2588 return; @}
2589@end example
2590
2591Here, @code{GNUNET_SERVER_receive_done} should be called to tell the
2592service that the request is done and can receive the next message. The
2593argument @code{GNUNET_SYSERR} here indicates that the service didn't
2594understand the request message, and the processing of this request would
2595be terminated.
2596
2597In comparison to the aforementioned situation, when the argument is equal
2598to @code{GNUNET_OK}, the service would continue to process the requst
2599message.
2600
2601@c ***********************************************************************
2602@node Server - Response to client
2603@subsubsection Server - Response to client
2604@c %**end of header
2605
2606Once the processing of current request is done, the server should give the
2607response to the client. A new @code{struct AddressLookupMessage} would be
2608produced by the server in a similar way as the client did and sent to the
2609client, but here the type should be
2610@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY} rather than
2611@code{GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP} in client.
2612@example
2613struct AddressLookupMessage *msg;
2614size_t len = sizeof (struct AddressLookupMessage)
2615 + addressLen
2616 + strlen (nameTrans) + 1;
2617msg->header->size = htons (len);
2618msg->header->type = htons
2619 (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2620
2621// ...
2622
2623struct GNUNET_SERVER_TransmitContext *tc;
2624tc = GNUNET_SERVER_transmit_context_create (client);
2625GNUNET_SERVER_transmit_context_append_data
2626(tc,
2627 NULL,
2628 0,
2629 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
2630GNUNET_SERVER_transmit_context_run (tc, rtimeout);
2631@end example
2632
2633
2634Note that, there are also a number of other APIs provided to the service
2635to send the message.
2636
2637@c ***********************************************************************
2638@node Server - Notification of clients
2639@subsubsection Server - Notification of clients
2640@c %**end of header
2641
2642Often a service needs to (repeatedly) transmit notifications to a client
2643or a group of clients. In these cases, the client typically has once
2644registered for a set of events and then needs to receive a message
2645whenever such an event happens (until the client disconnects). The use of
2646a notification context can help manage message queues to clients and
2647handle disconnects. Notification contexts can be used to send
2648individualized messages to a particular client or to broadcast messages
2649to a group of clients. An individualized notification might look like
2650this:
2651
2652@example
2653GNUNET_SERVER_notification_context_unicast(nc,
2654 client,
2655 msg,
2656 GNUNET_YES);
2657@end example
2658
2659
2660Note that after processing the original registration message for
2661notifications, the server code still typically needs to call
2662@code{GNUNET_SERVER_receive_done} so that the client can transmit further
2663messages to the server.
2664
2665@c ***********************************************************************
2666@node Conversion between Network Byte Order (Big Endian) and Host Byte Order
2667@subsubsection Conversion between Network Byte Order (Big Endian) and Host Byte Order
2668@c %** subsub? it's a referenced page on the ipc document.
2669@c %**end of header
2670
2671Here we can simply comprehend big endian and little endian as Network Byte
2672Order and Host Byte Order respectively. What is the difference between
2673both two?
2674
2675Usually in our host computer we store the data byte as Host Byte Order,
2676for example, we store a integer in the RAM which might occupies 4 Byte,
2677as Host Byte Order the higher Byte would be stored at the lower address
2678of RAM, and the lower Byte would be stored at the higher address of RAM.
2679However, contrast to this, Network Byte Order just take the totally
2680opposite way to store the data, says, it will store the lower Byte at the
2681lower address, and the higher Byte will stay at higher address.
2682
2683For the current communication of network, we normally exchange the
2684information by surveying the data package, every two host wants to
2685communicate with each other must send and receive data package through
2686network. In order to maintain the identity of data through the
2687transmission in the network, the order of the Byte storage must changed
2688before sending and after receiving the data.
2689
2690There ten convenient functions to realize the conversion of Byte Order in
2691GNUnet, as following:
2692
2693@table @asis
2694
2695@item uint16_t htons(uint16_t hostshort) Convert host byte order to net
2696byte order with short int
2697@item uint32_t htonl(uint32_t hostlong) Convert host byte
2698order to net byte order with long int
2699@item uint16_t ntohs(uint16_t netshort)
2700Convert net byte order to host byte order with short int
2701@item uint32_t
2702ntohl(uint32_t netlong) Convert net byte order to host byte order with
2703long int
2704@item unsigned long long GNUNET_ntohll (unsigned long long netlonglong)
2705Convert net byte order to host byte order with long long int
2706@item unsigned long long GNUNET_htonll (unsigned long long hostlonglong)
2707Convert host byte order to net byte order with long long int
2708@item struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton
2709(struct GNUNET_TIME_Relative a) Convert relative time to network byte
2710order.
2711@item struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh
2712(struct GNUNET_TIME_RelativeNBO a) Convert relative time from network
2713byte order.
2714@item struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton
2715(struct GNUNET_TIME_Absolute a) Convert relative time to network byte
2716order.
2717@item struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh
2718(struct GNUNET_TIME_AbsoluteNBO a) Convert relative time from network
2719byte order.
2720@end table
2721
2722@cindex Cryptography API
2723@node Cryptography API
2724@subsection Cryptography API
2725@c %**end of header
2726
2727The gnunetutil APIs provides the cryptographic primitives used in GNUnet.
2728GNUnet uses 2048 bit RSA keys for the session key exchange and for signing
2729messages by peers and most other public-key operations. Most researchers
2730in cryptography consider 2048 bit RSA keys as secure and practically
2731unbreakable for a long time. The API provides functions to create a fresh
2732key pair, read a private key from a file (or create a new file if the
2733file does not exist), encrypt, decrypt, sign, verify and extraction of
2734the public key into a format suitable for network transmission.
2735
2736For the encryption of files and the actual data exchanged between peers
2737GNUnet uses 256-bit AES encryption. Fresh, session keys are negotiated
2738for every new connection.@ Again, there is no published technique to
2739break this cipher in any realistic amount of time. The API provides
2740functions for generation of keys, validation of keys (important for
2741checking that decryptions using RSA succeeded), encryption and decryption.
2742
2743GNUnet uses SHA-512 for computing one-way hash codes. The API provides
2744functions to compute a hash over a block in memory or over a file on disk.
2745
2746The crypto API also provides functions for randomizing a block of memory,
2747obtaining a single random number and for generating a permuation of the
2748numbers 0 to n-1. Random number generation distinguishes between WEAK and
2749STRONG random number quality; WEAK random numbers are pseudo-random
2750whereas STRONG random numbers use entropy gathered from the operating
2751system.
2752
2753Finally, the crypto API provides a means to deterministically generate a
27541024-bit RSA key from a hash code. These functions should most likely not
2755be used by most applications; most importantly,
2756GNUNET_CRYPTO_rsa_key_create_from_hash does not create an RSA-key that
2757should be considered secure for traditional applications of RSA.
2758
2759@cindex Message Queue API
2760@node Message Queue API
2761@subsection Message Queue API
2762@c %**end of header
2763
2764@strong{ Introduction }@
2765Often, applications need to queue messages that
2766are to be sent to other GNUnet peers, clients or services. As all of
2767GNUnet's message-based communication APIs, by design, do not allow
2768messages to be queued, it is common to implement custom message queues
2769manually when they are needed. However, writing very similar code in
2770multiple places is tedious and leads to code duplication.
2771
2772MQ (for Message Queue) is an API that provides the functionality to
2773implement and use message queues. We intend to eventually replace all of
2774the custom message queue implementations in GNUnet with MQ.
2775
2776@strong{ Basic Concepts }@
2777The two most important entities in MQ are queues and envelopes.
2778
2779Every queue is backed by a specific implementation (e.g. for mesh, stream,
2780connection, server client, etc.) that will actually deliver the queued
2781messages. For convenience,@ some queues also allow to specify a list of
2782message handlers. The message queue will then also wait for incoming
2783messages and dispatch them appropriately.
2784
2785An envelope holds the the memory for a message, as well as metadata
2786(Where is the envelope queued? What should happen after it has been
2787sent?). Any envelope can only be queued in one message queue.
2788
2789@strong{ Creating Queues }@
2790The following is a list of currently available message queues. Note that
2791to avoid layering issues, message queues for higher level APIs are not
2792part of @code{libgnunetutil}, but@ the respective API itself provides the
2793queue implementation.
2794
2795@table @asis
2796
2797@item @code{GNUNET_MQ_queue_for_connection_client}
2798Transmits queued messages over a @code{GNUNET_CLIENT_Connection} handle.
2799Also supports receiving with message handlers.
2800
2801@item @code{GNUNET_MQ_queue_for_server_client}
2802Transmits queued messages over a @code{GNUNET_SERVER_Client} handle. Does
2803not support incoming message handlers.
2804
2805@item @code{GNUNET_MESH_mq_create} Transmits queued messages over a
2806@code{GNUNET_MESH_Tunnel} handle. Does not support incoming message
2807handlers.
2808
2809@item @code{GNUNET_MQ_queue_for_callbacks} This is the most general
2810implementation. Instead of delivering and receiving messages with one of
2811GNUnet's communication APIs, implementation callbacks are called. Refer to
2812"Implementing Queues" for a more detailed explanation.
2813@end table
2814
2815
2816@strong{ Allocating Envelopes }@
2817A GNUnet message (as defined by the GNUNET_MessageHeader) has three
2818parts: The size, the type, and the body.
2819
2820MQ provides macros to allocate an envelope containing a message
2821conveniently, automatically setting the size and type fields of the
2822message.
2823
2824Consider the following simple message, with the body consisting of a
2825single number value.
2826@c why the empy code function?
2827@code{}
2828
2829@example
2830struct NumberMessage @{
2831 /** Type: GNUNET_MESSAGE_TYPE_EXAMPLE_1 */
2832 struct GNUNET_MessageHeader header;
2833 uint32_t number GNUNET_PACKED;
2834@};
2835@end example
2836
2837An envelope containing an instance of the NumberMessage can be
2838constructed like this:
2839
2840@example
2841struct GNUNET_MQ_Envelope *ev;
2842struct NumberMessage *msg;
2843ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_EXAMPLE_1);
2844msg->number = htonl (42);
2845@end example
2846
2847In the above code, @code{GNUNET_MQ_msg} is a macro. The return value is
2848the newly allocated envelope. The first argument must be a pointer to some
2849@code{struct} containing a @code{struct GNUNET_MessageHeader header}
2850field, while the second argument is the desired message type, in host
2851byte order.
2852
2853The @code{msg} pointer now points to an allocated message, where the
2854message type and the message size are already set. The message's size is
2855inferred from the type of the @code{msg} pointer: It will be set to
2856'sizeof(*msg)', properly converted to network byte order.
2857
2858If the message body's size is dynamic, the the macro
2859@code{GNUNET_MQ_msg_extra} can be used to allocate an envelope whose
2860message has additional space allocated after the @code{msg} structure.
2861
2862If no structure has been defined for the message,
2863@code{GNUNET_MQ_msg_header_extra} can be used to allocate additional space
2864after the message header. The first argument then must be a pointer to a
2865@code{GNUNET_MessageHeader}.
2866
2867@strong{Envelope Properties}@
2868A few functions in MQ allow to set additional properties on envelopes:
2869
2870@table @asis
2871
2872@item @code{GNUNET_MQ_notify_sent} Allows to specify a function that will
2873be called once the envelope's message has been sent irrevocably.
2874An envelope can be canceled precisely up to the@ point where the notify
2875sent callback has been called.
2876
2877@item @code{GNUNET_MQ_disable_corking} No corking will be used when
2878sending the message. Not every@ queue supports this flag, per default,
2879envelopes are sent with corking.@
2880
2881@end table
2882
2883
2884@strong{Sending Envelopes}@
2885Once an envelope has been constructed, it can be queued for sending with
2886@code{GNUNET_MQ_send}.
2887
2888Note that in order to avoid memory leaks, an envelope must either be sent
2889(the queue will free it) or destroyed explicitly with
2890@code{GNUNET_MQ_discard}.
2891
2892@strong{Canceling Envelopes}@
2893An envelope queued with @code{GNUNET_MQ_send} can be canceled with
2894@code{GNUNET_MQ_cancel}. Note that after the notify sent callback has
2895been called, canceling a message results in undefined behavior.
2896Thus it is unsafe to cancel an envelope that does not have a notify sent
2897callback. When canceling an envelope, it is not necessary@ to call
2898@code{GNUNET_MQ_discard}, and the envelope can't be sent again.
2899
2900@strong{ Implementing Queues }@
2901@code{TODO}
2902
2903@cindex Service API
2904@node Service API
2905@subsection Service API
2906@c %**end of header
2907
2908Most GNUnet code lives in the form of services. Services are processes
2909that offer an API for other components of the system to build on. Those
2910other components can be command-line tools for users, graphical user
2911interfaces or other services. Services provide their API using an IPC
2912protocol. For this, each service must listen on either a TCP port or a
2913UNIX domain socket; for this, the service implementation uses the server
2914API. This use of server is exposed directly to the users of the service
2915API. Thus, when using the service API, one is usually also often using
2916large parts of the server API. The service API provides various
2917convenience functions, such as parsing command-line arguments and the
2918configuration file, which are not found in the server API.
2919The dual to the service/server API is the client API, which can be used to
2920access services.
2921
2922The most common way to start a service is to use the
2923@code{GNUNET_SERVICE_run} function from the program's main function.
2924@code{GNUNET_SERVICE_run} will then parse the command line and
2925configuration files and, based on the options found there,
2926start the server. It will then give back control to the main
2927program, passing the server and the configuration to the
2928@code{GNUNET_SERVICE_Main} callback. @code{GNUNET_SERVICE_run}
2929will also take care of starting the scheduler loop.
2930If this is inappropriate (for example, because the scheduler loop
2931is already running), @code{GNUNET_SERVICE_start} and
2932related functions provide an alternative to @code{GNUNET_SERVICE_run}.
2933
2934When starting a service, the service_name option is used to determine
2935which sections in the configuration file should be used to configure the
2936service. A typical value here is the name of the @file{src/}
2937sub-directory, for example @file{statistics}.
2938The same string would also be given to
2939@code{GNUNET_CLIENT_connect} to access the service.
2940
2941Once a service has been initialized, the program should use the
2942@code{GNUNET_SERVICE_Main} callback to register message handlers
2943using @code{GNUNET_SERVER_add_handlers}.
2944The service will already have registered a handler for the
2945"TEST" message.
2946
2947@fnindex GNUNET_SERVICE_Options
2948The option bitfield (@code{enum GNUNET_SERVICE_Options})
2949determines how a service should behave during shutdown.
2950There are three key strategies:
2951
2952@table @asis
2953
2954@item instant (@code{GNUNET_SERVICE_OPTION_NONE})
2955Upon receiving the shutdown
2956signal from the scheduler, the service immediately terminates the server,
2957closing all existing connections with clients.
2958@item manual (@code{GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN})
2959The service does nothing by itself
2960during shutdown. The main program will need to take the appropriate
2961action by calling GNUNET_SERVER_destroy or GNUNET_SERVICE_stop (depending
2962on how the service was initialized) to terminate the service. This method
2963is used by gnunet-service-arm and rather uncommon.
2964@item soft (@code{GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN})
2965Upon receiving the shutdown signal from the scheduler,
2966the service immediately tells the server to stop
2967listening for incoming clients. Requests from normal existing clients are
2968still processed and the server/service terminates once all normal clients
2969have disconnected. Clients that are not expected to ever disconnect (such
2970as clients that monitor performance values) can be marked as 'monitor'
2971clients using GNUNET_SERVER_client_mark_monitor. Those clients will
2972continue to be processed until all 'normal' clients have disconnected.
2973Then, the server will terminate, closing the monitor connections.
2974This mode is for example used by 'statistics', allowing existing 'normal'
2975clients to set (possibly persistent) statistic values before terminating.
2976
2977@end table
2978
2979@c ***********************************************************************
2980@node Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2981@subsection Optimizing Memory Consumption of GNUnet's (Multi-) Hash Maps
2982@c %**end of header
2983
2984A commonly used data structure in GNUnet is a (multi-)hash map. It is most
2985often used to map a peer identity to some data structure, but also to map
2986arbitrary keys to values (for example to track requests in the distributed
2987hash table or in file-sharing). As it is commonly used, the DHT is
2988actually sometimes responsible for a large share of GNUnet's overall
2989memory consumption (for some processes, 30% is not uncommon). The
2990following text documents some API quirks (and their implications for
2991applications) that were recently introduced to minimize the footprint of
2992the hash map.
2993
2994
2995@c ***********************************************************************
2996@menu
2997* Analysis::
2998* Solution::
2999* Migration::
3000* Conclusion::
3001* Availability::
3002@end menu
3003
3004@node Analysis
3005@subsubsection Analysis
3006@c %**end of header
3007
3008The main reason for the "excessive" memory consumption by the hash map is
3009that GNUnet uses 512-bit cryptographic hash codes --- and the
3010(multi-)hash map also uses the same 512-bit 'struct GNUNET_HashCode'. As
3011a result, storing just the keys requires 64 bytes of memory for each key.
3012As some applications like to keep a large number of entries in the hash
3013map (after all, that's what maps are good for), 64 bytes per hash is
3014significant: keeping a pointer to the value and having a linked list for
3015collisions consume between 8 and 16 bytes, and 'malloc' may add about the
3016same overhead per allocation, putting us in the 16 to 32 byte per entry
3017ballpark. Adding a 64-byte key then triples the overall memory
3018requirement for the hash map.
3019
3020To make things "worse", most of the time storing the key in the hash map
3021is not required: it is typically already in memory elsewhere! In most
3022cases, the values stored in the hash map are some application-specific
3023struct that _also_ contains the hash. Here is a simplified example:
3024
3025@example
3026struct MyValue @{
3027struct GNUNET_HashCode key;
3028unsigned int my_data; @};
3029
3030// ...
3031val = GNUNET_malloc (sizeof (struct MyValue));
3032val->key = key;
3033val->my_data = 42;
3034GNUNET_CONTAINER_multihashmap_put (map, &key, val, ...);
3035@end example
3036
3037This is a common pattern as later the entries might need to be removed,
3038and at that time it is convenient to have the key immediately at hand:
3039
3040@example
3041GNUNET_CONTAINER_multihashmap_remove (map, &val->key, val);
3042@end example
3043
3044
3045Note that here we end up with two times 64 bytes for the key, plus maybe
304664 bytes total for the rest of the 'struct MyValue' and the map entry in
3047the hash map. The resulting redundant storage of the key increases
3048overall memory consumption per entry from the "optimal" 128 bytes to 192
3049bytes. This is not just an extreme example: overheads in practice are
3050actually sometimes close to those highlighted in this example. This is
3051especially true for maps with a significant number of entries, as there
3052we tend to really try to keep the entries small.
3053
3054@c ***********************************************************************
3055@node Solution
3056@subsubsection Solution
3057@c %**end of header
3058
3059The solution that has now been implemented is to @strong{optionally}
3060allow the hash map to not make a (deep) copy of the hash but instead have
3061a pointer to the hash/key in the entry. This reduces the memory
3062consumption for the key from 64 bytes to 4 to 8 bytes. However, it can
3063also only work if the key is actually stored in the entry (which is the
3064case most of the time) and if the entry does not modify the key (which in
3065all of the code I'm aware of has been always the case if there key is
3066stored in the entry). Finally, when the client stores an entry in the
3067hash map, it @strong{must} provide a pointer to the key within the entry,
3068not just a pointer to a transient location of the key. If
3069the client code does not meet these requirements, the result is a dangling
3070pointer and undefined behavior of the (multi-)hash map API.
3071
3072@c ***********************************************************************
3073@node Migration
3074@subsubsection Migration
3075@c %**end of header
3076
3077To use the new feature, first check that the values contain the respective
3078key (and never modify it). Then, all calls to
3079@code{GNUNET_CONTAINER_multihashmap_put} on the respective map must be
3080audited and most likely changed to pass a pointer into the value's struct.
3081For the initial example, the new code would look like this:
3082
3083@example
3084struct MyValue @{
3085struct GNUNET_HashCode key;
3086unsigned int my_data; @};
3087
3088// ...
3089val = GNUNET_malloc (sizeof (struct MyValue));
3090val->key = key; val->my_data = 42;
3091GNUNET_CONTAINER_multihashmap_put (map, &val->key, val, ...);
3092@end example
3093
3094
3095Note that @code{&val} was changed to @code{&val->key} in the argument to
3096the @code{put} call. This is critical as often @code{key} is on the stack
3097or in some other transient data structure and thus having the hash map
3098keep a pointer to @code{key} would not work. Only the key inside of
3099@code{val} has the same lifetime as the entry in the map (this must of
3100course be checked as well). Naturally, @code{val->key} must be
3101intiialized before the @code{put} call. Once all @code{put} calls have
3102been converted and double-checked, you can change the call to create the
3103hash map from
3104
3105@example
3106map =
3107GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_NO);
3108@end example
3109
3110to
3111
3112@example
3113map = GNUNET_CONTAINER_multihashmap_create (SIZE, GNUNET_YES);
3114@end example
3115
3116If everything was done correctly, you now use about 60 bytes less memory
3117per entry in @code{map}. However, if now (or in the future) any call to
3118@code{put} does not ensure that the given key is valid until the entry is
3119removed from the map, undefined behavior is likely to be observed.
3120
3121@c ***********************************************************************
3122@node Conclusion
3123@subsubsection Conclusion
3124@c %**end of header
3125
3126The new optimization can is often applicable and can result in a
3127reduction in memory consumption of up to 30% in practice. However, it
3128makes the code less robust as additional invariants are imposed on the
3129multi hash map client. Thus applications should refrain from enabling the
3130new mode unless the resulting performance increase is deemed significant
3131enough. In particular, it should generally not be used in new code (wait
3132at least until benchmarks exist).
3133
3134@c ***********************************************************************
3135@node Availability
3136@subsubsection Availability
3137@c %**end of header
3138
3139The new multi hash map code was committed in SVN 24319 (will be in GNUnet
31400.9.4). Various subsystems (transport, core, dht, file-sharing) were
3141previously audited and modified to take advantage of the new capability.
3142In particular, memory consumption of the file-sharing service is expected
3143to drop by 20-30% due to this change.
3144
3145
3146@cindex CONTAINER_MDLL API
3147@node CONTAINER_MDLL API
3148@subsection CONTAINER_MDLL API
3149@c %**end of header
3150
3151This text documents the GNUNET_CONTAINER_MDLL API. The
3152GNUNET_CONTAINER_MDLL API is similar to the GNUNET_CONTAINER_DLL API in
3153that it provides operations for the construction and manipulation of
3154doubly-linked lists. The key difference to the (simpler) DLL-API is that
3155the MDLL-version allows a single element (instance of a "struct") to be
3156in multiple linked lists at the same time.
3157
3158Like the DLL API, the MDLL API stores (most of) the data structures for
3159the doubly-linked list with the respective elements; only the 'head' and
3160'tail' pointers are stored "elsewhere" --- and the application needs to
3161provide the locations of head and tail to each of the calls in the
3162MDLL API. The key difference for the MDLL API is that the "next" and
3163"previous" pointers in the struct can no longer be simply called "next"
3164and "prev" --- after all, the element may be in multiple doubly-linked
3165lists, so we cannot just have one "next" and one "prev" pointer!
3166
3167The solution is to have multiple fields that must have a name of the
3168format "next_XX" and "prev_XX" where "XX" is the name of one of the
3169doubly-linked lists. Here is a simple example:
3170
3171@example
3172struct MyMultiListElement @{
3173 struct MyMultiListElement *next_ALIST;
3174 struct MyMultiListElement *prev_ALIST;
3175 struct MyMultiListElement *next_BLIST;
3176 struct MyMultiListElement *prev_BLIST;
3177 void
3178 *data;
3179@};
3180@end example
3181
3182
3183Note that by convention, we use all-uppercase letters for the list names.
3184In addition, the program needs to have a location for the head and tail
3185pointers for both lists, for example:
3186
3187@example
3188static struct MyMultiListElement *head_ALIST;
3189static struct MyMultiListElement *tail_ALIST;
3190static struct MyMultiListElement *head_BLIST;
3191static struct MyMultiListElement *tail_BLIST;
3192@end example
3193
3194
3195Using the MDLL-macros, we can now insert an element into the ALIST:
3196
3197@example
3198GNUNET_CONTAINER_MDLL_insert (ALIST, head_ALIST, tail_ALIST, element);
3199@end example
3200
3201
3202Passing "ALIST" as the first argument to MDLL specifies which of the
3203next/prev fields in the 'struct MyMultiListElement' should be used. The
3204extra "ALIST" argument and the "_ALIST" in the names of the
3205next/prev-members are the only differences between the MDDL and DLL-API.
3206Like the DLL-API, the MDLL-API offers functions for inserting (at head,
3207at tail, after a given element) and removing elements from the list.
3208Iterating over the list should be done by directly accessing the
3209"next_XX" and/or "prev_XX" members.
3210
3211@cindex Automatic Restart Manager
3212@cindex ARM
3213@node Automatic Restart Manager (ARM)
3214@section Automatic Restart Manager (ARM)
3215@c %**end of header
3216
3217GNUnet's Automated Restart Manager (ARM) is the GNUnet service responsible
3218for system initialization and service babysitting. ARM starts and halts
3219services, detects configuration changes and restarts services impacted by
3220the changes as needed. It's also responsible for restarting services in
3221case of crashes and is planned to incorporate automatic debugging for
3222diagnosing service crashes providing developers insights about crash
3223reasons. The purpose of this document is to give GNUnet developer an idea
3224about how ARM works and how to interact with it.
3225
3226@menu
3227* Basic functionality::
3228* Key configuration options::
3229* ARM - Availability::
3230* Reliability::
3231@end menu
3232
3233@c ***********************************************************************
3234@node Basic functionality
3235@subsection Basic functionality
3236@c %**end of header
3237
3238@itemize @bullet
3239@item ARM source code can be found under "src/arm".@ Service processes are
3240managed by the functions in "gnunet-service-arm.c" which is controlled
3241with "gnunet-arm.c" (main function in that file is ARM's entry point).
3242
3243@item The functions responsible for communicating with ARM , starting and
3244stopping services -including ARM service itself- are provided by the
3245ARM API "arm_api.c".@ Function: GNUNET_ARM_connect() returns to the caller
3246an ARM handle after setting it to the caller's context (configuration and
3247scheduler in use). This handle can be used afterwards by the caller to
3248communicate with ARM. Functions GNUNET_ARM_start_service() and
3249GNUNET_ARM_stop_service() are used for starting and stopping services
3250respectively.
3251
3252@item A typical example of using these basic ARM services can be found in
3253file test_arm_api.c. The test case connects to ARM, starts it, then uses
3254it to start a service "resolver", stops the "resolver" then stops "ARM".
3255@end itemize
3256
3257@c ***********************************************************************
3258@node Key configuration options
3259@subsection Key configuration options
3260@c %**end of header
3261
3262Configurations for ARM and services should be available in a .conf file
3263(As an example, see test_arm_api_data.conf). When running ARM, the
3264configuration file to use should be passed to the command:
3265
3266@example
3267$ gnunet-arm -s -c configuration_to_use.conf
3268@end example
3269
3270If no configuration is passed, the default configuration file will be used
3271(see GNUNET_PREFIX/share/gnunet/defaults.conf which is created from
3272contrib/defaults.conf).@ Each of the services is having a section starting
3273by the service name between square brackets, for example: "[arm]".
3274The following options configure how ARM configures or interacts with the
3275various services:
3276
3277@table @asis
3278
3279@item PORT Port number on which the service is listening for incoming TCP
3280connections. ARM will start the services should it notice a request at
3281this port.
3282
3283@item HOSTNAME Specifies on which host the service is deployed. Note
3284that ARM can only start services that are running on the local system
3285(but will not check that the hostname matches the local machine name).
3286This option is used by the @code{gnunet_client_lib.h} implementation to
3287determine which system to connect to. The default is "localhost".
3288
3289@item BINARY The name of the service binary file.
3290
3291@item OPTIONS To be passed to the service.
3292
3293@item PREFIX A command to pre-pend to the actual command, for example,
3294running a service with "valgrind" or "gdb"
3295
3296@item DEBUG Run in debug mode (much verbosity).
3297
3298@item AUTOSTART ARM will listen to UNIX domain socket and/or TCP port of
3299the service and start the service on-demand.
3300
3301@item FORCESTART ARM will always start this service when the peer
3302is started.
3303
3304@item ACCEPT_FROM IPv4 addresses the service accepts connections from.
3305
3306@item ACCEPT_FROM6 IPv6 addresses the service accepts connections from.
3307
3308@end table
3309
3310
3311Options that impact the operation of ARM overall are in the "[arm]"
3312section. ARM is a normal service and has (except for AUTOSTART) all of the
3313options that other services do. In addition, ARM has the
3314following options:
3315
3316@table @asis
3317
3318@item GLOBAL_PREFIX Command to be pre-pended to all services that are
3319going to run.
3320
3321@item GLOBAL_POSTFIX Global option that will be supplied to all the
3322services that are going to run.
3323
3324@end table
3325
3326@c ***********************************************************************
3327@node ARM - Availability
3328@subsection ARM - Availability
3329@c %**end of header
3330
3331As mentioned before, one of the features provided by ARM is starting
3332services on demand. Consider the example of one service "client" that
3333wants to connect to another service a "server". The "client" will ask ARM
3334to run the "server". ARM starts the "server". The "server" starts
3335listening to incoming connections. The "client" will establish a
3336connection with the "server". And then, they will start to communicate
3337together.@ One problem with that scheme is that it's slow!@
3338The "client" service wants to communicate with the "server" service at
3339once and is not willing wait for it to be started and listening to
3340incoming connections before serving its request.@ One solution for that
3341problem will be that ARM starts all services as default services. That
3342solution will solve the problem, yet, it's not quite practical, for some
3343services that are going to be started can never be used or are going to
3344be used after a relatively long time.@
3345The approach followed by ARM to solve this problem is as follows:
3346
3347@itemize @bullet
3348
3349@item For each service having a PORT field in the configuration file and
3350that is not one of the default services ( a service that accepts incoming
3351connections from clients), ARM creates listening sockets for all addresses
3352associated with that service.
3353
3354@item The "client" will immediately establish a connection with
3355the "server".
3356
3357@item ARM --- pretending to be the "server" --- will listen on the
3358respective port and notice the incoming connection from the "client"
3359(but not accept it), instead
3360
3361@item Once there is an incoming connection, ARM will start the "server",
3362passing on the listen sockets (now, the service is started and can do its
3363work).
3364
3365@item Other client services now can directly connect directly to the
3366"server".
3367
3368@end itemize
3369
3370@c ***********************************************************************
3371@node Reliability
3372@subsection Reliability
3373
3374One of the features provided by ARM, is the automatic restart of crashed
3375services.@ ARM needs to know which of the running services died. Function
3376"gnunet-service-arm.c/maint_child_death()" is responsible for that. The
3377function is scheduled to run upon receiving a SIGCHLD signal. The
3378function, then, iterates ARM's list of services running and monitors
3379which service has died (crashed). For all crashing services, ARM restarts
3380them.@
3381Now, considering the case of a service having a serious problem causing it
3382to crash each time it's started by ARM. If ARM keeps blindly restarting
3383such a service, we are going to have the pattern:
3384start-crash-restart-crash-restart-crash and so forth!! Which is of course
3385not practical.@
3386For that reason, ARM schedules the service to be restarted after waiting
3387for some delay that grows exponentially with each crash/restart of that
3388service.@ To clarify the idea, considering the following example:
3389
3390@itemize @bullet
3391
3392@item Service S crashed.
3393
3394@item ARM receives the SIGCHLD and inspects its list of services to find
3395the dead one(s).
3396
3397@item ARM finds S dead and schedules it for restarting after "backoff"
3398time which is initially set to 1ms. ARM will double the backoff time
3399correspondent to S (now backoff(S) = 2ms)
3400
3401@item Because there is a severe problem with S, it crashed again.
3402
3403@item Again ARM receives the SIGCHLD and detects that it's S again that's
3404crashed. ARM schedules it for restarting but after its new backoff time
3405(which became 2ms), and doubles its backoff time (now backoff(S) = 4).
3406
3407@item and so on, until backoff(S) reaches a certain threshold
3408(@code{EXPONENTIAL_BACKOFF_THRESHOLD} is set to half an hour),
3409after reaching it, backoff(S) will remain half an hour,
3410hence ARM won't be busy for a lot of time trying to restart a
3411problematic service.
3412@end itemize
3413
3414@cindex TRANSPORT Subsystem
3415@node TRANSPORT Subsystem
3416@section TRANSPORT Subsystem
3417@c %**end of header
3418
3419This chapter documents how the GNUnet transport subsystem works. The
3420GNUnet transport subsystem consists of three main components: the
3421transport API (the interface used by the rest of the system to access the
3422transport service), the transport service itself (most of the interesting
3423functions, such as choosing transports, happens here) and the transport
3424plugins. A transport plugin is a concrete implementation for how two
3425GNUnet peers communicate; many plugins exist, for example for
3426communication via TCP, UDP, HTTP, HTTPS and others. Finally, the
3427transport subsystem uses supporting code, especially the NAT/UPnP
3428library to help with tasks such as NAT traversal.
3429
3430Key tasks of the transport service include:
3431
3432@itemize @bullet
3433
3434@item Create our HELLO message, notify clients and neighbours if our HELLO
3435changes (using NAT library as necessary)
3436
3437@item Validate HELLOs from other peers (send PING), allow other peers to
3438validate our HELLO's addresses (send PONG)
3439
3440@item Upon request, establish connections to other peers (using address
3441selection from ATS subsystem) and maintain them (again using PINGs and
3442PONGs) as long as desired
3443
3444@item Accept incoming connections, give ATS service the opportunity to
3445switch communication channels
3446
3447@item Notify clients about peers that have connected to us or that have
3448been disconnected from us
3449
3450@item If a (stateful) connection goes down unexpectedly (without explicit
3451DISCONNECT), quickly attempt to recover (without notifying clients) but do
3452notify clients quickly if reconnecting fails
3453
3454@item Send (payload) messages arriving from clients to other peers via
3455transport plugins and receive messages from other peers, forwarding
3456those to clients
3457
3458@item Enforce inbound traffic limits (using flow-control if it is
3459applicable); outbound traffic limits are enforced by CORE, not by us (!)
3460
3461@item Enforce restrictions on P2P connection as specified by the blacklist
3462configuration and blacklisting clients
3463@end itemize
3464
3465Note that the term "clients" in the list above really refers to the
3466GNUnet-CORE service, as CORE is typically the only client of the
3467transport service.
3468
3469@menu
3470* Address validation protocol::
3471@end menu
3472
3473@node Address validation protocol
3474@subsection Address validation protocol
3475@c %**end of header
3476
3477This section documents how the GNUnet transport service validates
3478connections with other peers. It is a high-level description of the
3479protocol necessary to understand the details of the implementation. It
3480should be noted that when we talk about PING and PONG messages in this
3481section, we refer to transport-level PING and PONG messages, which are
3482different from core-level PING and PONG messages (both in implementation
3483and function).
3484
3485The goal of transport-level address validation is to minimize the chances
3486of a successful man-in-the-middle attack against GNUnet peers on the
3487transport level. Such an attack would not allow the adversary to decrypt
3488the P2P transmissions, but a successful attacker could at least measure
3489traffic volumes and latencies (raising the adversaries capablities by
3490those of a global passive adversary in the worst case). The scenarios we
3491are concerned about is an attacker, Mallory, giving a @code{HELLO} to
3492Alice that claims to be for Bob, but contains Mallory's IP address
3493instead of Bobs (for some transport).
3494Mallory would then forward the traffic to Bob (by initiating a
3495connection to Bob and claiming to be Alice). As a further
3496complication, the scheme has to work even if say Alice is behind a NAT
3497without traversal support and hence has no address of her own (and thus
3498Alice must always initiate the connection to Bob).
3499
3500An additional constraint is that @code{HELLO} messages do not contain a
3501cryptographic signature since other peers must be able to edit
3502(i.e. remove) addresses from the @code{HELLO} at any time (this was
3503not true in GNUnet 0.8.x). A basic @strong{assumption} is that each peer
3504knows the set of possible network addresses that it @strong{might}
3505be reachable under (so for example, the external IP address of the
3506NAT plus the LAN address(es) with the respective ports).
3507
3508The solution is the following. If Alice wants to validate that a given
3509address for Bob is valid (i.e. is actually established @strong{directly}
3510with the intended target), she sends a PING message over that connection
3511to Bob. Note that in this case, Alice initiated the connection so only
3512Alice knows which address was used for sure (Alice may be behind NAT, so
3513whatever address Bob sees may not be an address Alice knows she has).
3514Bob checks that the address given in the @code{PING} is actually one
3515of Bob's addresses (ie: does not belong to Mallory), and if it is,
3516sends back a @code{PONG} (with a signature that says that Bob
3517owns/uses the address from the @code{PING}).
3518Alice checks the signature and is happy if it is valid and the address
3519in the @code{PONG} is the address Alice used.
3520This is similar to the 0.8.x protocol where the @code{HELLO} contained a
3521signature from Bob for each address used by Bob.
3522Here, the purpose code for the signature is
3523@code{GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN}. After this, Alice will
3524remember Bob's address and consider the address valid for a while (12h in
3525the current implementation). Note that after this exchange, Alice only
3526considers Bob's address to be valid, the connection itself is not
3527considered 'established'. In particular, Alice may have many addresses
3528for Bob that Alice considers valid.
3529
3530@c TODO: reference Footnotes so that I don't have to duplicate the
3531@c footnotes or add them to an index at the end. Is this possible at
3532@c all in Texinfo?
3533The @code{PONG} message is protected with a nonce/challenge against replay
3534attacks@footnote{@uref{http://en.wikipedia.org/wiki/Replay_attack, replay}}
3535and uses an expiration time for the signature (but those are almost
3536implementation details).
3537
3538@cindex NAT library
3539@node NAT library
3540@section NAT library
3541@c %**end of header
3542
3543The goal of the GNUnet NAT library is to provide a general-purpose API for
3544NAT traversal @strong{without} third-party support. So protocols that
3545involve contacting a third peer to help establish a connection between
3546two peers are outside of the scope of this API. That does not mean that
3547GNUnet doesn't support involving a third peer (we can do this with the
3548distance-vector transport or using application-level protocols), it just
3549means that the NAT API is not concerned with this possibility. The API is
3550written so that it will work for IPv6-NAT in the future as well as
3551current IPv4-NAT. Furthermore, the NAT API is always used, even for peers
3552that are not behind NAT --- in that case, the mapping provided is simply
3553the identity.
3554
3555NAT traversal is initiated by calling @code{GNUNET_NAT_register}. Given a
3556set of addresses that the peer has locally bound to (TCP or UDP), the NAT
3557library will return (via callback) a (possibly longer) list of addresses
3558the peer @strong{might} be reachable under. Internally, depending on the
3559configuration, the NAT library will try to punch a hole (using UPnP) or
3560just "know" that the NAT was manually punched and generate the respective
3561external IP address (the one that should be globally visible) based on
3562the given information.
3563
3564The NAT library also supports ICMP-based NAT traversal. Here, the other
3565peer can request connection-reversal by this peer (in this special case,
3566the peer is even allowed to configure a port number of zero). If the NAT
3567library detects a connection-reversal request, it returns the respective
3568target address to the client as well. It should be noted that
3569connection-reversal is currently only intended for TCP, so other plugins
3570@strong{must} pass @code{NULL} for the reversal callback. Naturally, the
3571NAT library also supports requesting connection reversal from a remote
3572peer (@code{GNUNET_NAT_run_client}).
3573
3574Once initialized, the NAT handle can be used to test if a given address is
3575possibly a valid address for this peer (@code{GNUNET_NAT_test_address}).
3576This is used for validating our addresses when generating PONGs.
3577
3578Finally, the NAT library contains an API to test if our NAT configuration
3579is correct. Using @code{GNUNET_NAT_test_start} @strong{before} binding to
3580the respective port, the NAT library can be used to test if the
3581configuration works. The test function act as a local client, initialize
3582the NAT traversal and then contact a @code{gnunet-nat-server} (running by
3583default on @code{gnunet.org}) and ask for a connection to be established.
3584This way, it is easy to test if the current NAT configuration is valid.
3585
3586@node Distance-Vector plugin
3587@section Distance-Vector plugin
3588@c %**end of header
3589
3590The Distance Vector (DV) transport is a transport mechanism that allows
3591peers to act as relays for each other, thereby connecting peers that would
3592otherwise be unable to connect. This gives a larger connection set to
3593applications that may work better with more peers to choose from (for
3594example, File Sharing and/or DHT).
3595
3596The Distance Vector transport essentially has two functions. The first is
3597"gossiping" connection information about more distant peers to directly
3598connected peers. The second is taking messages intended for non-directly
3599connected peers and encapsulating them in a DV wrapper that contains the
3600required information for routing the message through forwarding peers. Via
3601gossiping, optimal routes through the known DV neighborhood are discovered
3602and utilized and the message encapsulation provides some benefits in
3603addition to simply getting the message from the correct source to the
3604proper destination.
3605
3606The gossiping function of DV provides an up to date routing table of
3607peers that are available up to some number of hops. We call this a
3608fisheye view of the network (like a fish, nearby objects are known while
3609more distant ones unknown). Gossip messages are sent only to directly
3610connected peers, but they are sent about other knowns peers within the
3611"fisheye distance". Whenever two peers connect, they immediately gossip
3612to each other about their appropriate other neighbors. They also gossip
3613about the newly connected peer to previously
3614connected neighbors. In order to keep the routing tables up to date,
3615disconnect notifications are propogated as gossip as well (because
3616disconnects may not be sent/received, timeouts are also used remove
3617stagnant routing table entries).
3618
3619Routing of messages via DV is straightforward. When the DV transport is
3620notified of a message destined for a non-direct neighbor, the appropriate
3621forwarding peer is selected, and the base message is encapsulated in a DV
3622message which contains information about the initial peer and the intended
3623recipient. At each forwarding hop, the initial peer is validated (the
3624forwarding peer ensures that it has the initial peer in its neighborhood,
3625otherwise the message is dropped). Next the base message is
3626re-encapsulated in a new DV message for the next hop in the forwarding
3627chain (or delivered to the current peer, if it has arrived at the
3628destination).
3629
3630Assume a three peer network with peers Alice, Bob and Carol. Assume that
3631
3632@example
3633Alice <-> Bob and Bob <-> Carol
3634@end example
3635
3636@noindent
3637are direct (e.g. over TCP or UDP transports) connections, but that
3638Alice cannot directly connect to Carol.
3639This may be the case due to NAT or firewall restrictions, or perhaps
3640based on one of the peers respective configurations. If the Distance
3641Vector transport is enabled on all three peers, it will automatically
3642discover (from the gossip protocol) that Alice and Carol can connect via
3643Bob and provide a "virtual" Alice <-> Carol connection. Routing between
3644Alice and Carol happens as follows; Alice creates a message destined for
3645Carol and notifies the DV transport about it. The DV transport at Alice
3646looks up Carol in the routing table and finds that the message must be
3647sent through Bob for Carol. The message is encapsulated setting Alice as
3648the initiator and Carol as the destination and sent to Bob. Bob receives
3649the messages, verifies that both Alice and Carol are known to Bob, and
3650re-wraps the message in a new DV message for Carol.
3651The DV transport at Carol receives this message, unwraps the original
3652message, and delivers it to Carol as though it came directly from Alice.
3653
3654@cindex SMTP plugin
3655@node SMTP plugin
3656@section SMTP plugin
3657@c %**end of header
3658
3659This section describes the new SMTP transport plugin for GNUnet as it
3660exists in the 0.7.x and 0.8.x branch. SMTP support is currently not
3661available in GNUnet 0.9.x. This page also describes the transport layer
3662abstraction (as it existed in 0.7.x and 0.8.x) in more detail and gives
3663some benchmarking results. The performance results presented are quite
3664old and maybe outdated at this point.
3665
3666@itemize @bullet
3667@item Why use SMTP for a peer-to-peer transport?
3668@item SMTPHow does it work?
3669@item How do I configure my peer?
3670@item How do I test if it works?
3671@item How fast is it?
3672@item Is there any additional documentation?
3673@end itemize
3674
3675
3676@menu
3677* Why use SMTP for a peer-to-peer transport?::
3678* How does it work?::
3679* How do I configure my peer?::
3680* How do I test if it works?::
3681* How fast is it?::
3682@end menu
3683
3684@node Why use SMTP for a peer-to-peer transport?
3685@subsection Why use SMTP for a peer-to-peer transport?
3686@c %**end of header
3687
3688There are many reasons why one would not want to use SMTP:
3689
3690@itemize @bullet
3691@item SMTP is using more bandwidth than TCP, UDP or HTTP
3692@item SMTP has a much higher latency.
3693@item SMTP requires significantly more computation (encoding and decoding
3694time) for the peers.
3695@item SMTP is significantly more complicated to configure.
3696@item SMTP may be abused by tricking GNUnet into sending mail to@
3697non-participating third parties.
3698@end itemize
3699
3700So why would anybody want to use SMTP?
3701@itemize @bullet
3702@item SMTP can be used to contact peers behind NAT boxes (in virtual
3703private networks).
3704@item SMTP can be used to circumvent policies that limit or prohibit
3705peer-to-peer traffic by masking as "legitimate" traffic.
3706@item SMTP uses E-mail addresses which are independent of a specific IP,
3707which can be useful to address peers that use dynamic IP addresses.
3708@item SMTP can be used to initiate a connection (e.g. initial address
3709exchange) and peers can then negotiate the use of a more efficient
3710protocol (e.g. TCP) for the actual communication.
3711@end itemize
3712
3713In summary, SMTP can for example be used to send a message to a peer
3714behind a NAT box that has a dynamic IP to tell the peer to establish a
3715TCP connection to a peer outside of the private network. Even an
3716extraordinary overhead for this first message would be irrelevant in this
3717type of situation.
3718
3719@node How does it work?
3720@subsection How does it work?
3721@c %**end of header
3722
3723When a GNUnet peer needs to send a message to another GNUnet peer that has
3724advertised (only) an SMTP transport address, GNUnet base64-encodes the
3725message and sends it in an E-mail to the advertised address. The
3726advertisement contains a filter which is placed in the E-mail header,
3727such that the receiving host can filter the tagged E-mails and forward it
3728to the GNUnet peer process. The filter can be specified individually by
3729each peer and be changed over time. This makes it impossible to censor
3730GNUnet E-mail messages by searching for a generic filter.
3731
3732@node How do I configure my peer?
3733@subsection How do I configure my peer?
3734@c %**end of header
3735
3736First, you need to configure @code{procmail} to filter your inbound E-mail
3737for GNUnet traffic. The GNUnet messages must be delivered into a pipe, for
3738example @code{/tmp/gnunet.smtp}. You also need to define a filter that is
3739used by @command{procmail} to detect GNUnet messages. You are free to
3740choose whichever filter you like, but you should make sure that it does
3741not occur in your other E-mail. In our example, we will use
3742@code{X-mailer: GNUnet}. The @code{~/.procmailrc} configuration file then
3743looks like this:
3744
3745@example
3746:0:
3747* ^X-mailer: GNUnet
3748/tmp/gnunet.smtp
3749# where do you want your other e-mail delivered to
3750# (default: /var/spool/mail/)
3751:0: /var/spool/mail/
3752@end example
3753
3754After adding this file, first make sure that your regular E-mail still
3755works (e.g. by sending an E-mail to yourself). Then edit the GNUnet
3756configuration. In the section @code{SMTP} you need to specify your E-mail
3757address under @code{EMAIL}, your mail server (for outgoing mail) under
3758@code{SERVER}, the filter (X-mailer: GNUnet in the example) under
3759@code{FILTER} and the name of the pipe under @code{PIPE}.@ The completed
3760section could then look like this:
3761
3762@example
3763EMAIL = me@@mail.gnu.org MTU = 65000 SERVER = mail.gnu.org:25 FILTER =
3764"X-mailer: GNUnet" PIPE = /tmp/gnunet.smtp
3765@end example
3766
3767Finally, you need to add @code{smtp} to the list of @code{TRANSPORTS} in
3768the @code{GNUNETD} section. GNUnet peers will use the E-mail address that
3769you specified to contact your peer until the advertisement times out.
3770Thus, if you are not sure if everything works properly or if you are not
3771planning to be online for a long time, you may want to configure this
3772timeout to be short, e.g. just one hour. For this, set
3773@code{HELLOEXPIRES} to @code{1} in the @code{GNUNETD} section.
3774
3775This should be it, but you may probably want to test it first.
3776
3777@node How do I test if it works?
3778@subsection How do I test if it works?
3779@c %**end of header
3780
3781Any transport can be subjected to some rudimentary tests using the
3782@code{gnunet-transport-check} tool. The tool sends a message to the local
3783node via the transport and checks that a valid message is received. While
3784this test does not involve other peers and can not check if firewalls or
3785other network obstacles prohibit proper operation, this is a great
3786testcase for the SMTP transport since it tests pretty much nearly all of
3787the functionality.
3788
3789@code{gnunet-transport-check} should only be used without running
3790@code{gnunetd} at the same time. By default, @code{gnunet-transport-check}
3791tests all transports that are specified in the configuration file. But
3792you can specifically test SMTP by giving the option
3793@code{--transport=smtp}.
3794
3795Note that this test always checks if a transport can receive and send.
3796While you can configure most transports to only receive or only send
3797messages, this test will only work if you have configured the transport
3798to send and receive messages.
3799
3800@node How fast is it?
3801@subsection How fast is it?
3802@c %**end of header
3803
3804We have measured the performance of the UDP, TCP and SMTP transport layer
3805directly and when used from an application using the GNUnet core.
3806Measureing just the transport layer gives the better view of the actual
3807overhead of the protocol, whereas evaluating the transport from the
3808application puts the overhead into perspective from a practical point of
3809view.
3810
3811The loopback measurements of the SMTP transport were performed on three
3812different machines spanning a range of modern SMTP configurations. We
3813used a PIII-800 running RedHat 7.3 with the Purdue Computer Science
3814configuration which includes filters for spam. We also used a Xenon 2 GHZ
3815with a vanilla RedHat 8.0 sendmail configuration. Furthermore, we used
3816qmail on a PIII-1000 running Sorcerer GNU Linux (SGL). The numbers for
3817UDP and TCP are provided using the SGL configuration. The qmail benchmark
3818uses qmail's internal filtering whereas the sendmail benchmarks relies on
3819procmail to filter and deliver the mail. We used the transport layer to
3820send a message of b bytes (excluding transport protocol headers) directly
3821to the local machine. This way, network latency and packet loss on the
3822wire have no impact on the timings. n messages were sent sequentially over
3823the transport layer, sending message i+1 after the i-th message was
3824received. All messages were sent over the same connection and the time to
3825establish the connection was not taken into account since this overhead is
3826miniscule in practice --- as long as a connection is used for a
3827significant number of messages.
3828
3829@multitable @columnfractions .20 .15 .15 .15 .15 .15
3830@headitem Transport @tab UDP @tab TCP @tab SMTP (Purdue sendmail)
3831@tab SMTP (RH 8.0) @tab SMTP (SGL qmail)
3832@item 11 bytes @tab 31 ms @tab 55 ms @tab 781 s @tab 77 s @tab 24 s
3833@item 407 bytes @tab 37 ms @tab 62 ms @tab 789 s @tab 78 s @tab 25 s
3834@item 1,221 bytes @tab 46 ms @tab 73 ms @tab 804 s @tab 78 s @tab 25 s
3835@end multitable
3836
3837The benchmarks show that UDP and TCP are, as expected, both significantly
3838faster compared with any of the SMTP services. Among the SMTP
3839implementations, there can be significant differences depending on the
3840SMTP configuration. Filtering with an external tool like procmail that
3841needs to re-parse its configuration for each mail can be very expensive.
3842Applying spam filters can also significantly impact the performance of
3843the underlying SMTP implementation. The microbenchmark shows that SMTP
3844can be a viable solution for initiating peer-to-peer sessions: a couple of
3845seconds to connect to a peer are probably not even going to be noticed by
3846users. The next benchmark measures the possible throughput for a
3847transport. Throughput can be measured by sending multiple messages in
3848parallel and measuring packet loss. Note that not only UDP but also the
3849TCP transport can actually loose messages since the TCP implementation
3850drops messages if the @code{write} to the socket would block. While the
3851SMTP protocol never drops messages itself, it is often so
3852slow that only a fraction of the messages can be sent and received in the
3853given time-bounds. For this benchmark we report the message loss after
3854allowing t time for sending m messages. If messages were not sent (or
3855received) after an overall timeout of t, they were considered lost. The
3856benchmark was performed using two Xeon 2 GHZ machines running RedHat 8.0
3857with sendmail. The machines were connected with a direct 100 MBit ethernet
3858connection.@ Figures udp1200, tcp1200 and smtp-MTUs show that the
3859throughput for messages of size 1,200 octects is 2,343 kbps, 3,310 kbps
3860and 6 kbps for UDP, TCP and SMTP respectively. The high per-message
3861overhead of SMTP can be improved by increasing the MTU, for example, an
3862MTU of 12,000 octets improves the throughput to 13 kbps as figure
3863smtp-MTUs shows. Our research paper) has some more details on the
3864benchmarking results.
3865
3866@cindex Bluetooth plugin
3867@node Bluetooth plugin
3868@section Bluetooth plugin
3869@c %**end of header
3870
3871This page describes the new Bluetooth transport plugin for GNUnet. The
3872plugin is still in the testing stage so don't expect it to work
3873perfectly. If you have any questions or problems just post them here or
3874ask on the IRC channel.
3875
3876@itemize @bullet
3877@item What do I need to use the Bluetooth plugin transport?
3878@item BluetoothHow does it work?
3879@item What possible errors should I be aware of?
3880@item How do I configure my peer?
3881@item How can I test it?
3882@end itemize
3883
3884@menu
3885* What do I need to use the Bluetooth plugin transport?::
3886* How does it work2?::
3887* What possible errors should I be aware of?::
3888* How do I configure my peer2?::
3889* How can I test it?::
3890* The implementation of the Bluetooth transport plugin::
3891@end menu
3892
3893@node What do I need to use the Bluetooth plugin transport?
3894@subsection What do I need to use the Bluetooth plugin transport?
3895@c %**end of header
3896
3897If you are a GNU/Linux user and you want to use the Bluetooth
3898transport plugin you should install the
3899@command{BlueZ development libraries} (if they aren't already
3900installed).
3901For instructions about how to install the libraries you should
3902check out the BlueZ site
3903(@uref{http://www.bluez.org/, http://www.bluez.org}). If you don't know if
3904you have the necesarry libraries, don't worry, just run the GNUnet
3905configure script and you will be able to see a notification at the end
3906which will warn you if you don't have the necessary libraries.
3907
3908If you are a Windows user you should have installed the
3909@emph{MinGW}/@emph{MSys2} with the latest updates (especially the
3910@emph{ws2bth} header). If this is your first build of GNUnet on Windows
3911you should check out the SBuild repository. It will semi-automatically
3912assembles a @emph{MinGW}/@emph{MSys2} installation with a lot of extra
3913packages which are needed for the GNUnet build. So this will ease your
3914work!@ Finally you just have to be sure that you have the correct drivers
3915for your Bluetooth device installed and that your device is on and in a
3916discoverable mode. The Windows Bluetooth Stack supports only the RFCOMM
3917protocol so we cannot turn on your device programatically!
3918
3919@c FIXME: Change to unique title
3920@node How does it work2?
3921@subsection How does it work2?
3922@c %**end of header
3923
3924The Bluetooth transport plugin uses virtually the same code as the WLAN
3925plugin and only the helper binary is different. The helper takes a single
3926argument, which represents the interface name and is specified in the
3927configuration file. Here are the basic steps that are followed by the
3928helper binary used on GNU/Linux:
3929
3930@itemize @bullet
3931@item it verifies if the name corresponds to a Bluetooth interface name
3932@item it verifies if the iterface is up (if it is not, it tries to bring
3933it up)
3934@item it tries to enable the page and inquiry scan in order to make the
3935device discoverable and to accept incoming connection requests
3936@emph{The above operations require root access so you should start the
3937transport plugin with root privileges.}
3938@item it finds an available port number and registers a SDP service which
3939will be used to find out on which port number is the server listening on
3940and switch the socket in listening mode
3941@item it sends a HELLO message with its address
3942@item finally it forwards traffic from the reading sockets to the STDOUT
3943and from the STDIN to the writing socket
3944@end itemize
3945
3946Once in a while the device will make an inquiry scan to discover the
3947nearby devices and it will send them randomly HELLO messages for peer
3948discovery.
3949
3950@node What possible errors should I be aware of?
3951@subsection What possible errors should I be aware of?
3952@c %**end of header
3953
3954@emph{This section is dedicated for GNU/Linux users}
3955
3956Well there are many ways in which things could go wrong but I will try to
3957present some tools that you could use to debug and some scenarios.
3958
3959@itemize @bullet
3960
3961@item @code{bluetoothd -n -d} : use this command to enable logging in the
3962foreground and to print the logging messages
3963
3964@item @code{hciconfig}: can be used to configure the Bluetooth devices.
3965If you run it without any arguments it will print information about the
3966state of the interfaces. So if you receive an error that the device
3967couldn't be brought up you should try to bring it manually and to see if
3968it works (use @code{hciconfig -a hciX up}). If you can't and the
3969Bluetooth address has the form 00:00:00:00:00:00 it means that there is
3970something wrong with the D-Bus daemon or with the Bluetooth daemon. Use
3971@code{bluetoothd} tool to see the logs
3972
3973@item @code{sdptool} can be used to control and interogate SDP servers.
3974If you encounter problems regarding the SDP server (like the SDP server is
3975down) you should check out if the D-Bus daemon is running correctly and to
3976see if the Bluetooth daemon started correctly(use @code{bluetoothd} tool).
3977Also, sometimes the SDP service could work but somehow the device couldn't
3978register his service. Use @code{sdptool browse [dev-address]} to see if
3979the service is registered. There should be a service with the name of the
3980interface and GNUnet as provider.
3981
3982@item @code{hcitool} : another useful tool which can be used to configure
3983the device and to send some particular commands to it.
3984
3985@item @code{hcidump} : could be used for low level debugging
3986@end itemize
3987
3988@c FIXME: A more unique name
3989@node How do I configure my peer2?
3990@subsection How do I configure my peer2?
3991@c %**end of header
3992
3993On GNU/Linux, you just have to be sure that the interface name
3994corresponds to the one that you want to use.
3995Use the @code{hciconfig} tool to check that.
3996By default it is set to hci0 but you can change it.
3997
3998A basic configuration looks like this:
3999
4000@example
4001[transport-bluetooth]
4002# Name of the interface (typically hciX)
4003INTERFACE = hci0
4004# Real hardware, no testing
4005TESTMODE = 0 TESTING_IGNORE_KEYS = ACCEPT_FROM;
4006@end example
4007
4008In order to use the Bluetooth transport plugin when the transport service
4009is started, you must add the plugin name to the default transport service
4010plugins list. For example:
4011
4012@example
4013[transport] ... PLUGINS = dns bluetooth ...
4014@end example
4015
4016If you want to use only the Bluetooth plugin set
4017@emph{PLUGINS = bluetooth}
4018
4019On Windows, you cannot specify which device to use. The only thing that
4020you should do is to add @emph{bluetooth} on the plugins list of the
4021transport service.
4022
4023@node How can I test it?
4024@subsection How can I test it?
4025@c %**end of header
4026
4027If you have two Bluetooth devices on the same machine and you are using
4028GNU/Linux you must:
4029
4030@itemize @bullet
4031
4032@item create two different file configuration (one which will use the
4033first interface (@emph{hci0}) and the other which will use the second
4034interface (@emph{hci1})). Let's name them @emph{peer1.conf} and
4035@emph{peer2.conf}.
4036
4037@item run @emph{gnunet-peerinfo -c peerX.conf -s} in order to generate the
4038peers private keys. The @strong{X} must be replace with 1 or 2.
4039
4040@item run @emph{gnunet-arm -c peerX.conf -s -i=transport} in order to
4041start the transport service. (Make sure that you have "bluetooth" on the
4042transport plugins list if the Bluetooth transport service doesn't start.)
4043
4044@item run @emph{gnunet-peerinfo -c peer1.conf -s} to get the first peer's
4045ID. If you already know your peer ID (you saved it from the first
4046command), this can be skipped.
4047
4048@item run @emph{gnunet-transport -c peer2.conf -p=PEER1_ID -s} to start
4049sending data for benchmarking to the other peer.
4050
4051@end itemize
4052
4053
4054This scenario will try to connect the second peer to the first one and
4055then start sending data for benchmarking.
4056
4057On Windows you cannot test the plugin functionality using two Bluetooth
4058devices from the same machine because after you install the drivers there
4059will occur some conflicts between the Bluetooth stacks. (At least that is
4060what happend on my machine : I wasn't able to use the Bluesoleil stack and
4061the WINDCOMM one in the same time).
4062
4063If you have two different machines and your configuration files are good
4064you can use the same scenario presented on the begining of this section.
4065
4066Another way to test the plugin functionality is to create your own
4067application which will use the GNUnet framework with the Bluetooth
4068transport service.
4069
4070@node The implementation of the Bluetooth transport plugin
4071@subsection The implementation of the Bluetooth transport plugin
4072@c %**end of header
4073
4074This page describes the implementation of the Bluetooth transport plugin.
4075
4076First I want to remind you that the Bluetooth transport plugin uses
4077virtually the same code as the WLAN plugin and only the helper binary is
4078different. Also the scope of the helper binary from the Bluetooth
4079transport plugin is the same as the one used for the wlan transport
4080plugin: it acceses the interface and then it forwards traffic in both
4081directions between the Bluetooth interface and stdin/stdout of the
4082process involved.
4083
4084The Bluetooth plugin transport could be used both on GNU/Linux and Windows
4085platforms.
4086
4087@itemize @bullet
4088@item Linux functionality
4089@item Windows functionality
4090@item Pending Features
4091@end itemize
4092
4093
4094
4095@menu
4096* Linux functionality::
4097* THE INITIALIZATION::
4098* THE LOOP::
4099* Details about the broadcast implementation::
4100* Windows functionality::
4101* Pending features::
4102@end menu
4103
4104@node Linux functionality
4105@subsubsection Linux functionality
4106@c %**end of header
4107
4108In order to implement the plugin functionality on GNU/Linux I
4109used the BlueZ stack.
4110For the communication with the other devices I used the RFCOMM
4111protocol. Also I used the HCI protocol to gain some control over the
4112device. The helper binary takes a single argument (the name of the
4113Bluetooth interface) and is separated in two stages:
4114
4115@c %** 'THE INITIALIZATION' should be in bigger letters or stand out, not
4116@c %** starting a new section?
4117@node THE INITIALIZATION
4118@subsubsection THE INITIALIZATION
4119
4120@itemize @bullet
4121@item first, it checks if we have root privilegies
4122(@emph{Remember that we need to have root privilegies in order to be able
4123to bring the interface up if it is down or to change its state.}).
4124
4125@item second, it verifies if the interface with the given name exists.
4126
4127@strong{If the interface with that name exists and it is a Bluetooth
4128interface:}
4129
4130@item it creates a RFCOMM socket which will be used for listening and call
4131the @emph{open_device} method
4132
4133On the @emph{open_device} method:
4134@itemize @bullet
4135@item creates a HCI socket used to send control events to the the device
4136@item searches for the device ID using the interface name
4137@item saves the device MAC address
4138@item checks if the interface is down and tries to bring it UP
4139@item checks if the interface is in discoverable mode and tries to make it
4140discoverable
4141@item closes the HCI socket and binds the RFCOMM one
4142@item switches the RFCOMM socket in listening mode
4143@item registers the SDP service (the service will be used by the other
4144devices to get the port on which this device is listening on)
4145@end itemize
4146
4147@item drops the root privilegies
4148
4149@strong{If the interface is not a Bluetooth interface the helper exits
4150with a suitable error}
4151@end itemize
4152
4153@c %** Same as for @node entry above
4154@node THE LOOP
4155@subsubsection THE LOOP
4156
4157The helper binary uses a list where it saves all the connected neighbour
4158devices (@emph{neighbours.devices}) and two buffers (@emph{write_pout} and
4159@emph{write_std}). The first message which is send is a control message
4160with the device's MAC address in order to announce the peer presence to
4161the neighbours. Here are a short description of what happens in the main
4162loop:
4163
4164@itemize @bullet
4165@item Every time when it receives something from the STDIN it processes
4166the data and saves the message in the first buffer (@emph{write_pout}).
4167When it has something in the buffer, it gets the destination address from
4168the buffer, searches the destination address in the list (if there is no
4169connection with that device, it creates a new one and saves it to the
4170list) and sends the message.
4171@item Every time when it receives something on the listening socket it
4172accepts the connection and saves the socket on a list with the reading
4173sockets. @item Every time when it receives something from a reading
4174socket it parses the message, verifies the CRC and saves it in the
4175@emph{write_std} buffer in order to be sent later to the STDOUT.
4176@end itemize
4177
4178So in the main loop we use the select function to wait until one of the
4179file descriptor saved in one of the two file descriptors sets used is
4180ready to use. The first set (@emph{rfds}) represents the reading set and
4181it could contain the list with the reading sockets, the STDIN file
4182descriptor or the listening socket. The second set (@emph{wfds}) is the
4183writing set and it could contain the sending socket or the STDOUT file
4184descriptor. After the select function returns, we check which file
4185descriptor is ready to use and we do what is supposed to do on that kind
4186of event. @emph{For example:} if it is the listening socket then we
4187accept a new connection and save the socket in the reading list; if it is
4188the STDOUT file descriptor, then we write to STDOUT the message from the
4189@emph{write_std} buffer.
4190
4191To find out on which port a device is listening on we connect to the local
4192SDP server and searche the registered service for that device.
4193
4194@emph{You should be aware of the fact that if the device fails to connect
4195to another one when trying to send a message it will attempt one more
4196time. If it fails again, then it skips the message.}
4197@emph{Also you should know that the transport Bluetooth plugin has
4198support for @strong{broadcast messages}.}
4199
4200@node Details about the broadcast implementation
4201@subsubsection Details about the broadcast implementation
4202@c %**end of header
4203
4204First I want to point out that the broadcast functionality for the CONTROL
4205messages is not implemented in a conventional way. Since the inquiry scan
4206time is too big and it will take some time to send a message to all the
4207discoverable devices I decided to tackle the problem in a different way.
4208Here is how I did it:
4209
4210@itemize @bullet
4211@item If it is the first time when I have to broadcast a message I make an
4212inquiry scan and save all the devices' addresses to a vector.
4213@item After the inquiry scan ends I take the first address from the list
4214and I try to connect to it. If it fails, I try to connect to the next one.
4215If it succeeds, I save the socket to a list and send the message to the
4216device.
4217@item When I have to broadcast another message, first I search on the list
4218for a new device which I'm not connected to. If there is no new device on
4219the list I go to the beginning of the list and send the message to the
4220old devices. After 5 cycles I make a new inquiry scan to check out if
4221there are new discoverable devices and save them to the list. If there
4222are no new discoverable devices I reset the cycling counter and go again
4223through the old list and send messages to the devices saved in it.
4224@end itemize
4225
4226@strong{Therefore}:
4227
4228@itemize @bullet
4229@item every time when I have a broadcast message I look up on the list
4230for a new device and send the message to it
4231@item if I reached the end of the list for 5 times and I'm connected to
4232all the devices from the list I make a new inquiry scan.
4233@emph{The number of the list's cycles after an inquiry scan could be
4234increased by redefining the MAX_LOOPS variable}
4235@item when there are no new devices I send messages to the old ones.
4236@end itemize
4237
4238Doing so, the broadcast control messages will reach the devices but with
4239delay.
4240
4241@emph{NOTICE:} When I have to send a message to a certain device first I
4242check on the broadcast list to see if we are connected to that device. If
4243not we try to connect to it and in case of success we save the address and
4244the socket on the list. If we are already connected to that device we
4245simply use the socket.
4246
4247@node Windows functionality
4248@subsubsection Windows functionality
4249@c %**end of header
4250
4251For Windows I decided to use the Microsoft Bluetooth stack which has the
4252advantage of coming standard from Windows XP SP2. The main disadvantage is
4253that it only supports the RFCOMM protocol so we will not be able to have
4254a low level control over the Bluetooth device. Therefore it is the user
4255responsability to check if the device is up and in the discoverable mode.
4256Also there are no tools which could be used for debugging in order to read
4257the data coming from and going to a Bluetooth device, which obviously
4258hindered my work. Another thing that slowed down the implementation of the
4259plugin (besides that I wasn't too accomodated with the win32 API) was that
4260there were some bugs on MinGW regarding the Bluetooth. Now they are solved
4261but you should keep in mind that you should have the latest updates
4262(especially the @emph{ws2bth} header).
4263
4264Besides the fact that it uses the Windows Sockets, the Windows
4265implemenation follows the same principles as the GNU/Linux one:
4266
4267@itemize @bullet
4268@item It has a initalization part where it initializes the
4269Windows Sockets, creates a RFCOMM socket which will be binded and switched
4270to the listening mode and registers a SDP service. In the Microsoft
4271Bluetooth API there are two ways to work with the SDP:
4272@itemize @bullet
4273@item an easy way which works with very simple service records
4274@item a hard way which is useful when you need to update or to delete the
4275record
4276@end itemize
4277@end itemize
4278
4279Since I only needed the SDP service to find out on which port the device
4280is listening on and that did not change, I decided to use the easy way.
4281In order to register the service I used the @emph{WSASetService} function
4282and I generated the @emph{Universally Unique Identifier} with the
4283@emph{guidgen.exe} Windows's tool.
4284
4285In the loop section the only difference from the GNU/Linux implementation
4286is that I used the @code{GNUNET_NETWORK} library for
4287functions like @emph{accept}, @emph{bind}, @emph{connect} or
4288@emph{select}. I decided to use the
4289@code{GNUNET_NETWORK} library because I also needed to interact
4290with the STDIN and STDOUT handles and on Windows
4291the select function is only defined for sockets,
4292and it will not work for arbitrary file handles.
4293
4294Another difference between GNU/Linux and Windows implementation is that in
4295GNU/Linux, the Bluetooth address is represented in 48 bits
4296while in Windows is represented in 64 bits.
4297Therefore I had to do some changes on @emph{plugin_transport_wlan} header.
4298
4299Also, currently on Windows the Bluetooth plugin doesn't have support for
4300broadcast messages. When it receives a broadcast message it will skip it.
4301
4302@node Pending features
4303@subsubsection Pending features
4304@c %**end of header
4305
4306@itemize @bullet
4307@item Implement the broadcast functionality on Windows @emph{(currently
4308working on)}
4309@item Implement a testcase for the helper :@ @emph{The testcase
4310consists of a program which emaluates the plugin and uses the helper. It
4311will simulate connections, disconnections and data transfers.}
4312@end itemize
4313
4314If you have a new idea about a feature of the plugin or suggestions about
4315how I could improve the implementation you are welcome to comment or to
4316contact me.
4317
4318@node WLAN plugin
4319@section WLAN plugin
4320@c %**end of header
4321
4322This section documents how the wlan transport plugin works. Parts which
4323are not implemented yet or could be better implemented are described at
4324the end.
4325
4326@cindex ATS Subsystem
4327@node ATS Subsystem
4328@section ATS Subsystem
4329@c %**end of header
4330
4331ATS stands for "automatic transport selection", and the function of ATS in
4332GNUnet is to decide on which address (and thus transport plugin) should
4333be used for two peers to communicate, and what bandwidth limits should be
4334imposed on such an individual connection. To help ATS make an informed
4335decision, higher-level services inform the ATS service about their
4336requirements and the quality of the service rendered. The ATS service
4337also interacts with the transport service to be appraised of working
4338addresses and to communicate its resource allocation decisions. Finally,
4339the ATS service's operation can be observed using a monitoring API.
4340
4341The main logic of the ATS service only collects the available addresses,
4342their performance characteristics and the applications requirements, but
4343does not make the actual allocation decision. This last critical step is
4344left to an ATS plugin, as we have implemented (currently three) different
4345allocation strategies which differ significantly in their performance and
4346maturity, and it is still unclear if any particular plugin is generally
4347superior.
4348
4349@cindex CORE Subsystem
4350@node CORE Subsystem
4351@section CORE Subsystem
4352@c %**end of header
4353
4354The CORE subsystem in GNUnet is responsible for securing link-layer
4355communications between nodes in the GNUnet overlay network. CORE builds
4356on the TRANSPORT subsystem which provides for the actual, insecure,
4357unreliable link-layer communication (for example, via UDP or WLAN), and
4358then adds fundamental security to the connections:
4359
4360@itemize @bullet
4361@item confidentiality with so-called perfect forward secrecy; we use
4362ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
4363powered by Curve25519
4364@footnote{@uref{http://cr.yp.to/ecdh.html, Curve25519}} for the key
4365exchange and then use symmetric encryption, encrypting with both AES-256
4366@footnote{@uref{http://en.wikipedia.org/wiki/Rijndael, AES-256}} and
4367Twofish @footnote{@uref{http://en.wikipedia.org/wiki/Twofish, Twofish}}
4368@item @uref{http://en.wikipedia.org/wiki/Authentication, authentication}
4369is achieved by signing the ephemeral keys using Ed25519
4370@footnote{@uref{http://ed25519.cr.yp.to/, Ed25519}}, a deterministic
4371variant of ECDSA
4372@footnote{@uref{http://en.wikipedia.org/wiki/ECDSA, ECDSA}}
4373@item integrity protection (using SHA-512
4374@footnote{@uref{http://en.wikipedia.org/wiki/SHA-2, SHA-512}} to do
4375encrypt-then-MAC
4376@footnote{@uref{http://en.wikipedia.org/wiki/Authenticated_encryption, encrypt-then-MAC}})
4377@item Replay
4378@footnote{@uref{http://en.wikipedia.org/wiki/Replay_attack, replay}}
4379protection (using nonces, timestamps, challenge-response,
4380message counters and ephemeral keys)
4381@item liveness (keep-alive messages, timeout)
4382@end itemize
4383
4384@menu
4385* Limitations::
4386* When is a peer "connected"?::
4387* libgnunetcore::
4388* The CORE Client-Service Protocol::
4389* The CORE Peer-to-Peer Protocol::
4390@end menu
4391
4392@cindex core subsystem limitations
4393@node Limitations
4394@subsection Limitations
4395@c %**end of header
4396
4397CORE does not perform
4398@uref{http://en.wikipedia.org/wiki/Routing, routing}; using CORE it is
4399only possible to communicate with peers that happen to already be
4400"directly" connected with each other. CORE also does not have an
4401API to allow applications to establish such "direct" connections --- for
4402this, applications can ask TRANSPORT, but TRANSPORT might not be able to
4403establish a "direct" connection. The TOPOLOGY subsystem is responsible for
4404trying to keep a few "direct" connections open at all times. Applications
4405that need to talk to particular peers should use the CADET subsystem, as
4406it can establish arbitrary "indirect" connections.
4407
4408Because CORE does not perform routing, CORE must only be used directly by
4409applications that either perform their own routing logic (such as
4410anonymous file-sharing) or that do not require routing, for example
4411because they are based on flooding the network. CORE communication is
4412unreliable and delivery is possibly out-of-order. Applications that
4413require reliable communication should use the CADET service. Each
4414application can only queue one message per target peer with the CORE
4415service at any time; messages cannot be larger than approximately
441663 kilobytes. If messages are small, CORE may group multiple messages
4417(possibly from different applications) prior to encryption. If permitted
4418by the application (using the @uref{http://baus.net/on-tcp_cork/, cork}
4419option), CORE may delay transmissions to facilitate grouping of multiple
4420small messages. If cork is not enabled, CORE will transmit the message as
4421soon as TRANSPORT allows it (TRANSPORT is responsible for limiting
4422bandwidth and congestion control). CORE does not allow flow control;
4423applications are expected to process messages at line-speed. If flow
4424control is needed, applications should use the CADET service.
4425
4426@cindex when is a peer connected
4427@node When is a peer "connected"?
4428@subsection When is a peer "connected"?
4429@c %**end of header
4430
4431In addition to the security features mentioned above, CORE also provides
4432one additional key feature to applications using it, and that is a
4433limited form of protocol-compatibility checking. CORE distinguishes
4434between TRANSPORT-level connections (which enable communication with other
4435peers) and application-level connections. Applications using the CORE API
4436will (typically) learn about application-level connections from CORE, and
4437not about TRANSPORT-level connections. When a typical application uses
4438CORE, it will specify a set of message types
4439(from @code{gnunet_protocols.h}) that it understands. CORE will then
4440notify the application about connections it has with other peers if and
4441only if those applications registered an intersecting set of message
4442types with their CORE service. Thus, it is quite possible that CORE only
4443exposes a subset of the established direct connections to a particular
4444application --- and different applications running above CORE might see
4445different sets of connections at the same time.
4446
4447A special case are applications that do not register a handler for any
4448message type.
4449CORE assumes that these applications merely want to monitor connections
4450(or "all" messages via other callbacks) and will notify those applications
4451about all connections. This is used, for example, by the
4452@code{gnunet-core} command-line tool to display the active connections.
4453Note that it is also possible that the TRANSPORT service has more active
4454connections than the CORE service, as the CORE service first has to
4455perform a key exchange with connecting peers before exchanging information
4456about supported message types and notifying applications about the new
4457connection.
4458
4459@cindex libgnunetcore
4460@node libgnunetcore
4461@subsection libgnunetcore
4462@c %**end of header
4463
4464The CORE API (defined in @file{gnunet_core_service.h}) is the basic
4465messaging API used by P2P applications built using GNUnet. It provides
4466applications the ability to send and receive encrypted messages to the
4467peer's "directly" connected neighbours.
4468
4469As CORE connections are generally "direct" connections,@ applications must
4470not assume that they can connect to arbitrary peers this way, as "direct"
4471connections may not always be possible. Applications using CORE are
4472notified about which peers are connected. Creating new "direct"
4473connections must be done using the TRANSPORT API.
4474
4475The CORE API provides unreliable, out-of-order delivery. While the
4476implementation tries to ensure timely, in-order delivery, both message
4477losses and reordering are not detected and must be tolerated by the
4478application. Most important, the core will NOT perform retransmission if
4479messages could not be delivered.
4480
4481Note that CORE allows applications to queue one message per connected
4482peer. The rate at which each connection operates is influenced by the
4483preferences expressed by local application as well as restrictions
4484imposed by the other peer. Local applications can express their
4485preferences for particular connections using the "performance" API of the
4486ATS service.
4487
4488Applications that require more sophisticated transmission capabilities
4489such as TCP-like behavior, or if you intend to send messages to arbitrary
4490remote peers, should use the CADET API.
4491
4492The typical use of the CORE API is to connect to the CORE service using
4493@code{GNUNET_CORE_connect}, process events from the CORE service (such as
4494peers connecting, peers disconnecting and incoming messages) and send
4495messages to connected peers using
4496@code{GNUNET_CORE_notify_transmit_ready}. Note that applications must
4497cancel pending transmission requests if they receive a disconnect event
4498for a peer that had a transmission pending; furthermore, queueing more
4499than one transmission request per peer per application using the
4500service is not permitted.
4501
4502The CORE API also allows applications to monitor all communications of the
4503peer prior to encryption (for outgoing messages) or after decryption (for
4504incoming messages). This can be useful for debugging, diagnostics or to
4505establish the presence of cover traffic (for anonymity). As monitoring
4506applications are often not interested in the payload, the monitoring
4507callbacks can be configured to only provide the message headers (including
4508the message type and size) instead of copying the full data stream to the
4509monitoring client.
4510
4511The init callback of the @code{GNUNET_CORE_connect} function is called
4512with the hash of the public key of the peer. This public key is used to
4513identify the peer globally in the GNUnet network. Applications are
4514encouraged to check that the provided hash matches the hash that they are
4515using (as theoretically the application may be using a different
4516configuration file with a different private key, which would result in
4517hard to find bugs).
4518
4519As with most service APIs, the CORE API isolates applications from crashes
4520of the CORE service. If the CORE service crashes, the application will see
4521disconnect events for all existing connections. Once the connections are
4522re-established, the applications will be receive matching connect events.
4523
4524@cindex core clinet-service protocol
4525@node The CORE Client-Service Protocol
4526@subsection The CORE Client-Service Protocol
4527@c %**end of header
4528
4529This section describes the protocol between an application using the CORE
4530service (the client) and the CORE service process itself.
4531
4532
4533@menu
4534* Setup2::
4535* Notifications::
4536* Sending::
4537@end menu
4538
4539@node Setup2
4540@subsubsection Setup2
4541@c %**end of header
4542
4543When a client connects to the CORE service, it first sends a
4544@code{InitMessage} which specifies options for the connection and a set of
4545message type values which are supported by the application. The options
4546bitmask specifies which events the client would like to be notified about.
4547The options include:
4548
4549@table @asis
4550@item GNUNET_CORE_OPTION_NOTHING No notifications
4551@item GNUNET_CORE_OPTION_STATUS_CHANGE Peers connecting and disconnecting
4552@item GNUNET_CORE_OPTION_FULL_INBOUND All inbound messages (after
4553decryption) with full payload
4554@item GNUNET_CORE_OPTION_HDR_INBOUND Just the @code{MessageHeader}
4555of all inbound messages
4556@item GNUNET_CORE_OPTION_FULL_OUTBOUND All outbound
4557messages (prior to encryption) with full payload
4558@item GNUNET_CORE_OPTION_HDR_OUTBOUND Just the @code{MessageHeader} of all
4559outbound messages
4560@end table
4561
4562Typical applications will only monitor for connection status changes.
4563
4564The CORE service responds to the @code{InitMessage} with an
4565@code{InitReplyMessage} which contains the peer's identity. Afterwards,
4566both CORE and the client can send messages.
4567
4568@node Notifications
4569@subsubsection Notifications
4570@c %**end of header
4571
4572The CORE will send @code{ConnectNotifyMessage}s and
4573@code{DisconnectNotifyMessage}s whenever peers connect or disconnect from
4574the CORE (assuming their type maps overlap with the message types
4575registered by the client). When the CORE receives a message that matches
4576the set of message types specified during the @code{InitMessage} (or if
4577monitoring is enabled in for inbound messages in the options), it sends a
4578@code{NotifyTrafficMessage} with the peer identity of the sender and the
4579decrypted payload. The same message format (except with
4580@code{GNUNET_MESSAGE_TYPE_CORE_NOTIFY_OUTBOUND} for the message type) is
4581used to notify clients monitoring outbound messages; here, the peer
4582identity given is that of the receiver.
4583
4584@node Sending
4585@subsubsection Sending
4586@c %**end of header
4587
4588When a client wants to transmit a message, it first requests a
4589transmission slot by sending a @code{SendMessageRequest} which specifies
4590the priority, deadline and size of the message. Note that these values
4591may be ignored by CORE. When CORE is ready for the message, it answers
4592with a @code{SendMessageReady} response. The client can then transmit the
4593payload with a @code{SendMessage} message. Note that the actual message
4594size in the @code{SendMessage} is allowed to be smaller than the size in
4595the original request. A client may at any time send a fresh
4596@code{SendMessageRequest}, which then superceeds the previous
4597@code{SendMessageRequest}, which is then no longer valid. The client can
4598tell which @code{SendMessageRequest} the CORE service's
4599@code{SendMessageReady} message is for as all of these messages contain a
4600"unique" request ID (based on a counter incremented by the client
4601for each request).
4602
4603@cindex CORE Peer-to-Peer Protocol
4604@node The CORE Peer-to-Peer Protocol
4605@subsection The CORE Peer-to-Peer Protocol
4606@c %**end of header
4607
4608
4609@menu
4610* Creating the EphemeralKeyMessage::
4611* Establishing a connection::
4612* Encryption and Decryption::
4613* Type maps::
4614@end menu
4615
4616@cindex EphemeralKeyMessage creation
4617@node Creating the EphemeralKeyMessage
4618@subsubsection Creating the EphemeralKeyMessage
4619@c %**end of header
4620
4621When the CORE service starts, each peer creates a fresh ephemeral (ECC)
4622public-private key pair and signs the corresponding
4623@code{EphemeralKeyMessage} with its long-term key (which we usually call
4624the peer's identity; the hash of the public long term key is what results
4625in a @code{struct GNUNET_PeerIdentity} in all GNUnet APIs. The ephemeral
4626key is ONLY used for an ECDHE@footnote{@uref{http://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman, Elliptic-curve Diffie---Hellman}}
4627exchange by the CORE service to establish symmetric session keys. A peer
4628will use the same @code{EphemeralKeyMessage} for all peers for
4629@code{REKEY_FREQUENCY}, which is usually 12 hours. After that time, it
4630will create a fresh ephemeral key (forgetting the old one) and broadcast
4631the new @code{EphemeralKeyMessage} to all connected peers, resulting in
4632fresh symmetric session keys. Note that peers independently decide on
4633when to discard ephemeral keys; it is not a protocol violation to discard
4634keys more often. Ephemeral keys are also never stored to disk; restarting
4635a peer will thus always create a fresh ephemeral key. The use of ephemeral
4636keys is what provides @uref{http://en.wikipedia.org/wiki/Forward_secrecy, forward secrecy}.
4637
4638Just before transmission, the @code{EphemeralKeyMessage} is patched to
4639reflect the current sender_status, which specifies the current state of
4640the connection from the point of view of the sender. The possible values
4641are:
4642
4643@itemize @bullet
4644@item @code{KX_STATE_DOWN} Initial value, never used on the network
4645@item @code{KX_STATE_KEY_SENT} We sent our ephemeral key, do not know the
4646key of the other peer
4647@item @code{KX_STATE_KEY_RECEIVED} This peer has received a valid
4648ephemeral key of the other peer, but we are waiting for the other peer to
4649confirm it's authenticity (ability to decode) via challenge-response.
4650@item @code{KX_STATE_UP} The connection is fully up from the point of
4651view of the sender (now performing keep-alives)
4652@item @code{KX_STATE_REKEY_SENT} The sender has initiated a rekeying
4653operation; the other peer has so far failed to confirm a working
4654connection using the new ephemeral key
4655@end itemize
4656
4657@node Establishing a connection
4658@subsubsection Establishing a connection
4659@c %**end of header
4660
4661Peers begin their interaction by sending a @code{EphemeralKeyMessage} to
4662the other peer once the TRANSPORT service notifies the CORE service about
4663the connection.
4664A peer receiving an @code{EphemeralKeyMessage} with a status
4665indicating that the sender does not have the receiver's ephemeral key, the
4666receiver's @code{EphemeralKeyMessage} is sent in response.
4667Additionally, if the receiver has not yet confirmed the authenticity of
4668the sender, it also sends an (encrypted)@code{PingMessage} with a
4669challenge (and the identity of the target) to the other peer. Peers
4670receiving a @code{PingMessage} respond with an (encrypted)
4671@code{PongMessage} which includes the challenge. Peers receiving a
4672@code{PongMessage} check the challenge, and if it matches set the
4673connection to @code{KX_STATE_UP}.
4674
4675@node Encryption and Decryption
4676@subsubsection Encryption and Decryption
4677@c %**end of header
4678
4679All functions related to the key exchange and encryption/decryption of
4680messages can be found in @file{gnunet-service-core_kx.c} (except for the
4681cryptographic primitives, which are in @file{util/crypto*.c}).
4682Given the key material from ECDHE, a Key derivation function
4683@footnote{@uref{https://en.wikipedia.org/wiki/Key_derivation_function, Key derivation function}}
4684is used to derive two pairs of encryption and decryption keys for AES-256
4685and TwoFish, as well as initialization vectors and authentication keys
4686(for HMAC@footnote{@uref{https://en.wikipedia.org/wiki/HMAC, HMAC}}).
4687The HMAC is computed over the encrypted payload.
4688Encrypted messages include an iv_seed and the HMAC in the header.
4689
4690Each encrypted message in the CORE service includes a sequence number and
4691a timestamp in the encrypted payload. The CORE service remembers the
4692largest observed sequence number and a bit-mask which represents which of
4693the previous 32 sequence numbers were already used.
4694Messages with sequence numbers lower than the largest observed sequence
4695number minus 32 are discarded. Messages with a timestamp that is less
4696than @code{REKEY_TOLERANCE} off (5 minutes) are also discarded. This of
4697course means that system clocks need to be reasonably synchronized for
4698peers to be able to communicate. Additionally, as the ephemeral key
4699changes every 12 hours, a peer would not even be able to decrypt messages
4700older than 12 hours.
4701
4702@node Type maps
4703@subsubsection Type maps
4704@c %**end of header
4705
4706Once an encrypted connection has been established, peers begin to exchange
4707type maps. Type maps are used to allow the CORE service to determine which
4708(encrypted) connections should be shown to which applications. A type map
4709is an array of 65536 bits representing the different types of messages
4710understood by applications using the CORE service. Each CORE service
4711maintains this map, simply by setting the respective bit for each message
4712type supported by any of the applications using the CORE service. Note
4713that bits for message types embedded in higher-level protocols (such as
4714MESH) will not be included in these type maps.
4715
4716Typically, the type map of a peer will be sparse. Thus, the CORE service
4717attempts to compress its type map using @code{gzip}-style compression
4718("deflate") prior to transmission. However, if the compression fails to
4719compact the map, the map may also be transmitted without compression
4720(resulting in @code{GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP} or
4721@code{GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP} messages respectively).
4722Upon receiving a type map, the respective CORE service notifies
4723applications about the connection to the other peer if they support any
4724message type indicated in the type map (or no message type at all).
4725If the CORE service experience a connect or disconnect event from an
4726application, it updates its type map (setting or unsetting the respective
4727bits) and notifies its neighbours about the change.
4728The CORE services of the neighbours then in turn generate connect and
4729disconnect events for the peer that sent the type map for their respective
4730applications. As CORE messages may be lost, the CORE service confirms
4731receiving a type map by sending back a
4732@code{GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP}. If such a confirmation
4733(with the correct hash of the type map) is not received, the sender will
4734retransmit the type map (with exponential back-off).
4735
4736@cindex CADET Subsystem
4737@node CADET Subsystem
4738@section CADET Subsystem
4739
4740The CADET subsystem in GNUnet is responsible for secure end-to-end
4741communications between nodes in the GNUnet overlay network. CADET builds
4742on the CORE subsystem which provides for the link-layer communication and
4743then adds routing, forwarding and additional security to the connections.
4744CADET offers the same cryptographic services as CORE, but on an
4745end-to-end level. This is done so peers retransmitting traffic on behalf
4746of other peers cannot access the payload data.
4747
4748@itemize @bullet
4749@item CADET provides confidentiality with so-called perfect forward
4750secrecy; we use ECDHE powered by Curve25519 for the key exchange and then
4751use symmetric encryption, encrypting with both AES-256 and Twofish
4752@item authentication is achieved by signing the ephemeral keys using
4753Ed25519, a deterministic variant of ECDSA
4754@item integrity protection (using SHA-512 to do encrypt-then-MAC, although
4755only 256 bits are sent to reduce overhead)
4756@item replay protection (using nonces, timestamps, challenge-response,
4757message counters and ephemeral keys)
4758@item liveness (keep-alive messages, timeout)
4759@end itemize
4760
4761Additional to the CORE-like security benefits, CADET offers other
4762properties that make it a more universal service than CORE.
4763
4764@itemize @bullet
4765@item CADET can establish channels to arbitrary peers in GNUnet. If a
4766peer is not immediately reachable, CADET will find a path through the
4767network and ask other peers to retransmit the traffic on its behalf.
4768@item CADET offers (optional) reliability mechanisms. In a reliable
4769channel traffic is guaranteed to arrive complete, unchanged and in-order.
4770@item CADET takes care of flow and congestion control mechanisms, not
4771allowing the sender to send more traffic than the receiver or the network
4772are able to process.
4773@end itemize
4774
4775@menu
4776* libgnunetcadet::
4777@end menu
4778
4779@cindex libgnunetcadet
4780@node libgnunetcadet
4781@subsection libgnunetcadet
4782
4783
4784The CADET API (defined in @file{gnunet_cadet_service.h}) is the
4785messaging API used by P2P applications built using GNUnet.
4786It provides applications the ability to send and receive encrypted
4787messages to any peer participating in GNUnet.
4788The API is heavily base on the CORE API.
4789
4790CADET delivers messages to other peers in "channels".
4791A channel is a permanent connection defined by a destination peer
4792(identified by its public key) and a port number.
4793Internally, CADET tunnels all channels towards a destiantion peer
4794using one session key and relays the data on multiple "connections",
4795independent from the channels.
4796
4797Each channel has optional paramenters, the most important being the
4798reliability flag.
4799Should a message get lost on TRANSPORT/CORE level, if a channel is
4800created with as reliable, CADET will retransmit the lost message and
4801deliver it in order to the destination application.
4802
4803To communicate with other peers using CADET, it is necessary to first
4804connect to the service using @code{GNUNET_CADET_connect}.
4805This function takes several parameters in form of callbacks, to allow the
4806client to react to various events, like incoming channels or channels that
4807terminate, as well as specify a list of ports the client wishes to listen
4808to (at the moment it is not possible to start listening on further ports
4809once connected, but nothing prevents a client to connect several times to
4810CADET, even do one connection per listening port).
4811The function returns a handle which has to be used for any further
4812interaction with the service.
4813
4814To connect to a remote peer a client has to call the
4815@code{GNUNET_CADET_channel_create} function. The most important parameters
4816given are the remote peer's identity (it public key) and a port, which
4817specifies which application on the remote peer to connect to, similar to
4818TCP/UDP ports. CADET will then find the peer in the GNUnet network and
4819establish the proper low-level connections and do the necessary key
4820exchanges to assure and authenticated, secure and verified communication.
4821Similar to @code{GNUNET_CADET_connect},@code{GNUNET_CADET_create_channel}
4822returns a handle to interact with the created channel.
4823
4824For every message the client wants to send to the remote application,
4825@code{GNUNET_CADET_notify_transmit_ready} must be called, indicating the
4826channel on which the message should be sent and the size of the message
4827(but not the message itself!). Once CADET is ready to send the message,
4828the provided callback will fire, and the message contents are provided to
4829this callback.
4830
4831Please note the CADET does not provide an explicit notification of when a
4832channel is connected. In loosely connected networks, like big wireless
4833mesh networks, this can take several seconds, even minutes in the worst
4834case. To be alerted when a channel is online, a client can call
4835@code{GNUNET_CADET_notify_transmit_ready} immediately after
4836@code{GNUNET_CADET_create_channel}. When the callback is activated, it
4837means that the channel is online. The callback can give 0 bytes to CADET
4838if no message is to be sent, this is ok.
4839
4840If a transmission was requested but before the callback fires it is no
4841longer needed, it can be cancelled with
4842@code{GNUNET_CADET_notify_transmit_ready_cancel}, which uses the handle
4843given back by @code{GNUNET_CADET_notify_transmit_ready}.
4844As in the case of CORE, only one message can be requested at a time: a
4845client must not call @code{GNUNET_CADET_notify_transmit_ready} again until
4846the callback is called or the request is cancelled.
4847
4848When a channel is no longer needed, a client can call
4849@code{GNUNET_CADET_channel_destroy} to get rid of it.
4850Note that CADET will try to transmit all pending traffic before notifying
4851the remote peer of the destruction of the channel, including
4852retransmitting lost messages if the channel was reliable.
4853
4854Incoming channels, channels being closed by the remote peer, and traffic
4855on any incoming or outgoing channels are given to the client when CADET
4856executes the callbacks given to it at the time of
4857@code{GNUNET_CADET_connect}.
4858
4859Finally, when an application no longer wants to use CADET, it should call
4860@code{GNUNET_CADET_disconnect}, but first all channels and pending
4861transmissions must be closed (otherwise CADET will complain).
4862
4863@cindex NSE Subsystem
4864@node NSE Subsystem
4865@section NSE Subsystem
4866
4867
4868NSE stands for @dfn{Network Size Estimation}. The NSE subsystem provides
4869other subsystems and users with a rough estimate of the number of peers
4870currently participating in the GNUnet overlay.
4871The computed value is not a precise number as producing a precise number
4872in a decentralized, efficient and secure way is impossible.
4873While NSE's estimate is inherently imprecise, NSE also gives the expected
4874range. For a peer that has been running in a stable network for a
4875while, the real network size will typically (99.7% of the time) be in the
4876range of [2/3 estimate, 3/2 estimate]. We will now give an overview of the
4877algorithm used to calculate the estimate;
4878all of the details can be found in this technical report.
4879
4880@c FIXME: link to the report.
4881
4882@menu
4883* Motivation::
4884* Principle::
4885* libgnunetnse::
4886* The NSE Client-Service Protocol::
4887* The NSE Peer-to-Peer Protocol::
4888@end menu
4889
4890@node Motivation
4891@subsection Motivation
4892
4893
4894Some subsytems, like DHT, need to know the size of the GNUnet network to
4895optimize some parameters of their own protocol. The decentralized nature
4896of GNUnet makes efficient and securely counting the exact number of peers
4897infeasable. Although there are several decentralized algorithms to count
4898the number of peers in a system, so far there is none to do so securely.
4899Other protocols may allow any malicious peer to manipulate the final
4900result or to take advantage of the system to perform
4901@dfn{Denial of Service} (DoS) attacks against the network.
4902GNUnet's NSE protocol avoids these drawbacks.
4903
4904
4905
4906@menu
4907* Security::
4908@end menu
4909
4910@cindex NSE security
4911@cindex nse security
4912@node Security
4913@subsubsection Security
4914
4915
4916The NSE subsystem is designed to be resilient against these attacks.
4917It uses @uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proofs of work}
4918to prevent one peer from impersonating a large number of participants,
4919which would otherwise allow an adversary to artifically inflate the
4920estimate.
4921The DoS protection comes from the time-based nature of the protocol:
4922the estimates are calculated periodically and out-of-time traffic is
4923either ignored or stored for later retransmission by benign peers.
4924In particular, peers cannot trigger global network communication at will.
4925
4926@cindex NSE principle
4927@cindex nse principle
4928@node Principle
4929@subsection Principle
4930
4931
4932The algorithm calculates the estimate by finding the globally closest
4933peer ID to a random, time-based value.
4934
4935The idea is that the closer the ID is to the random value, the more
4936"densely packed" the ID space is, and therefore, more peers are in the
4937network.
4938
4939
4940
4941@menu
4942* Example::
4943* Algorithm::
4944* Target value::
4945* Timing::
4946* Controlled Flooding::
4947* Calculating the estimate::
4948@end menu
4949
4950@node Example
4951@subsubsection Example
4952
4953
4954Suppose all peers have IDs between 0 and 100 (our ID space), and the
4955random value is 42.
4956If the closest peer has the ID 70 we can imagine that the average
4957"distance" between peers is around 30 and therefore the are around 3
4958peers in the whole ID space. On the other hand, if the closest peer has
4959the ID 44, we can imagine that the space is rather packed with peers,
4960maybe as much as 50 of them.
4961Naturally, we could have been rather unlucky, and there is only one peer
4962and happens to have the ID 44. Thus, the current estimate is calculated
4963as the average over multiple rounds, and not just a single sample.
4964
4965@node Algorithm
4966@subsubsection Algorithm
4967
4968
4969Given that example, one can imagine that the job of the subsystem is to
4970efficiently communicate the ID of the closest peer to the target value
4971to all the other peers, who will calculate the estimate from it.
4972
4973@node Target value
4974@subsubsection Target value
4975
4976@c %**end of header
4977
4978The target value itself is generated by hashing the current time, rounded
4979down to an agreed value. If the rounding amount is 1h (default) and the
4980time is 12:34:56, the time to hash would be 12:00:00. The process is
4981repeated each rouning amount (in this example would be every hour).
4982Every repetition is called a round.
4983
4984@node Timing
4985@subsubsection Timing
4986@c %**end of header
4987
4988The NSE subsystem has some timing control to avoid everybody broadcasting
4989its ID all at one. Once each peer has the target random value, it
4990compares its own ID to the target and calculates the hypothetical size of
4991the network if that peer were to be the closest.
4992Then it compares the hypothetical size with the estimate from the previous
4993rounds. For each value there is an assiciated point in the period,
4994let's call it "broadcast time". If its own hypothetical estimate
4995is the same as the previous global estimate, its "broadcast time" will be
4996in the middle of the round. If its bigger it will be earlier and if its
4997smaller (the most likely case) it will be later. This ensures that the
4998peers closests to the target value start broadcasting their ID the first.
4999
5000@node Controlled Flooding
5001@subsubsection Controlled Flooding
5002
5003@c %**end of header
5004
5005When a peer receives a value, first it verifies that it is closer than the
5006closest value it had so far, otherwise it answers the incoming message
5007with a message containing the better value. Then it checks a proof of
5008work that must be included in the incoming message, to ensure that the
5009other peer's ID is not made up (otherwise a malicious peer could claim to
5010have an ID of exactly the target value every round). Once validated, it
5011compares the brodcast time of the received value with the current time
5012and if it's not too early, sends the received value to its neighbors.
5013Otherwise it stores the value until the correct broadcast time comes.
5014This prevents unnecessary traffic of sub-optimal values, since a better
5015value can come before the broadcast time, rendering the previous one
5016obsolete and saving the traffic that would have been used to broadcast it
5017to the neighbors.
5018
5019@node Calculating the estimate
5020@subsubsection Calculating the estimate
5021
5022@c %**end of header
5023
5024Once the closest ID has been spread across the network each peer gets the
5025exact distance betweed this ID and the target value of the round and
5026calculates the estimate with a mathematical formula described in the tech
5027report. The estimate generated with this method for a single round is not
5028very precise. Remember the case of the example, where the only peer is the
5029ID 44 and we happen to generate the target value 42, thinking there are
503050 peers in the network. Therefore, the NSE subsystem remembers the last
503164 estimates and calculates an average over them, giving a result of which
5032usually has one bit of uncertainty (the real size could be half of the
5033estimate or twice as much). Note that the actual network size is
5034calculated in powers of two of the raw input, thus one bit of uncertainty
5035means a factor of two in the size estimate.
5036
5037@cindex libgnunetnse
5038@node libgnunetnse
5039@subsection libgnunetnse
5040
5041@c %**end of header
5042
5043The NSE subsystem has the simplest API of all services, with only two
5044calls: @code{GNUNET_NSE_connect} and @code{GNUNET_NSE_disconnect}.
5045
5046The connect call gets a callback function as a parameter and this function
5047is called each time the network agrees on an estimate. This usually is
5048once per round, with some exceptions: if the closest peer has a late
5049local clock and starts spreading his ID after everyone else agreed on a
5050value, the callback might be activated twice in a round, the second value
5051being always bigger than the first. The default round time is set to
50521 hour.
5053
5054The disconnect call disconnects from the NSE subsystem and the callback
5055is no longer called with new estimates.
5056
5057
5058
5059@menu
5060* Results::
5061* libgnunetnse - Examples::
5062@end menu
5063
5064@node Results
5065@subsubsection Results
5066
5067@c %**end of header
5068
5069The callback provides two values: the average and the
5070@uref{http://en.wikipedia.org/wiki/Standard_deviation, standard deviation}
5071of the last 64 rounds. The values provided by the callback function are
5072logarithmic, this means that the real estimate numbers can be obtained by
5073calculating 2 to the power of the given value (2average). From a
5074statistics point of view this means that:
5075
5076@itemize @bullet
5077@item 68% of the time the real size is included in the interval
5078[(2average-stddev), 2]
5079@item 95% of the time the real size is included in the interval
5080[(2average-2*stddev, 2^average+2*stddev]
5081@item 99.7% of the time the real size is included in the interval
5082[(2average-3*stddev, 2average+3*stddev]
5083@end itemize
5084
5085The expected standard variation for 64 rounds in a network of stable size
5086is 0.2. Thus, we can say that normally:
5087
5088@itemize @bullet
5089@item 68% of the time the real size is in the range [-13%, +15%]
5090@item 95% of the time the real size is in the range [-24%, +32%]
5091@item 99.7% of the time the real size is in the range [-34%, +52%]
5092@end itemize
5093
5094As said in the introduction, we can be quite sure that usually the real
5095size is between one third and three times the estimate. This can of
5096course vary with network conditions.
5097Thus, applications may want to also consider the provided standard
5098deviation value, not only the average (in particular, if the standard
5099veriation is very high, the average maybe meaningless: the network size is
5100changing rapidly).
5101
5102@node libgnunetnse - Examples
5103@subsubsection libgnunetnse -Examples
5104
5105@c %**end of header
5106
5107Let's close with a couple examples.
5108
5109@table @asis
5110
5111@item Average: 10, std dev: 1 Here the estimate would be
51122^10 = 1024 peers. @footnote{The range in which we can be 95% sure is:
5113[2^8, 2^12] = [256, 4096]. We can be very (>99.7%) sure that the network
5114is not a hundred peers and absolutely sure that it is not a million peers,
5115but somewhere around a thousand.}
5116
5117@item Average 22, std dev: 0.2 Here the estimate would be
51182^22 = 4 Million peers. @footnote{The range in which we can be 99.7% sure
5119is: [2^21.4, 2^22.6] = [2.8M, 6.3M]. We can be sure that the network size
5120is around four million, with absolutely way of it being 1 million.}
5121
5122@end table
5123
5124To put this in perspective, if someone remembers the LHC Higgs boson
5125results, were announced with "5 sigma" and "6 sigma" certainties. In this
5126case a 5 sigma minimum would be 2 million and a 6 sigma minimum,
51271.8 million.
5128
5129@node The NSE Client-Service Protocol
5130@subsection The NSE Client-Service Protocol
5131
5132@c %**end of header
5133
5134As with the API, the client-service protocol is very simple, only has 2
5135different messages, defined in @code{src/nse/nse.h}:
5136
5137@itemize @bullet
5138@item @code{GNUNET_MESSAGE_TYPE_NSE_START}@ This message has no parameters
5139and is sent from the client to the service upon connection.
5140@item @code{GNUNET_MESSAGE_TYPE_NSE_ESTIMATE}@ This message is sent from
5141the service to the client for every new estimate and upon connection.
5142Contains a timestamp for the estimate, the average and the standard
5143deviation for the respective round.
5144@end itemize
5145
5146When the @code{GNUNET_NSE_disconnect} API call is executed, the client
5147simply disconnects from the service, with no message involved.
5148
5149@cindex NSE Peer-to-Peer Protocol
5150@node The NSE Peer-to-Peer Protocol
5151@subsection The NSE Peer-to-Peer Protocol
5152
5153@c %**end of header
5154
5155The NSE subsystem only has one message in the P2P protocol, the
5156@code{GNUNET_MESSAGE_TYPE_NSE_P2P_FLOOD} message.
5157
5158This message key contents are the timestamp to identify the round
5159(differences in system clocks may cause some peers to send messages way
5160too early or way too late, so the timestamp allows other peers to
5161identify such messages easily), the
5162@uref{http://en.wikipedia.org/wiki/Proof-of-work_system, proof of work}
5163used to make it difficult to mount a
5164@uref{http://en.wikipedia.org/wiki/Sybil_attack, Sybil attack}, and the
5165public key, which is used to verify the signature on the message.
5166
5167Every peer stores a message for the previous, current and next round. The
5168messages for the previous and current round are given to peers that
5169connect to us. The message for the next round is simply stored until our
5170system clock advances to the next round. The message for the current round
5171is what we are flooding the network with right now.
5172At the beginning of each round the peer does the following:
5173
5174@itemize @bullet
5175@item calculates his own distance to the target value
5176@item creates, signs and stores the message for the current round (unless
5177it has a better message in the "next round" slot which came early in the
5178previous round)
5179@item calculates, based on the stored round message (own or received) when
5180to stard flooding it to its neighbors
5181@end itemize
5182
5183Upon receiving a message the peer checks the validity of the message
5184(round, proof of work, signature). The next action depends on the
5185contents of the incoming message:
5186
5187@itemize @bullet
5188@item if the message is worse than the current stored message, the peer
5189sends the current message back immediately, to stop the other peer from
5190spreading suboptimal results
5191@item if the message is better than the current stored message, the peer
5192stores the new message and calculates the new target time to start
5193spreading it to its neighbors (excluding the one the message came from)
5194@item if the message is for the previous round, it is compared to the
5195message stored in the "previous round slot", which may then be updated
5196@item if the message is for the next round, it is compared to the message
5197stored in the "next round slot", which again may then be updated
5198@end itemize
5199
5200Finally, when it comes to send the stored message for the current round to
5201the neighbors there is a random delay added for each neighbor, to avoid
5202traffic spikes and minimize cross-messages.
5203
5204@cindex HOSTLIST Subsystem
5205@node HOSTLIST Subsystem
5206@section HOSTLIST Subsystem
5207
5208@c %**end of header
5209
5210Peers in the GNUnet overlay network need address information so that they
5211can connect with other peers. GNUnet uses so called HELLO messages to
5212store and exchange peer addresses.
5213GNUnet provides several methods for peers to obtain this information:
5214
5215@itemize @bullet
5216@item out-of-band exchange of HELLO messages (manually, using for example
5217gnunet-peerinfo)
5218@item HELLO messages shipped with GNUnet (automatic with distribution)
5219@item UDP neighbor discovery in LAN (IPv4 broadcast, IPv6 multicast)
5220@item topology gossiping (learning from other peers we already connected
5221to), and
5222@item the HOSTLIST daemon covered in this section, which is particularly
5223relevant for bootstrapping new peers.
5224@end itemize
5225
5226New peers have no existing connections (and thus cannot learn from gossip
5227among peers), may not have other peers in their LAN and might be started
5228with an outdated set of HELLO messages from the distribution.
5229In this case, getting new peers to connect to the network requires either
5230manual effort or the use of a HOSTLIST to obtain HELLOs.
5231
5232@menu
5233* HELLOs::
5234* Overview for the HOSTLIST subsystem::
5235* Interacting with the HOSTLIST daemon::
5236* Hostlist security address validation::
5237* The HOSTLIST daemon::
5238* The HOSTLIST server::
5239* The HOSTLIST client::
5240* Usage::
5241@end menu
5242
5243@node HELLOs
5244@subsection HELLOs
5245
5246@c %**end of header
5247
5248The basic information peers require to connect to other peers are
5249contained in so called HELLO messages you can think of as a business card.
5250Besides the identity of the peer (based on the cryptographic public key) a
5251HELLO message may contain address information that specifies ways to
5252contact a peer. By obtaining HELLO messages, a peer can learn how to
5253contact other peers.
5254
5255@node Overview for the HOSTLIST subsystem
5256@subsection Overview for the HOSTLIST subsystem
5257
5258@c %**end of header
5259
5260The HOSTLIST subsystem provides a way to distribute and obtain contact
5261information to connect to other peers using a simple HTTP GET request.
5262It's implementation is split in three parts, the main file for the daemon
5263itself (@file{gnunet-daemon-hostlist.c}), the HTTP client used to download
5264peer information (@file{hostlist-client.c}) and the server component used
5265to provide this information to other peers (@file{hostlist-server.c}).
5266The server is basically a small HTTP web server (based on GNU
5267libmicrohttpd) which provides a list of HELLOs known to the local peer for
5268download. The client component is basically a HTTP client
5269(based on libcurl) which can download hostlists from one or more websites.
5270The hostlist format is a binary blob containing a sequence of HELLO
5271messages. Note that any HTTP server can theoretically serve a hostlist,
5272the build-in hostlist server makes it simply convenient to offer this
5273service.
5274
5275
5276@menu
5277* Features::
5278* HOSTLIST - Limitations::
5279@end menu
5280
5281@node Features
5282@subsubsection Features
5283
5284@c %**end of header
5285
5286The HOSTLIST daemon can:
5287
5288@itemize @bullet
5289@item provide HELLO messages with validated addresses obtained from
5290PEERINFO to download for other peers
5291@item download HELLO messages and forward these message to the TRANSPORT
5292subsystem for validation
5293@item advertises the URL of this peer's hostlist address to other peers
5294via gossip
5295@item automatically learn about hostlist servers from the gossip of other
5296peers
5297@end itemize
5298
5299@node HOSTLIST - Limitations
5300@subsubsection HOSTLIST - Limitations
5301
5302@c %**end of header
5303
5304The HOSTLIST daemon does not:
5305
5306@itemize @bullet
5307@item verify the cryptographic information in the HELLO messages
5308@item verify the address information in the HELLO messages
5309@end itemize
5310
5311@node Interacting with the HOSTLIST daemon
5312@subsection Interacting with the HOSTLIST daemon
5313
5314@c %**end of header
5315
5316The HOSTLIST subsystem is currently implemented as a daemon, so there is
5317no need for the user to interact with it and therefore there is no
5318command line tool and no API to communicate with the daemon. In the
5319future, we can envision changing this to allow users to manually trigger
5320the download of a hostlist.
5321
5322Since there is no command line interface to interact with HOSTLIST, the
5323only way to interact with the hostlist is to use STATISTICS to obtain or
5324modify information about the status of HOSTLIST:
5325
5326@example
5327$ gnunet-statistics -s hostlist
5328@end example
5329
5330@noindent
5331In particular, HOSTLIST includes a @strong{persistent} value in statistics
5332that specifies when the hostlist server might be queried next. As this
5333value is exponentially increasing during runtime, developers may want to
5334reset or manually adjust it. Note that HOSTLIST (but not STATISTICS) needs
5335to be shutdown if changes to this value are to have any effect on the
5336daemon (as HOSTLIST does not monitor STATISTICS for changes to the
5337download frequency).
5338
5339@node Hostlist security address validation
5340@subsection Hostlist security address validation
5341
5342@c %**end of header
5343
5344Since information obtained from other parties cannot be trusted without
5345validation, we have to distinguish between @emph{validated} and
5346@emph{not validated} addresses. Before using (and so trusting)
5347information from other parties, this information has to be double-checked
5348(validated). Address validation is not done by HOSTLIST but by the
5349TRANSPORT service.
5350
5351The HOSTLIST component is functionally located between the PEERINFO and
5352the TRANSPORT subsystem. When acting as a server, the daemon obtains valid
5353(@emph{validated}) peer information (HELLO messages) from the PEERINFO
5354service and provides it to other peers. When acting as a client, it
5355contacts the HOSTLIST servers specified in the configuration, downloads
5356the (unvalidated) list of HELLO messages and forwards these information
5357to the TRANSPORT server to validate the addresses.
5358
5359@cindex HOSTLIST daemon
5360@node The HOSTLIST daemon
5361@subsection The HOSTLIST daemon
5362
5363@c %**end of header
5364
5365The hostlist daemon is the main component of the HOSTLIST subsystem. It is
5366started by the ARM service and (if configured) starts the HOSTLIST client
5367and server components.
5368
5369If the daemon provides a hostlist itself it can advertise it's own
5370hostlist to other peers. To do so it sends a
5371@code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT} message to other peers
5372when they connect to this peer on the CORE level. This hostlist
5373advertisement message contains the URL to access the HOSTLIST HTTP
5374server of the sender. The daemon may also subscribe to this type of
5375message from CORE service, and then forward these kind of message to the
5376HOSTLIST client. The client then uses all available URLs to download peer
5377information when necessary.
5378
5379When starting, the HOSTLIST daemon first connects to the CORE subsystem
5380and if hostlist learning is enabled, registers a CORE handler to receive
5381this kind of messages. Next it starts (if configured) the client and
5382server. It passes pointers to CORE connect and disconnect and receive
5383handlers where the client and server store their functions, so the daemon
5384can notify them about CORE events.
5385
5386To clean up on shutdown, the daemon has a cleaning task, shutting down all
5387subsystems and disconnecting from CORE.
5388
5389@cindex HOSTLIST server
5390@node The HOSTLIST server
5391@subsection The HOSTLIST server
5392
5393@c %**end of header
5394
5395The server provides a way for other peers to obtain HELLOs. Basically it
5396is a small web server other peers can connect to and download a list of
5397HELLOs using standard HTTP; it may also advertise the URL of the hostlist
5398to other peers connecting on CORE level.
5399
5400
5401@menu
5402* The HTTP Server::
5403* Advertising the URL::
5404@end menu
5405
5406@node The HTTP Server
5407@subsubsection The HTTP Server
5408
5409@c %**end of header
5410
5411During startup, the server starts a web server listening on the port
5412specified with the HTTPPORT value (default 8080). In addition it connects
5413to the PEERINFO service to obtain peer information. The HOSTLIST server
5414uses the GNUNET_PEERINFO_iterate function to request HELLO information for
5415all peers and adds their information to a new hostlist if they are
5416suitable (expired addresses and HELLOs without addresses are both not
5417suitable) and the maximum size for a hostlist is not exceeded
5418(MAX_BYTES_PER_HOSTLISTS = 500000).
5419When PEERINFO finishes (with a last NULL callback), the server destroys
5420the previous hostlist response available for download on the web server
5421and replaces it with the updated hostlist. The hostlist format is
5422basically a sequence of HELLO messages (as obtained from PEERINFO) without
5423any special tokenization. Since each HELLO message contains a size field,
5424the response can easily be split into separate HELLO messages by the
5425client.
5426
5427A HOSTLIST client connecting to the HOSTLIST server will receive the
5428hostlist as a HTTP response and the the server will terminate the
5429connection with the result code @code{HTTP 200 OK}.
5430The connection will be closed immediately if no hostlist is available.
5431
5432@node Advertising the URL
5433@subsubsection Advertising the URL
5434
5435@c %**end of header
5436
5437The server also advertises the URL to download the hostlist to other peers
5438if hostlist advertisement is enabled.
5439When a new peer connects and has hostlist learning enabled, the server
5440sends a @code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT} message to this
5441peer using the CORE service.
5442
5443@cindex HOSTLIST client
5444@node The HOSTLIST client
5445@subsection The HOSTLIST client
5446
5447@c %**end of header
5448
5449The client provides the functionality to download the list of HELLOs from
5450a set of URLs.
5451It performs a standard HTTP request to the URLs configured and learned
5452from advertisement messages received from other peers. When a HELLO is
5453downloaded, the HOSTLIST client forwards the HELLO to the TRANSPORT
5454service for validation.
5455
5456The client supports two modes of operation:
5457
5458@itemize @bullet
5459@item download of HELLOs (bootstrapping)
5460@item learning of URLs
5461@end itemize
5462
5463@menu
5464* Bootstrapping::
5465* Learning::
5466@end menu
5467
5468@node Bootstrapping
5469@subsubsection Bootstrapping
5470
5471@c %**end of header
5472
5473For bootstrapping, it schedules a task to download the hostlist from the
5474set of known URLs.
5475The downloads are only performed if the number of current
5476connections is smaller than a minimum number of connections
5477(at the moment 4).
5478The interval between downloads increases exponentially; however, the
5479exponential growth is limited if it becomes longer than an hour.
5480At that point, the frequency growth is capped at
5481(#number of connections * 1h).
5482
5483Once the decision has been taken to download HELLOs, the daemon chooses a
5484random URL from the list of known URLs. URLs can be configured in the
5485configuration or be learned from advertisement messages.
5486The client uses a HTTP client library (libcurl) to initiate the download
5487using the libcurl multi interface.
5488Libcurl passes the data to the callback_download function which
5489stores the data in a buffer if space is available and the maximum size for
5490a hostlist download is not exceeded (MAX_BYTES_PER_HOSTLISTS = 500000).
5491When a full HELLO was downloaded, the HOSTLIST client offers this
5492HELLO message to the TRANSPORT service for validation.
5493When the download is finished or failed, statistical information about the
5494quality of this URL is updated.
5495
5496@cindex HOSTLIST learning
5497@node Learning
5498@subsubsection Learning
5499
5500@c %**end of header
5501
5502The client also manages hostlist advertisements from other peers. The
5503HOSTLIST daemon forwards @code{GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT}
5504messages to the client subsystem, which extracts the URL from the message.
5505Next, a test of the newly obtained URL is performed by triggering a
5506download from the new URL. If the URL works correctly, it is added to the
5507list of working URLs.
5508
5509The size of the list of URLs is restricted, so if an additional server is
5510added and the list is full, the URL with the worst quality ranking
5511(determined through successful downloads and number of HELLOs e.g.) is
5512discarded. During shutdown the list of URLs is saved to a file for
5513persistance and loaded on startup. URLs from the configuration file are
5514never discarded.
5515
5516@node Usage
5517@subsection Usage
5518
5519@c %**end of header
5520
5521To start HOSTLIST by default, it has to be added to the DEFAULTSERVICES
5522section for the ARM services. This is done in the default configuration.
5523
5524For more information on how to configure the HOSTLIST subsystem see the
5525installation handbook:@
5526Configuring the hostlist to bootstrap@
5527Configuring your peer to provide a hostlist
5528
5529@cindex IDENTITY Subsystem
5530@node IDENTITY Subsystem
5531@section IDENTITY Subsystem
5532
5533@c %**end of header
5534
5535Identities of "users" in GNUnet are called egos.
5536Egos can be used as pseudonyms ("fake names") or be tied to an
5537organization (for example, "GNU") or even the actual identity of a human.
5538GNUnet users are expected to have many egos. They might have one tied to
5539their real identity, some for organizations they manage, and more for
5540different domains where they want to operate under a pseudonym.
5541
5542The IDENTITY service allows users to manage their egos. The identity
5543service manages the private keys egos of the local user; it does not
5544manage identities of other users (public keys). Public keys for other
5545users need names to become manageable. GNUnet uses the
5546@dfn{GNU Name System} (GNS) to give names to other users and manage their
5547public keys securely. This chapter is about the IDENTITY service,
5548which is about the management of private keys.
5549
5550On the network, an ego corresponds to an ECDSA key (over Curve25519,
5551using RFC 6979, as required by GNS). Thus, users can perform actions
5552under a particular ego by using (signing with) a particular private key.
5553Other users can then confirm that the action was really performed by that
5554ego by checking the signature against the respective public key.
5555
5556The IDENTITY service allows users to associate a human-readable name with
5557each ego. This way, users can use names that will remind them of the
5558purpose of a particular ego.
5559The IDENTITY service will store the respective private keys and
5560allows applications to access key information by name.
5561Users can change the name that is locally (!) associated with an ego.
5562Egos can also be deleted, which means that the private key will be removed
5563and it thus will not be possible to perform actions with that ego in the
5564future.
5565
5566Additionally, the IDENTITY subsystem can associate service functions with
5567egos.
5568For example, GNS requires the ego that should be used for the shorten
5569zone. GNS will ask IDENTITY for an ego for the "gns-short" service.
5570The IDENTITY service has a mapping of such service strings to the name of
5571the ego that the user wants to use for this service, for example
5572"my-short-zone-ego".
5573
5574Finally, the IDENTITY API provides access to a special ego, the
5575anonymous ego. The anonymous ego is special in that its private key is not
5576really private, but fixed and known to everyone.
5577Thus, anyone can perform actions as anonymous. This can be useful as with
5578this trick, code does not have to contain a special case to distinguish
5579between anonymous and pseudonymous egos.
5580
5581@menu
5582* libgnunetidentity::
5583* The IDENTITY Client-Service Protocol::
5584@end menu
5585
5586@cindex libgnunetidentity
5587@node libgnunetidentity
5588@subsection libgnunetidentity
5589@c %**end of header
5590
5591
5592@menu
5593* Connecting to the service::
5594* Operations on Egos::
5595* The anonymous Ego::
5596* Convenience API to lookup a single ego::
5597* Associating egos with service functions::
5598@end menu
5599
5600@node Connecting to the service
5601@subsubsection Connecting to the service
5602
5603@c %**end of header
5604
5605First, typical clients connect to the identity service using
5606@code{GNUNET_IDENTITY_connect}. This function takes a callback as a
5607parameter.
5608If the given callback parameter is non-null, it will be invoked to notify
5609the application about the current state of the identities in the system.
5610
5611@itemize @bullet
5612@item First, it will be invoked on all known egos at the time of the
5613connection. For each ego, a handle to the ego and the user's name for the
5614ego will be passed to the callback. Furthermore, a @code{void **} context
5615argument will be provided which gives the client the opportunity to
5616associate some state with the ego.
5617@item Second, the callback will be invoked with NULL for the ego, the name
5618and the context. This signals that the (initial) iteration over all egos
5619has completed.
5620@item Then, the callback will be invoked whenever something changes about
5621an ego.
5622If an ego is renamed, the callback is invoked with the ego handle of the
5623ego that was renamed, and the new name. If an ego is deleted, the callback
5624is invoked with the ego handle and a name of NULL. In the deletion case,
5625the application should also release resources stored in the context.
5626@item When the application destroys the connection to the identity service
5627using @code{GNUNET_IDENTITY_disconnect}, the callback is again invoked
5628with the ego and a name of NULL (equivalent to deletion of the egos).
5629This should again be used to clean up the per-ego context.
5630@end itemize
5631
5632The ego handle passed to the callback remains valid until the callback is
5633invoked with a name of NULL, so it is safe to store a reference to the
5634ego's handle.
5635
5636@node Operations on Egos
5637@subsubsection Operations on Egos
5638
5639@c %**end of header
5640
5641Given an ego handle, the main operations are to get its associated private
5642key using @code{GNUNET_IDENTITY_ego_get_private_key} or its associated
5643public key using @code{GNUNET_IDENTITY_ego_get_public_key}.
5644
5645The other operations on egos are pretty straightforward.
5646Using @code{GNUNET_IDENTITY_create}, an application can request the
5647creation of an ego by specifying the desired name.
5648The operation will fail if that name is
5649already in use. Using @code{GNUNET_IDENTITY_rename} the name of an
5650existing ego can be changed. Finally, egos can be deleted using
5651@code{GNUNET_IDENTITY_delete}. All of these operations will trigger
5652updates to the callback given to the @code{GNUNET_IDENTITY_connect}
5653function of all applications that are connected with the identity service
5654at the time. @code{GNUNET_IDENTITY_cancel} can be used to cancel the
5655operations before the respective continuations would be called.
5656It is not guaranteed that the operation will not be completed anyway,
5657only the continuation will no longer be called.
5658
5659@node The anonymous Ego
5660@subsubsection The anonymous Ego
5661
5662@c %**end of header
5663
5664A special way to obtain an ego handle is to call
5665@code{GNUNET_IDENTITY_ego_get_anonymous}, which returns an ego for the
5666"anonymous" user --- anyone knows and can get the private key for this
5667user, so it is suitable for operations that are supposed to be anonymous
5668but require signatures (for example, to avoid a special path in the code).
5669The anonymous ego is always valid and accessing it does not require a
5670connection to the identity service.
5671
5672@node Convenience API to lookup a single ego
5673@subsubsection Convenience API to lookup a single ego
5674
5675
5676As applications commonly simply have to lookup a single ego, there is a
5677convenience API to do just that. Use @code{GNUNET_IDENTITY_ego_lookup} to
5678lookup a single ego by name. Note that this is the user's name for the
5679ego, not the service function. The resulting ego will be returned via a
5680callback and will only be valid during that callback. The operation can
5681be cancelled via @code{GNUNET_IDENTITY_ego_lookup_cancel}
5682(cancellation is only legal before the callback is invoked).
5683
5684@node Associating egos with service functions
5685@subsubsection Associating egos with service functions
5686
5687
5688The @code{GNUNET_IDENTITY_set} function is used to associate a particular
5689ego with a service function. The name used by the service and the ego are
5690given as arguments.
5691Afterwards, the service can use its name to lookup the associated ego
5692using @code{GNUNET_IDENTITY_get}.
5693
5694@node The IDENTITY Client-Service Protocol
5695@subsection The IDENTITY Client-Service Protocol
5696
5697@c %**end of header
5698
5699A client connecting to the identity service first sends a message with
5700type
5701@code{GNUNET_MESSAGE_TYPE_IDENTITY_START} to the service. After that, the
5702client will receive information about changes to the egos by receiving
5703messages of type @code{GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE}.
5704Those messages contain the private key of the ego and the user's name of
5705the ego (or zero bytes for the name to indicate that the ego was deleted).
5706A special bit @code{end_of_list} is used to indicate the end of the
5707initial iteration over the identity service's egos.
5708
5709The client can trigger changes to the egos by sending @code{CREATE},
5710@code{RENAME} or @code{DELETE} messages.
5711The CREATE message contains the private key and the desired name.@
5712The RENAME message contains the old name and the new name.@
5713The DELETE message only needs to include the name of the ego to delete.@
5714The service responds to each of these messages with a @code{RESULT_CODE}
5715message which indicates success or error of the operation, and possibly
5716a human-readable error message.
5717
5718Finally, the client can bind the name of a service function to an ego by
5719sending a @code{SET_DEFAULT} message with the name of the service function
5720and the private key of the ego.
5721Such bindings can then be resolved using a @code{GET_DEFAULT} message,
5722which includes the name of the service function. The identity service
5723will respond to a GET_DEFAULT request with a SET_DEFAULT message
5724containing the respective information, or with a RESULT_CODE to
5725indicate an error.
5726
5727@cindex NAMESTORE Subsystem
5728@node NAMESTORE Subsystem
5729@section NAMESTORE Subsystem
5730
5731The NAMESTORE subsystem provides persistent storage for local GNS zone
5732information. All local GNS zone information are managed by NAMESTORE. It
5733provides both the functionality to administer local GNS information (e.g.
5734delete and add records) as well as to retrieve GNS information (e.g to
5735list name information in a client).
5736NAMESTORE does only manage the persistent storage of zone information
5737belonging to the user running the service: GNS information from other
5738users obtained from the DHT are stored by the NAMECACHE subsystem.
5739
5740NAMESTORE uses a plugin-based database backend to store GNS information
5741with good performance. Here sqlite, MySQL and PostgreSQL are supported
5742database backends.
5743NAMESTORE clients interact with the IDENTITY subsystem to obtain
5744cryptographic information about zones based on egos as described with the
5745IDENTITY subsystem, but internally NAMESTORE refers to zones using the
5746ECDSA private key.
5747In addition, it collaborates with the NAMECACHE subsystem and
5748stores zone information when local information are modified in the
5749GNS cache to increase look-up performance for local information.
5750
5751NAMESTORE provides functionality to look-up and store records, to iterate
5752over a specific or all zones and to monitor zones for changes. NAMESTORE
5753functionality can be accessed using the NAMESTORE api or the NAMESTORE
5754command line tool.
5755
5756@menu
5757* libgnunetnamestore::
5758@end menu
5759
5760@cindex libgnunetnamestore
5761@node libgnunetnamestore
5762@subsection libgnunetnamestore
5763
5764To interact with NAMESTORE clients first connect to the NAMESTORE service
5765using the @code{GNUNET_NAMESTORE_connect} passing a configuration handle.
5766As a result they obtain a NAMESTORE handle, they can use for operations,
5767or NULL is returned if the connection failed.
5768
5769To disconnect from NAMESTORE, clients use
5770@code{GNUNET_NAMESTORE_disconnect} and specify the handle to disconnect.
5771
5772NAMESTORE internally uses the ECDSA private key to refer to zones. These
5773private keys can be obtained from the IDENTITY subsytem.
5774Here @emph{egos} @emph{can be used to refer to zones or the default ego
5775assigned to the GNS subsystem can be used to obtained the master zone's
5776private key.}
5777
5778
5779@menu
5780* Editing Zone Information::
5781* Iterating Zone Information::
5782* Monitoring Zone Information::
5783@end menu
5784
5785@node Editing Zone Information
5786@subsubsection Editing Zone Information
5787
5788@c %**end of header
5789
5790NAMESTORE provides functions to lookup records stored under a label in a
5791zone and to store records under a label in a zone.
5792
5793To store (and delete) records, the client uses the
5794@code{GNUNET_NAMESTORE_records_store} function and has to provide
5795namestore handle to use, the private key of the zone, the label to store
5796the records under, the records and number of records plus an callback
5797function.
5798After the operation is performed NAMESTORE will call the provided
5799callback function with the result GNUNET_SYSERR on failure
5800(including timeout/queue drop/failure to validate), GNUNET_NO if content
5801was already there or not found GNUNET_YES (or other positive value) on
5802success plus an additional error message.
5803
5804Records are deleted by using the store command with 0 records to store.
5805It is important to note, that records are not merged when records exist
5806with the label.
5807So a client has first to retrieve records, merge with existing records
5808and then store the result.
5809
5810To perform a lookup operation, the client uses the
5811@code{GNUNET_NAMESTORE_records_store} function. Here he has to pass the
5812namestore handle, the private key of the zone and the label. He also has
5813to provide a callback function which will be called with the result of
5814the lookup operation:
5815the zone for the records, the label, and the records including the
5816number of records included.
5817
5818A special operation is used to set the preferred nickname for a zone.
5819This nickname is stored with the zone and is automatically merged with
5820all labels and records stored in a zone. Here the client uses the
5821@code{GNUNET_NAMESTORE_set_nick} function and passes the private key of
5822the zone, the nickname as string plus a the callback with the result of
5823the operation.
5824
5825@node Iterating Zone Information
5826@subsubsection Iterating Zone Information
5827
5828@c %**end of header
5829
5830A client can iterate over all information in a zone or all zones managed
5831by NAMESTORE.
5832Here a client uses the @code{GNUNET_NAMESTORE_zone_iteration_start}
5833function and passes the namestore handle, the zone to iterate over and a
5834callback function to call with the result.
5835If the client wants to iterate over all the, he passes NULL for the zone.
5836A @code{GNUNET_NAMESTORE_ZoneIterator} handle is returned to be used to
5837continue iteration.
5838
5839NAMESTORE calls the callback for every result and expects the client to
5840call @code{GNUNET_NAMESTORE_zone_iterator_next} to continue to iterate or
5841@code{GNUNET_NAMESTORE_zone_iterator_stop} to interrupt the iteration.
5842When NAMESTORE reached the last item it will call the callback with a
5843NULL value to indicate.
5844
5845@node Monitoring Zone Information
5846@subsubsection Monitoring Zone Information
5847
5848@c %**end of header
5849
5850Clients can also monitor zones to be notified about changes. Here the
5851clients uses the @code{GNUNET_NAMESTORE_zone_monitor_start} function and
5852passes the private key of the zone and and a callback function to call
5853with updates for a zone.
5854The client can specify to obtain zone information first by iterating over
5855the zone and specify a synchronization callback to be called when the
5856client and the namestore are synced.
5857
5858On an update, NAMESTORE will call the callback with the private key of the
5859zone, the label and the records and their number.
5860
5861To stop monitoring, the client calls
5862@code{GNUNET_NAMESTORE_zone_monitor_stop} and passes the handle obtained
5863from the function to start the monitoring.
5864
5865@cindex PEERINFO Subsystem
5866@node PEERINFO Subsystem
5867@section PEERINFO Subsystem
5868
5869@c %**end of header
5870
5871The PEERINFO subsystem is used to store verified (validated) information
5872about known peers in a persistent way. It obtains these addresses for
5873example from TRANSPORT service which is in charge of address validation.
5874Validation means that the information in the HELLO message are checked by
5875connecting to the addresses and performing a cryptographic handshake to
5876authenticate the peer instance stating to be reachable with these
5877addresses.
5878Peerinfo does not validate the HELLO messages itself but only stores them
5879and gives them to interested clients.
5880
5881As future work, we think about moving from storing just HELLO messages to
5882providing a generic persistent per-peer information store.
5883More and more subsystems tend to need to store per-peer information in
5884persistent way.
5885To not duplicate this functionality we plan to provide a PEERSTORE
5886service providing this functionality.
5887
5888@menu
5889* PEERINFO - Features::
5890* PEERINFO - Limitations::
5891* DeveloperPeer Information::
5892* Startup::
5893* Managing Information::
5894* Obtaining Information::
5895* The PEERINFO Client-Service Protocol::
5896* libgnunetpeerinfo::
5897@end menu
5898
5899@node PEERINFO - Features
5900@subsection PEERINFO - Features
5901
5902@c %**end of header
5903
5904@itemize @bullet
5905@item Persistent storage
5906@item Client notification mechanism on update
5907@item Periodic clean up for expired information
5908@item Differentiation between public and friend-only HELLO
5909@end itemize
5910
5911@node PEERINFO - Limitations
5912@subsection PEERINFO - Limitations
5913
5914
5915@itemize @bullet
5916@item Does not perform HELLO validation
5917@end itemize
5918
5919@node DeveloperPeer Information
5920@subsection DeveloperPeer Information
5921
5922@c %**end of header
5923
5924The PEERINFO subsystem stores these information in the form of HELLO
5925messages you can think of as business cards.
5926These HELLO messages contain the public key of a peer and the addresses
5927a peer can be reached under.
5928The addresses include an expiration date describing how long they are
5929valid. This information is updated regularly by the TRANSPORT service by
5930revalidating the address.
5931If an address is expired and not renewed, it can be removed from the
5932HELLO message.
5933
5934Some peer do not want to have their HELLO messages distributed to other
5935peers, especially when GNUnet's friend-to-friend modus is enabled.
5936To prevent this undesired distribution. PEERINFO distinguishes between
5937@emph{public} and @emph{friend-only} HELLO messages.
5938Public HELLO messages can be freely distributed to other (possibly
5939unknown) peers (for example using the hostlist, gossiping, broadcasting),
5940whereas friend-only HELLO messages may not be distributed to other peers.
5941Friend-only HELLO messages have an additional flag @code{friend_only} set
5942internally. For public HELLO message this flag is not set.
5943PEERINFO does and cannot not check if a client is allowed to obtain a
5944specific HELLO type.
5945
5946The HELLO messages can be managed using the GNUnet HELLO library.
5947Other GNUnet systems can obtain these information from PEERINFO and use
5948it for their purposes.
5949Clients are for example the HOSTLIST component providing these
5950information to other peers in form of a hostlist or the TRANSPORT
5951subsystem using these information to maintain connections to other peers.
5952
5953@node Startup
5954@subsection Startup
5955
5956@c %**end of header
5957
5958During startup the PEERINFO services loads persistent HELLOs from disk.
5959First PEERINFO parses the directory configured in the HOSTS value of the
5960@code{PEERINFO} configuration section to store PEERINFO information.
5961For all files found in this directory valid HELLO messages are extracted.
5962In addition it loads HELLO messages shipped with the GNUnet distribution.
5963These HELLOs are used to simplify network bootstrapping by providing
5964valid peer information with the distribution.
5965The use of these HELLOs can be prevented by setting the
5966@code{USE_INCLUDED_HELLOS} in the @code{PEERINFO} configuration section to
5967@code{NO}. Files containing invalid information are removed.
5968
5969@node Managing Information
5970@subsection Managing Information
5971
5972@c %**end of header
5973
5974The PEERINFO services stores information about known PEERS and a single
5975HELLO message for every peer.
5976A peer does not need to have a HELLO if no information are available.
5977HELLO information from different sources, for example a HELLO obtained
5978from a remote HOSTLIST and a second HELLO stored on disk, are combined
5979and merged into one single HELLO message per peer which will be given to
5980clients. During this merge process the HELLO is immediately written to
5981disk to ensure persistence.
5982
5983PEERINFO in addition periodically scans the directory where information
5984are stored for empty HELLO messages with expired TRANSPORT addresses.
5985This periodic task scans all files in the directory and recreates the
5986HELLO messages it finds.
5987Expired TRANSPORT addresses are removed from the HELLO and if the
5988HELLO does not contain any valid addresses, it is discarded and removed
5989from the disk.
5990
5991@node Obtaining Information
5992@subsection Obtaining Information
5993
5994@c %**end of header
5995
5996When a client requests information from PEERINFO, PEERINFO performs a
5997lookup for the respective peer or all peers if desired and transmits this
5998information to the client.
5999The client can specify if friend-only HELLOs have to be included or not
6000and PEERINFO filters the respective HELLO messages before transmitting
6001information.
6002
6003To notify clients about changes to PEERINFO information, PEERINFO
6004maintains a list of clients interested in this notifications.
6005Such a notification occurs if a HELLO for a peer was updated (due to a
6006merge for example) or a new peer was added.
6007
6008@node The PEERINFO Client-Service Protocol
6009@subsection The PEERINFO Client-Service Protocol
6010
6011@c %**end of header
6012
6013To connect and disconnect to and from the PEERINFO Service PEERINFO
6014utilizes the util client/server infrastructure, so no special messages
6015types are used here.
6016
6017To add information for a peer, the plain HELLO message is transmitted to
6018the service without any wrapping. All pieces of information required are
6019stored within the HELLO message.
6020The PEERINFO service provides a message handler accepting and processing
6021these HELLO messages.
6022
6023When obtaining PEERINFO information using the iterate functionality
6024specific messages are used. To obtain information for all peers, a
6025@code{struct ListAllPeersMessage} with message type
6026@code{GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL} and a flag
6027include_friend_only to indicate if friend-only HELLO messages should be
6028included are transmitted. If information for a specific peer is required
6029a @code{struct ListAllPeersMessage} with
6030@code{GNUNET_MESSAGE_TYPE_PEERINFO_GET} containing the peer identity is
6031used.
6032
6033For both variants the PEERINFO service replies for each HELLO message it
6034wants to transmit with a @code{struct ListAllPeersMessage} with type
6035@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO} containing the plain HELLO.
6036The final message is @code{struct GNUNET_MessageHeader} with type
6037@code{GNUNET_MESSAGE_TYPE_PEERINFO_INFO}. If the client receives this
6038message, it can proceed with the next request if any is pending.
6039
6040@node libgnunetpeerinfo
6041@subsection libgnunetpeerinfo
6042
6043@c %**end of header
6044
6045The PEERINFO API consists mainly of three different functionalities:
6046
6047@itemize @bullet
6048@item maintaining a connection to the service
6049@item adding new information to the PEERINFO service
6050@item retrieving information from the PEERINFO service
6051@end itemize
6052
6053@menu
6054* Connecting to the PEERINFO Service::
6055* Adding Information to the PEERINFO Service::
6056* Obtaining Information from the PEERINFO Service::
6057@end menu
6058
6059@node Connecting to the PEERINFO Service
6060@subsubsection Connecting to the PEERINFO Service
6061
6062@c %**end of header
6063
6064To connect to the PEERINFO service the function
6065@code{GNUNET_PEERINFO_connect} is used, taking a configuration handle as
6066an argument, and to disconnect from PEERINFO the function
6067@code{GNUNET_PEERINFO_disconnect}, taking the PEERINFO
6068handle returned from the connect function has to be called.
6069
6070@node Adding Information to the PEERINFO Service
6071@subsubsection Adding Information to the PEERINFO Service
6072
6073@c %**end of header
6074
6075@code{GNUNET_PEERINFO_add_peer} adds a new peer to the PEERINFO subsystem
6076storage. This function takes the PEERINFO handle as an argument, the HELLO
6077message to store and a continuation with a closure to be called with the
6078result of the operation.
6079The @code{GNUNET_PEERINFO_add_peer} returns a handle to this operation
6080allowing to cancel the operation with the respective cancel function
6081@code{GNUNET_PEERINFO_add_peer_cancel}. To retrieve information from
6082PEERINFO you can iterate over all information stored with PEERINFO or you
6083can tell PEERINFO to notify if new peer information are available.
6084
6085@node Obtaining Information from the PEERINFO Service
6086@subsubsection Obtaining Information from the PEERINFO Service
6087
6088@c %**end of header
6089
6090To iterate over information in PEERINFO you use
6091@code{GNUNET_PEERINFO_iterate}.
6092This function expects the PEERINFO handle, a flag if HELLO messages
6093intended for friend only mode should be included, a timeout how long the
6094operation should take and a callback with a callback closure to be called
6095for the results.
6096If you want to obtain information for a specific peer, you can specify
6097the peer identity, if this identity is NULL, information for all peers are
6098returned. The function returns a handle to allow to cancel the operation
6099using @code{GNUNET_PEERINFO_iterate_cancel}.
6100
6101To get notified when peer information changes, you can use
6102@code{GNUNET_PEERINFO_notify}.
6103This function expects a configuration handle and a flag if friend-only
6104HELLO messages should be included. The PEERINFO service will notify you
6105about every change and the callback function will be called to notify you
6106about changes. The function returns a handle to cancel notifications
6107with @code{GNUNET_PEERINFO_notify_cancel}.
6108
6109@cindex PEERSTORE Subsystem
6110@node PEERSTORE Subsystem
6111@section PEERSTORE Subsystem
6112
6113@c %**end of header
6114
6115GNUnet's PEERSTORE subsystem offers persistent per-peer storage for other
6116GNUnet subsystems. GNUnet subsystems can use PEERSTORE to persistently
6117store and retrieve arbitrary data.
6118Each data record stored with PEERSTORE contains the following fields:
6119
6120@itemize @bullet
6121@item subsystem: Name of the subsystem responsible for the record.
6122@item peerid: Identity of the peer this record is related to.
6123@item key: a key string identifying the record.
6124@item value: binary record value.
6125@item expiry: record expiry date.
6126@end itemize
6127
6128@menu
6129* Functionality::
6130* Architecture::
6131* libgnunetpeerstore::
6132@end menu
6133
6134@node Functionality
6135@subsection Functionality
6136
6137@c %**end of header
6138
6139Subsystems can store any type of value under a (subsystem, peerid, key)
6140combination. A "replace" flag set during store operations forces the
6141PEERSTORE to replace any old values stored under the same
6142(subsystem, peerid, key) combination with the new value.
6143Additionally, an expiry date is set after which the record is *possibly*
6144deleted by PEERSTORE.
6145
6146Subsystems can iterate over all values stored under any of the following
6147combination of fields:
6148
6149@itemize @bullet
6150@item (subsystem)
6151@item (subsystem, peerid)
6152@item (subsystem, key)
6153@item (subsystem, peerid, key)
6154@end itemize
6155
6156Subsystems can also request to be notified about any new values stored
6157under a (subsystem, peerid, key) combination by sending a "watch"
6158request to PEERSTORE.
6159
6160@node Architecture
6161@subsection Architecture
6162
6163@c %**end of header
6164
6165PEERSTORE implements the following components:
6166
6167@itemize @bullet
6168@item PEERSTORE service: Handles store, iterate and watch operations.
6169@item PEERSTORE API: API to be used by other subsystems to communicate and
6170issue commands to the PEERSTORE service.
6171@item PEERSTORE plugins: Handles the persistent storage. At the moment,
6172only an "sqlite" plugin is implemented.
6173@end itemize
6174
6175@cindex libgnunetpeerstore
6176@node libgnunetpeerstore
6177@subsection libgnunetpeerstore
6178
6179@c %**end of header
6180
6181libgnunetpeerstore is the library containing the PEERSTORE API. Subsystems
6182wishing to communicate with the PEERSTORE service use this API to open a
6183connection to PEERSTORE. This is done by calling
6184@code{GNUNET_PEERSTORE_connect} which returns a handle to the newly
6185created connection.
6186This handle has to be used with any further calls to the API.
6187
6188To store a new record, the function @code{GNUNET_PEERSTORE_store} is to
6189be used which requires the record fields and a continuation function that
6190will be called by the API after the STORE request is sent to the
6191PEERSTORE service.
6192Note that calling the continuation function does not mean that the record
6193is successfully stored, only that the STORE request has been successfully
6194sent to the PEERSTORE service.
6195@code{GNUNET_PEERSTORE_store_cancel} can be called to cancel the STORE
6196request only before the continuation function has been called.
6197
6198To iterate over stored records, the function
6199@code{GNUNET_PEERSTORE_iterate} is
6200to be used. @emph{peerid} and @emph{key} can be set to NULL. An iterator
6201callback function will be called with each matching record found and a
6202NULL record at the end to signal the end of result set.
6203@code{GNUNET_PEERSTORE_iterate_cancel} can be used to cancel the ITERATE
6204request before the iterator callback is called with a NULL record.
6205
6206To be notified with new values stored under a (subsystem, peerid, key)
6207combination, the function @code{GNUNET_PEERSTORE_watch} is to be used.
6208This will register the watcher with the PEERSTORE service, any new
6209records matching the given combination will trigger the callback
6210function passed to @code{GNUNET_PEERSTORE_watch}. This continues until
6211@code{GNUNET_PEERSTORE_watch_cancel} is called or the connection to the
6212service is destroyed.
6213
6214After the connection is no longer needed, the function
6215@code{GNUNET_PEERSTORE_disconnect} can be called to disconnect from the
6216PEERSTORE service.
6217Any pending ITERATE or WATCH requests will be destroyed.
6218If the @code{sync_first} flag is set to @code{GNUNET_YES}, the API will
6219delay the disconnection until all pending STORE requests are sent to
6220the PEERSTORE service, otherwise, the pending STORE requests will be
6221destroyed as well.
6222
6223@cindex SET Subsystem
6224@node SET Subsystem
6225@section SET Subsystem
6226
6227@c %**end of header
6228
6229The SET service implements efficient set operations between two peers
6230over a mesh tunnel.
6231Currently, set union and set intersection are the only supported
6232operations. Elements of a set consist of an @emph{element type} and
6233arbitrary binary @emph{data}.
6234The size of an element's data is limited to around 62 KB.
6235
6236@menu
6237* Local Sets::
6238* Set Modifications::
6239* Set Operations::
6240* Result Elements::
6241* libgnunetset::
6242* The SET Client-Service Protocol::
6243* The SET Intersection Peer-to-Peer Protocol::
6244* The SET Union Peer-to-Peer Protocol::
6245@end menu
6246
6247@node Local Sets
6248@subsection Local Sets
6249
6250@c %**end of header
6251
6252Sets created by a local client can be modified and reused for multiple
6253operations. As each set operation requires potentially expensive special
6254auxilliary data to be computed for each element of a set, a set can only
6255participate in one type of set operation (i.e. union or intersection).
6256The type of a set is determined upon its creation.
6257If a the elements of a set are needed for an operation of a different
6258type, all of the set's element must be copied to a new set of appropriate
6259type.
6260
6261@node Set Modifications
6262@subsection Set Modifications
6263
6264@c %**end of header
6265
6266Even when set operations are active, one can add to and remove elements
6267from a set.
6268However, these changes will only be visible to operations that have been
6269created after the changes have taken place. That is, every set operation
6270only sees a snapshot of the set from the time the operation was started.
6271This mechanism is @emph{not} implemented by copying the whole set, but by
6272attaching @emph{generation information} to each element and operation.
6273
6274@node Set Operations
6275@subsection Set Operations
6276
6277@c %**end of header
6278
6279Set operations can be started in two ways: Either by accepting an
6280operation request from a remote peer, or by requesting a set operation
6281from a remote peer.
6282Set operations are uniquely identified by the involved @emph{peers}, an
6283@emph{application id} and the @emph{operation type}.
6284
6285The client is notified of incoming set operations by @emph{set listeners}.
6286A set listener listens for incoming operations of a specific operation
6287type and application id.
6288Once notified of an incoming set request, the client can accept the set
6289request (providing a local set for the operation) or reject it.
6290
6291@node Result Elements
6292@subsection Result Elements
6293
6294@c %**end of header
6295
6296The SET service has three @emph{result modes} that determine how an
6297operation's result set is delivered to the client:
6298
6299@itemize @bullet
6300@item @strong{Full Result Set.} All elements of set resulting from the set
6301operation are returned to the client.
6302@item @strong{Added Elements.} Only elements that result from the
6303operation and are not already in the local peer's set are returned.
6304Note that for some operations (like set intersection) this result mode
6305will never return any elements.
6306This can be useful if only the remove peer is actually interested in
6307the result of the set operation.
6308@item @strong{Removed Elements.} Only elements that are in the local
6309peer's initial set but not in the operation's result set are returned.
6310Note that for some operations (like set union) this result mode will
6311never return any elements. This can be useful if only the remove peer is
6312actually interested in the result of the set operation.
6313@end itemize
6314
6315@cindex libgnunetset
6316@node libgnunetset
6317@subsection libgnunetset
6318
6319@c %**end of header
6320
6321@menu
6322* Sets::
6323* Listeners::
6324* Operations::
6325* Supplying a Set::
6326* The Result Callback::
6327@end menu
6328
6329@node Sets
6330@subsubsection Sets
6331
6332@c %**end of header
6333
6334New sets are created with @code{GNUNET_SET_create}. Both the local peer's
6335configuration (as each set has its own client connection) and the
6336operation type must be specified.
6337The set exists until either the client calls @code{GNUNET_SET_destroy} or
6338the client's connection to the service is disrupted.
6339In the latter case, the client is notified by the return value of
6340functions dealing with sets. This return value must always be checked.
6341
6342Elements are added and removed with @code{GNUNET_SET_add_element} and
6343@code{GNUNET_SET_remove_element}.
6344
6345@node Listeners
6346@subsubsection Listeners
6347
6348@c %**end of header
6349
6350Listeners are created with @code{GNUNET_SET_listen}. Each time time a
6351remote peer suggests a set operation with an application id and operation
6352type matching a listener, the listener's callback is invoked.
6353The client then must synchronously call either @code{GNUNET_SET_accept}
6354or @code{GNUNET_SET_reject}. Note that the operation will not be started
6355until the client calls @code{GNUNET_SET_commit}
6356(see Section "Supplying a Set").
6357
6358@node Operations
6359@subsubsection Operations
6360
6361@c %**end of header
6362
6363Operations to be initiated by the local peer are created with
6364@code{GNUNET_SET_prepare}. Note that the operation will not be started
6365until the client calls @code{GNUNET_SET_commit}
6366(see Section "Supplying a Set").
6367
6368@node Supplying a Set
6369@subsubsection Supplying a Set
6370
6371@c %**end of header
6372
6373To create symmetry between the two ways of starting a set operation
6374(accepting and nitiating it), the operation handles returned by
6375@code{GNUNET_SET_accept} and @code{GNUNET_SET_prepare} do not yet have a
6376set to operate on, thus they can not do any work yet.
6377
6378The client must call @code{GNUNET_SET_commit} to specify a set to use for
6379an operation. @code{GNUNET_SET_commit} may only be called once per set
6380operation.
6381
6382@node The Result Callback
6383@subsubsection The Result Callback
6384
6385@c %**end of header
6386
6387Clients must specify both a result mode and a result callback with
6388@code{GNUNET_SET_accept} and @code{GNUNET_SET_prepare}. The result
6389callback with a status indicating either that an element was received, or
6390the operation failed or succeeded.
6391The interpretation of the received element depends on the result mode.
6392The callback needs to know which result mode it is used in, as the
6393arguments do not indicate if an element is part of the full result set,
6394or if it is in the difference between the original set and the final set.
6395
6396@node The SET Client-Service Protocol
6397@subsection The SET Client-Service Protocol
6398
6399@c %**end of header
6400
6401@menu
6402* Creating Sets::
6403* Listeners2::
6404* Initiating Operations::
6405* Modifying Sets::
6406* Results and Operation Status::
6407* Iterating Sets::
6408@end menu
6409
6410@node Creating Sets
6411@subsubsection Creating Sets
6412
6413@c %**end of header
6414
6415For each set of a client, there exists a client connection to the service.
6416Sets are created by sending the @code{GNUNET_SERVICE_SET_CREATE} message
6417over a new client connection. Multiple operations for one set are
6418multiplexed over one client connection, using a request id supplied by
6419the client.
6420
6421@node Listeners2
6422@subsubsection Listeners2
6423
6424@c %**end of header
6425
6426Each listener also requires a seperate client connection. By sending the
6427@code{GNUNET_SERVICE_SET_LISTEN} message, the client notifies the service
6428of the application id and operation type it is interested in. A client
6429rejects an incoming request by sending @code{GNUNET_SERVICE_SET_REJECT}
6430on the listener's client connection.
6431In contrast, when accepting an incoming request, a
6432@code{GNUNET_SERVICE_SET_ACCEPT} message must be sent over the@ set that
6433is supplied for the set operation.
6434
6435@node Initiating Operations
6436@subsubsection Initiating Operations
6437
6438@c %**end of header
6439
6440Operations with remote peers are initiated by sending a
6441@code{GNUNET_SERVICE_SET_EVALUATE} message to the service. The@ client
6442connection that this message is sent by determines the set to use.
6443
6444@node Modifying Sets
6445@subsubsection Modifying Sets
6446
6447@c %**end of header
6448
6449Sets are modified with the @code{GNUNET_SERVICE_SET_ADD} and
6450@code{GNUNET_SERVICE_SET_REMOVE} messages.
6451
6452
6453@c %@menu
6454@c %* Results and Operation Status::
6455@c %* Iterating Sets::
6456@c %@end menu
6457
6458@node Results and Operation Status
6459@subsubsection Results and Operation Status
6460@c %**end of header
6461
6462The service notifies the client of result elements and success/failure of
6463a set operation with the @code{GNUNET_SERVICE_SET_RESULT} message.
6464
6465@node Iterating Sets
6466@subsubsection Iterating Sets
6467
6468@c %**end of header
6469
6470All elements of a set can be requested by sending
6471@code{GNUNET_SERVICE_SET_ITER_REQUEST}. The server responds with
6472@code{GNUNET_SERVICE_SET_ITER_ELEMENT} and eventually terminates the
6473iteration with @code{GNUNET_SERVICE_SET_ITER_DONE}.
6474After each received element, the client
6475must send @code{GNUNET_SERVICE_SET_ITER_ACK}. Note that only one set
6476iteration may be active for a set at any given time.
6477
6478@node The SET Intersection Peer-to-Peer Protocol
6479@subsection The SET Intersection Peer-to-Peer Protocol
6480
6481@c %**end of header
6482
6483The intersection protocol operates over CADET and starts with a
6484GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer
6485initiating the operation to the peer listening for inbound requests.
6486It includes the number of elements of the initiating peer, which is used
6487to decide which side will send a Bloom filter first.
6488
6489The listening peer checks if the operation type and application
6490identifier are acceptable for its current state.
6491If not, it responds with a GNUNET_MESSAGE_TYPE_SET_RESULT and a status of
6492GNUNET_SET_STATUS_FAILURE (and terminates the CADET channel).
6493
6494If the application accepts the request, the listener sends back a
6495@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO} if it has
6496more elements in the set than the client.
6497Otherwise, it immediately starts with the Bloom filter exchange.
6498If the initiator receives a
6499@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO} response,
6500it beings the Bloom filter exchange, unless the set size is indicated to
6501be zero, in which case the intersection is considered finished after
6502just the initial handshake.
6503
6504
6505@menu
6506* The Bloom filter exchange::
6507* Salt::
6508@end menu
6509
6510@node The Bloom filter exchange
6511@subsubsection The Bloom filter exchange
6512
6513@c %**end of header
6514
6515In this phase, each peer transmits a Bloom filter over the remaining
6516keys of the local set to the other peer using a
6517@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF} message. This
6518message additionally includes the number of elements left in the sender's
6519set, as well as the XOR over all of the keys in that set.
6520
6521The number of bits 'k' set per element in the Bloom filter is calculated
6522based on the relative size of the two sets.
6523Furthermore, the size of the Bloom filter is calculated based on 'k' and
6524the number of elements in the set to maximize the amount of data filtered
6525per byte transmitted on the wire (while avoiding an excessively high
6526number of iterations).
6527
6528The receiver of the message removes all elements from its local set that
6529do not pass the Bloom filter test.
6530It then checks if the set size of the sender and the XOR over the keys
6531match what is left of his own set. If they do, he sends a
6532@code{GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_DONE} back to indicate
6533that the latest set is the final result.
6534Otherwise, the receiver starts another Bloom fitler exchange, except
6535this time as the sender.
6536
6537@node Salt
6538@subsubsection Salt
6539
6540@c %**end of header
6541
6542Bloomfilter operations are probablistic: With some non-zero probability
6543the test may incorrectly say an element is in the set, even though it is
6544not.
6545
6546To mitigate this problem, the intersection protocol iterates exchanging
6547Bloom filters using a different random 32-bit salt in each iteration (the
6548salt is also included in the message).
6549With different salts, set operations may fail for different elements.
6550Merging the results from the executions, the probability of failure drops
6551to zero.
6552
6553The iterations terminate once both peers have established that they have
6554sets of the same size, and where the XOR over all keys computes the same
6555512-bit value (leaving a failure probability of 2-511).
6556
6557@node The SET Union Peer-to-Peer Protocol
6558@subsection The SET Union Peer-to-Peer Protocol
6559
6560@c %**end of header
6561
6562The SET union protocol is based on Eppstein's efficient set reconciliation
6563without prior context. You should read this paper first if you want to
6564understand the protocol.
6565
6566The union protocol operates over CADET and starts with a
6567GNUNET_MESSAGE_TYPE_SET_P2P_OPERATION_REQUEST being sent by the peer
6568initiating the operation to the peer listening for inbound requests.
6569It includes the number of elements of the initiating peer, which is
6570currently not used.
6571
6572The listening peer checks if the operation type and application
6573identifier are acceptable for its current state. If not, it responds with
6574a @code{GNUNET_MESSAGE_TYPE_SET_RESULT} and a status of
6575@code{GNUNET_SET_STATUS_FAILURE} (and terminates the CADET channel).
6576
6577If the application accepts the request, it sends back a strata estimator
6578using a message of type GNUNET_MESSAGE_TYPE_SET_UNION_P2P_SE. The
6579initiator evaluates the strata estimator and initiates the exchange of
6580invertible Bloom filters, sending a GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
6581
6582During the IBF exchange, if the receiver cannot invert the Bloom filter or
6583detects a cycle, it sends a larger IBF in response (up to a defined
6584maximum limit; if that limit is reached, the operation fails).
6585Elements decoded while processing the IBF are transmitted to the other
6586peer using GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS, or requested from the
6587other peer using GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS messages,
6588depending on the sign observed during decoding of the IBF.
6589Peers respond to a GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS message
6590with the respective element in a GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS
6591message. If the IBF fully decodes, the peer responds with a
6592GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE message instead of another
6593GNUNET_MESSAGE_TYPE_SET_UNION_P2P_IBF.
6594
6595All Bloom filter operations use a salt to mingle keys before hasing them
6596into buckets, such that future iterations have a fresh chance of
6597succeeding if they failed due to collisions before.
6598
6599@cindex STATISTICS Subsystem
6600@node STATISTICS Subsystem
6601@section STATISTICS Subsystem
6602
6603@c %**end of header
6604
6605In GNUnet, the STATISTICS subsystem offers a central place for all
6606subsystems to publish unsigned 64-bit integer run-time statistics.
6607Keeping this information centrally means that there is a unified way for
6608the user to obtain data on all subsystems, and individual subsystems do
6609not have to always include a custom data export method for performance
6610metrics and other statistics. For example, the TRANSPORT system uses
6611STATISTICS to update information about the number of directly connected
6612peers and the bandwidth that has been consumed by the various plugins.
6613This information is valuable for diagnosing connectivity and performance
6614issues.
6615
6616Following the GNUnet service architecture, the STATISTICS subsystem is
6617divided into an API which is exposed through the header
6618@strong{gnunet_statistics_service.h} and the STATISTICS service
6619@strong{gnunet-service-statistics}. The @strong{gnunet-statistics}
6620command-line tool can be used to obtain (and change) information about
6621the values stored by the STATISTICS service. The STATISTICS service does
6622not communicate with other peers.
6623
6624Data is stored in the STATISTICS service in the form of tuples
6625@strong{(subsystem, name, value, persistence)}. The subsystem determines
6626to which other GNUnet's subsystem the data belongs. name is the name
6627through which value is associated. It uniquely identifies the record
6628from among other records belonging to the same subsystem.
6629In some parts of the code, the pair @strong{(subsystem, name)} is called
6630a @strong{statistic} as it identifies the values stored in the STATISTCS
6631service.The persistence flag determines if the record has to be preserved
6632across service restarts. A record is said to be persistent if this flag
6633is set for it; if not, the record is treated as a non-persistent record
6634and it is lost after service restart. Persistent records are written to
6635and read from the file @strong{statistics.data} before shutdown
6636and upon startup. The file is located in the HOME directory of the peer.
6637
6638An anomaly of the STATISTICS service is that it does not terminate
6639immediately upon receiving a shutdown signal if it has any clients
6640connected to it. It waits for all the clients that are not monitors to
6641close their connections before terminating itself.
6642This is to prevent the loss of data during peer shutdown --- delaying the
6643STATISTICS service shutdown helps other services to store important data
6644to STATISTICS during shutdown.
6645
6646@menu
6647* libgnunetstatistics::
6648* The STATISTICS Client-Service Protocol::
6649@end menu
6650
6651@cindex libgnunetstatistics
6652@node libgnunetstatistics
6653@subsection libgnunetstatistics
6654
6655@c %**end of header
6656
6657@strong{libgnunetstatistics} is the library containing the API for the
6658STATISTICS subsystem. Any process requiring to use STATISTICS should use
6659this API by to open a connection to the STATISTICS service.
6660This is done by calling the function @code{GNUNET_STATISTICS_create()}.
6661This function takes the subsystem's name which is trying to use STATISTICS
6662and a configuration.
6663All values written to STATISTICS with this connection will be placed in
6664the section corresponding to the given subsystem's name.
6665The connection to STATISTICS can be destroyed with the function
6666@code{GNUNET_STATISTICS_destroy()}. This function allows for the
6667connection to be destroyed immediately or upon transferring all
6668pending write requests to the service.
6669
6670Note: STATISTICS subsystem can be disabled by setting @code{DISABLE = YES}
6671under the @code{[STATISTICS]} section in the configuration. With such a
6672configuration all calls to @code{GNUNET_STATISTICS_create()} return
6673@code{NULL} as the STATISTICS subsystem is unavailable and no other
6674functions from the API can be used.
6675
6676
6677@menu
6678* Statistics retrieval::
6679* Setting statistics and updating them::
6680* Watches::
6681@end menu
6682
6683@node Statistics retrieval
6684@subsubsection Statistics retrieval
6685
6686@c %**end of header
6687
6688Once a connection to the statistics service is obtained, information
6689about any other system which uses statistics can be retrieved with the
6690function GNUNET_STATISTICS_get().
6691This function takes the connection handle, the name of the subsystem
6692whose information we are interested in (a @code{NULL} value will
6693retrieve information of all available subsystems using STATISTICS), the
6694name of the statistic we are interested in (a @code{NULL} value will
6695retrieve all available statistics), a continuation callback which is
6696called when all of requested information is retrieved, an iterator
6697callback which is called for each parameter in the retrieved information
6698and a closure for the aforementioned callbacks. The library then invokes
6699the iterator callback for each value matching the request.
6700
6701Call to @code{GNUNET_STATISTICS_get()} is asynchronous and can be
6702canceled with the function @code{GNUNET_STATISTICS_get_cancel()}.
6703This is helpful when retrieving statistics takes too long and especially
6704when we want to shutdown and cleanup everything.
6705
6706@node Setting statistics and updating them
6707@subsubsection Setting statistics and updating them
6708
6709@c %**end of header
6710
6711So far we have seen how to retrieve statistics, here we will learn how we
6712can set statistics and update them so that other subsystems can retrieve
6713them.
6714
6715A new statistic can be set using the function
6716@code{GNUNET_STATISTICS_set()}.
6717This function takes the name of the statistic and its value and a flag to
6718make the statistic persistent.
6719The value of the statistic should be of the type @code{uint64_t}.
6720The function does not take the name of the subsystem; it is determined
6721from the previous @code{GNUNET_STATISTICS_create()} invocation. If
6722the given statistic is already present, its value is overwritten.
6723
6724An existing statistics can be updated, i.e its value can be increased or
6725decreased by an amount with the function
6726@code{GNUNET_STATISTICS_update()}.
6727The parameters to this function are similar to
6728@code{GNUNET_STATISTICS_set()}, except that it takes the amount to be
6729changed as a type @code{int64_t} instead of the value.
6730
6731The library will combine multiple set or update operations into one
6732message if the client performs requests at a rate that is faster than the
6733available IPC with the STATISTICS service. Thus, the client does not have
6734to worry about sending requests too quickly.
6735
6736@node Watches
6737@subsubsection Watches
6738
6739@c %**end of header
6740
6741As interesting feature of STATISTICS lies in serving notifications
6742whenever a statistic of our interest is modified.
6743This is achieved by registering a watch through the function
6744@code{GNUNET_STATISTICS_watch()}.
6745The parameters of this function are similar to those of
6746@code{GNUNET_STATISTICS_get()}.
6747Changes to the respective statistic's value will then cause the given
6748iterator callback to be called.
6749Note: A watch can only be registered for a specific statistic. Hence
6750the subsystem name and the parameter name cannot be @code{NULL} in a
6751call to @code{GNUNET_STATISTICS_watch()}.
6752
6753A registered watch will keep notifying any value changes until
6754@code{GNUNET_STATISTICS_watch_cancel()} is called with the same
6755parameters that are used for registering the watch.
6756
6757@node The STATISTICS Client-Service Protocol
6758@subsection The STATISTICS Client-Service Protocol
6759@c %**end of header
6760
6761
6762@menu
6763* Statistics retrieval2::
6764* Setting and updating statistics::
6765* Watching for updates::
6766@end menu
6767
6768@node Statistics retrieval2
6769@subsubsection Statistics retrieval2
6770
6771@c %**end of header
6772
6773To retrieve statistics, the client transmits a message of type
6774@code{GNUNET_MESSAGE_TYPE_STATISTICS_GET} containing the given subsystem
6775name and statistic parameter to the STATISTICS service.
6776The service responds with a message of type
6777@code{GNUNET_MESSAGE_TYPE_STATISTICS_VALUE} for each of the statistics
6778parameters that match the client request for the client. The end of
6779information retrieved is signaled by the service by sending a message of
6780type @code{GNUNET_MESSAGE_TYPE_STATISTICS_END}.
6781
6782@node Setting and updating statistics
6783@subsubsection Setting and updating statistics
6784
6785@c %**end of header
6786
6787The subsystem name, parameter name, its value and the persistence flag are
6788communicated to the service through the message
6789@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}.
6790
6791When the service receives a message of type
6792@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET}, it retrieves the subsystem
6793name and checks for a statistic parameter with matching the name given in
6794the message.
6795If a statistic parameter is found, the value is overwritten by the new
6796value from the message; if not found then a new statistic parameter is
6797created with the given name and value.
6798
6799In addition to just setting an absolute value, it is possible to perform a
6800relative update by sending a message of type
6801@code{GNUNET_MESSAGE_TYPE_STATISTICS_SET} with an update flag
6802(@code{GNUNET_STATISTICS_SETFLAG_RELATIVE}) signifying that the value in
6803the message should be treated as an update value.
6804
6805@node Watching for updates
6806@subsubsection Watching for updates
6807
6808@c %**end of header
6809
6810The function registers the watch at the service by sending a message of
6811type @code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH}. The service then sends
6812notifications through messages of type
6813@code{GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE} whenever the statistic
6814parameter's value is changed.
6815
6816@cindex DHT
6817@cindex Distributed Hash Table
6818@node Distributed Hash Table (DHT)
6819@section Distributed Hash Table (DHT)
6820
6821@c %**end of header
6822
6823GNUnet includes a generic distributed hash table that can be used by
6824developers building P2P applications in the framework.
6825This section documents high-level features and how developers are
6826expected to use the DHT.
6827We have a research paper detailing how the DHT works.
6828Also, Nate's thesis includes a detailed description and performance
6829analysis (in chapter 6).
6830
6831Key features of GNUnet's DHT include:
6832
6833@itemize @bullet
6834@item stores key-value pairs with values up to (approximately) 63k in size
6835@item works with many underlay network topologies (small-world, random
6836graph), underlay does not need to be a full mesh / clique
6837@item support for extended queries (more than just a simple 'key'),
6838filtering duplicate replies within the network (bloomfilter) and content
6839validation (for details, please read the subsection on the block library)
6840@item can (optionally) return paths taken by the PUT and GET operations
6841to the application
6842@item provides content replication to handle churn
6843@end itemize
6844
6845GNUnet's DHT is randomized and unreliable. Unreliable means that there is
6846no strict guarantee that a value stored in the DHT is always
6847found --- values are only found with high probability.
6848While this is somewhat true in all P2P DHTs, GNUnet developers should be
6849particularly wary of this fact (this will help you write secure,
6850fault-tolerant code). Thus, when writing any application using the DHT,
6851you should always consider the possibility that a value stored in the
6852DHT by you or some other peer might simply not be returned, or returned
6853with a significant delay.
6854Your application logic must be written to tolerate this (naturally, some
6855loss of performance or quality of service is expected in this case).
6856
6857@menu
6858* Block library and plugins::
6859* libgnunetdht::
6860* The DHT Client-Service Protocol::
6861* The DHT Peer-to-Peer Protocol::
6862@end menu
6863
6864@node Block library and plugins
6865@subsection Block library and plugins
6866
6867@c %**end of header
6868
6869@menu
6870* What is a Block?::
6871* The API of libgnunetblock::
6872* Queries::
6873* Sample Code::
6874* Conclusion2::
6875@end menu
6876
6877@node What is a Block?
6878@subsubsection What is a Block?
6879
6880@c %**end of header
6881
6882Blocks are small (< 63k) pieces of data stored under a key (struct
6883GNUNET_HashCode). Blocks have a type (enum GNUNET_BlockType) which defines
6884their data format. Blocks are used in GNUnet as units of static data
6885exchanged between peers and stored (or cached) locally.
6886Uses of blocks include file-sharing (the files are broken up into blocks),
6887the VPN (DNS information is stored in blocks) and the DHT (all
6888information in the DHT and meta-information for the maintenance of the
6889DHT are both stored using blocks).
6890The block subsystem provides a few common functions that must be
6891available for any type of block.
6892
6893@cindex libgnunetblock API
6894@node The API of libgnunetblock
6895@subsubsection The API of libgnunetblock
6896
6897@c %**end of header
6898
6899The block library requires for each (family of) block type(s) a block
6900plugin (implementing @file{gnunet_block_plugin.h}) that provides basic
6901functions that are needed by the DHT (and possibly other subsystems) to
6902manage the block.
6903These block plugins are typically implemented within their respective
6904subsystems.
6905The main block library is then used to locate, load and query the
6906appropriate block plugin.
6907Which plugin is appropriate is determined by the block type (which is
6908just a 32-bit integer). Block plugins contain code that specifies which
6909block types are supported by a given plugin. The block library loads all
6910block plugins that are installed at the local peer and forwards the
6911application request to the respective plugin.
6912
6913The central functions of the block APIs (plugin and main library) are to
6914allow the mapping of blocks to their respective key (if possible) and the
6915ability to check that a block is well-formed and matches a given
6916request (again, if possible).
6917This way, GNUnet can avoid storing invalid blocks, storing blocks under
6918the wrong key and forwarding blocks in response to a query that they do
6919not answer.
6920
6921One key function of block plugins is that it allows GNUnet to detect
6922duplicate replies (via the Bloom filter). All plugins MUST support
6923detecting duplicate replies (by adding the current response to the
6924Bloom filter and rejecting it if it is encountered again).
6925If a plugin fails to do this, responses may loop in the network.
6926
6927@node Queries
6928@subsubsection Queries
6929@c %**end of header
6930
6931The query format for any block in GNUnet consists of four main components.
6932First, the type of the desired block must be specified. Second, the query
6933must contain a hash code. The hash code is used for lookups in hash
6934tables and databases and must not be unique for the block (however, if
6935possible a unique hash should be used as this would be best for
6936performance).
6937Third, an optional Bloom filter can be specified to exclude known results;
6938replies that hash to the bits set in the Bloom filter are considered
6939invalid. False-positives can be eliminated by sending the same query
6940again with a different Bloom filter mutator value, which parameterizes
6941the hash function that is used.
6942Finally, an optional application-specific "eXtended query" (xquery) can
6943be specified to further constrain the results. It is entirely up to
6944the type-specific plugin to determine whether or not a given block
6945matches a query (type, hash, Bloom filter, and xquery).
6946Naturally, not all xquery's are valid and some types of blocks may not
6947support Bloom filters either, so the plugin also needs to check if the
6948query is valid in the first place.
6949
6950Depending on the results from the plugin, the DHT will then discard the
6951(invalid) query, forward the query, discard the (invalid) reply, cache the
6952(valid) reply, and/or forward the (valid and non-duplicate) reply.
6953
6954@node Sample Code
6955@subsubsection Sample Code
6956
6957@c %**end of header
6958
6959The source code in @strong{plugin_block_test.c} is a good starting point
6960for new block plugins --- it does the minimal work by implementing a
6961plugin that performs no validation at all.
6962The respective @strong{Makefile.am} shows how to build and install a
6963block plugin.
6964
6965@node Conclusion2
6966@subsubsection Conclusion2
6967
6968@c %**end of header
6969
6970In conclusion, GNUnet subsystems that want to use the DHT need to define a
6971block format and write a plugin to match queries and replies. For testing,
6972the @code{GNUNET_BLOCK_TYPE_TEST} block type can be used; it accepts
6973any query as valid and any reply as matching any query.
6974This type is also used for the DHT command line tools.
6975However, it should NOT be used for normal applications due to the lack
6976of error checking that results from this primitive implementation.
6977
6978@cindex libgnunetdht
6979@node libgnunetdht
6980@subsection libgnunetdht
6981
6982@c %**end of header
6983
6984The DHT API itself is pretty simple and offers the usual GET and PUT
6985functions that work as expected. The specified block type refers to the
6986block library which allows the DHT to run application-specific logic for
6987data stored in the network.
6988
6989
6990@menu
6991* GET::
6992* PUT::
6993* MONITOR::
6994* DHT Routing Options::
6995@end menu
6996
6997@node GET
6998@subsubsection GET
6999
7000@c %**end of header
7001
7002When using GET, the main consideration for developers (other than the
7003block library) should be that after issuing a GET, the DHT will
7004continuously cause (small amounts of) network traffic until the operation
7005is explicitly canceled.
7006So GET does not simply send out a single network request once; instead,
7007the DHT will continue to search for data. This is needed to achieve good
7008success rates and also handles the case where the respective PUT
7009operation happens after the GET operation was started.
7010Developers should not cancel an existing GET operation and then
7011explicitly re-start it to trigger a new round of network requests;
7012this is simply inefficient, especially as the internal automated version
7013can be more efficient, for example by filtering results in the network
7014that have already been returned.
7015
7016If an application that performs a GET request has a set of replies that it
7017already knows and would like to filter, it can call@
7018@code{GNUNET_DHT_get_filter_known_results} with an array of hashes over
7019the respective blocks to tell the DHT that these results are not
7020desired (any more).
7021This way, the DHT will filter the respective blocks using the block
7022library in the network, which may result in a significant reduction in
7023bandwidth consumption.
7024
7025@node PUT
7026@subsubsection PUT
7027
7028@c %**end of header
7029
7030In contrast to GET operations, developers @strong{must} manually re-run
7031PUT operations periodically (if they intend the content to continue to be
7032available). Content stored in the DHT expires or might be lost due to
7033churn.
7034Furthermore, GNUnet's DHT typically requires multiple rounds of PUT
7035operations before a key-value pair is consistently available to all
7036peers (the DHT randomizes paths and thus storage locations, and only
7037after multiple rounds of PUTs there will be a sufficient number of
7038replicas in large DHTs). An explicit PUT operation using the DHT API will
7039only cause network traffic once, so in order to ensure basic availability
7040and resistance to churn (and adversaries), PUTs must be repeated.
7041While the exact frequency depends on the application, a rule of thumb is
7042that there should be at least a dozen PUT operations within the content
7043lifetime. Content in the DHT typically expires after one day, so
7044DHT PUT operations should be repeated at least every 1-2 hours.
7045
7046@node MONITOR
7047@subsubsection MONITOR
7048
7049@c %**end of header
7050
7051The DHT API also allows applications to monitor messages crossing the
7052local DHT service.
7053The types of messages used by the DHT are GET, PUT and RESULT messages.
7054Using the monitoring API, applications can choose to monitor these
7055requests, possibly limiting themselves to requests for a particular block
7056type.
7057
7058The monitoring API is not only usefu only for diagnostics, it can also be
7059used to trigger application operations based on PUT operations.
7060For example, an application may use PUTs to distribute work requests to
7061other peers.
7062The workers would then monitor for PUTs that give them work, instead of
7063looking for work using GET operations.
7064This can be beneficial, especially if the workers have no good way to
7065guess the keys under which work would be stored.
7066Naturally, additional protocols might be needed to ensure that the desired
7067number of workers will process the distributed workload.
7068
7069@node DHT Routing Options
7070@subsubsection DHT Routing Options
7071
7072@c %**end of header
7073
7074There are two important options for GET and PUT requests:
7075
7076@table @asis
7077@item GNUNET_DHT_RO_DEMULITPLEX_EVERYWHERE This option means that all
7078peers should process the request, even if their peer ID is not closest to
7079the key. For a PUT request, this means that all peers that a request
7080traverses may make a copy of the data.
7081Similarly for a GET request, all peers will check their local database
7082for a result. Setting this option can thus significantly improve caching
7083and reduce bandwidth consumption --- at the expense of a larger DHT
7084database. If in doubt, we recommend that this option should be used.
7085@item GNUNET_DHT_RO_RECORD_ROUTE This option instructs the DHT to record
7086the path that a GET or a PUT request is taking through the overlay
7087network. The resulting paths are then returned to the application with
7088the respective result. This allows the receiver of a result to construct
7089a path to the originator of the data, which might then be used for
7090routing. Naturally, setting this option requires additional bandwidth
7091and disk space, so applications should only set this if the paths are
7092needed by the application logic.
7093@item GNUNET_DHT_RO_FIND_PEER This option is an internal option used by
7094the DHT's peer discovery mechanism and should not be used by applications.
7095@item GNUNET_DHT_RO_BART This option is currently not implemented. It may
7096in the future offer performance improvements for clique topologies.
7097@end table
7098
7099@node The DHT Client-Service Protocol
7100@subsection The DHT Client-Service Protocol
7101
7102@c %**end of header
7103
7104@menu
7105* PUTting data into the DHT::
7106* GETting data from the DHT::
7107* Monitoring the DHT::
7108@end menu
7109
7110@node PUTting data into the DHT
7111@subsubsection PUTting data into the DHT
7112
7113@c %**end of header
7114
7115To store (PUT) data into the DHT, the client sends a
7116@code{struct GNUNET_DHT_ClientPutMessage} to the service.
7117This message specifies the block type, routing options, the desired
7118replication level, the expiration time, key,
7119value and a 64-bit unique ID for the operation. The service responds with
7120a @code{struct GNUNET_DHT_ClientPutConfirmationMessage} with the same
712164-bit unique ID. Note that the service sends the confirmation as soon as
7122it has locally processed the PUT request. The PUT may still be
7123propagating through the network at this time.
7124
7125In the future, we may want to change this to provide (limited) feedback
7126to the client, for example if we detect that the PUT operation had no
7127effect because the same key-value pair was already stored in the DHT.
7128However, changing this would also require additional state and messages
7129in the P2P interaction.
7130
7131@node GETting data from the DHT
7132@subsubsection GETting data from the DHT
7133
7134@c %**end of header
7135
7136To retrieve (GET) data from the DHT, the client sends a
7137@code{struct GNUNET_DHT_ClientGetMessage} to the service. The message
7138specifies routing options, a replication level (for replicating the GET,
7139not the content), the desired block type, the key, the (optional)
7140extended query and unique 64-bit request ID.
7141
7142Additionally, the client may send any number of
7143@code{struct GNUNET_DHT_ClientGetResultSeenMessage}s to notify the
7144service about results that the client is already aware of.
7145These messages consist of the key, the unique 64-bit ID of the request,
7146and an arbitrary number of hash codes over the blocks that the client is
7147already aware of. As messages are restricted to 64k, a client that
7148already knows more than about a thousand blocks may need to send
7149several of these messages. Naturally, the client should transmit these
7150messages as quickly as possible after the original GET request such that
7151the DHT can filter those results in the network early on. Naturally, as
7152these messages are send after the original request, it is conceivalbe
7153that the DHT service may return blocks that match those already known
7154to the client anyway.
7155
7156In response to a GET request, the service will send @code{struct
7157GNUNET_DHT_ClientResultMessage}s to the client. These messages contain the
7158block type, expiration, key, unique ID of the request and of course the
7159value (a block). Depending on the options set for the respective
7160operations, the replies may also contain the path the GET and/or the PUT
7161took through the network.
7162
7163A client can stop receiving replies either by disconnecting or by sending
7164a @code{struct GNUNET_DHT_ClientGetStopMessage} which must contain the
7165key and the 64-bit unique ID of the original request. Using an
7166explicit "stop" message is more common as this allows a client to run
7167many concurrent GET operations over the same connection with the DHT
7168service --- and to stop them individually.
7169
7170@node Monitoring the DHT
7171@subsubsection Monitoring the DHT
7172
7173@c %**end of header
7174
7175To begin monitoring, the client sends a
7176@code{struct GNUNET_DHT_MonitorStartStop} message to the DHT service.
7177In this message, flags can be set to enable (or disable) monitoring of
7178GET, PUT and RESULT messages that pass through a peer. The message can
7179also restrict monitoring to a particular block type or a particular key.
7180Once monitoring is enabled, the DHT service will notify the client about
7181any matching event using @code{struct GNUNET_DHT_MonitorGetMessage}s for
7182GET events, @code{struct GNUNET_DHT_MonitorPutMessage} for PUT events
7183and @code{struct GNUNET_DHT_MonitorGetRespMessage} for RESULTs. Each of
7184these messages contains all of the information about the event.
7185
7186@node The DHT Peer-to-Peer Protocol
7187@subsection The DHT Peer-to-Peer Protocol
7188@c %**end of header
7189
7190
7191@menu
7192* Routing GETs or PUTs::
7193* PUTting data into the DHT2::
7194* GETting data from the DHT2::
7195@end menu
7196
7197@node Routing GETs or PUTs
7198@subsubsection Routing GETs or PUTs
7199
7200@c %**end of header
7201
7202When routing GETs or PUTs, the DHT service selects a suitable subset of
7203neighbours for forwarding. The exact number of neighbours can be zero or
7204more and depends on the hop counter of the query (initially zero) in
7205relation to the (log of) the network size estimate, the desired
7206replication level and the peer's connectivity.
7207Depending on the hop counter and our network size estimate, the selection
7208of the peers maybe randomized or by proximity to the key.
7209Furthermore, requests include a set of peers that a request has already
7210traversed; those peers are also excluded from the selection.
7211
7212@node PUTting data into the DHT2
7213@subsubsection PUTting data into the DHT2
7214
7215@c %**end of header
7216
7217To PUT data into the DHT, the service sends a @code{struct PeerPutMessage}
7218of type @code{GNUNET_MESSAGE_TYPE_DHT_P2P_PUT} to the respective
7219neighbour.
7220In addition to the usual information about the content (type, routing
7221options, desired replication level for the content, expiration time, key
7222and value), the message contains a fixed-size Bloom filter with
7223information about which peers (may) have already seen this request.
7224This Bloom filter is used to ensure that DHT messages never loop back to
7225a peer that has already processed the request.
7226Additionally, the message includes the current hop counter and, depending
7227on the routing options, the message may include the full path that the
7228message has taken so far.
7229The Bloom filter should already contain the identity of the previous hop;
7230however, the path should not include the identity of the previous hop and
7231the receiver should append the identity of the sender to the path, not
7232its own identity (this is done to reduce bandwidth).
7233
7234@node GETting data from the DHT2
7235@subsubsection GETting data from the DHT2
7236
7237@c %**end of header
7238
7239A peer can search the DHT by sending @code{struct PeerGetMessage}s of type
7240@code{GNUNET_MESSAGE_TYPE_DHT_P2P_GET} to other peers. In addition to the
7241usual information about the request (type, routing options, desired
7242replication level for the request, the key and the extended query), a GET
7243request also again contains a hop counter, a Bloom filter over the peers
7244that have processed the request already and depending on the routing
7245options the full path traversed by the GET.
7246Finally, a GET request includes a variable-size second Bloom filter and a
7247so-called Bloom filter mutator value which together indicate which
7248replies the sender has already seen. During the lookup, each block that
7249matches they block type, key and extended query is additionally subjected
7250to a test against this Bloom filter.
7251The block plugin is expected to take the hash of the block and combine it
7252with the mutator value and check if the result is not yet in the Bloom
7253filter. The originator of the query will from time to time modify the
7254mutator to (eventually) allow false-positives filtered by the Bloom filter
7255to be returned.
7256
7257Peers that receive a GET request perform a local lookup (depending on
7258their proximity to the key and the query options) and forward the request
7259to other peers.
7260They then remember the request (including the Bloom filter for blocking
7261duplicate results) and when they obtain a matching, non-filtered response
7262a @code{struct PeerResultMessage} of type
7263@code{GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT} is forwarded to the previous
7264hop.
7265Whenver a result is forwarded, the block plugin is used to update the
7266Bloom filter accordingly, to ensure that the same result is never
7267forwarded more than once.
7268The DHT service may also cache forwarded results locally if the
7269"CACHE_RESULTS" option is set to "YES" in the configuration.
7270
7271@cindex GNS
7272@cindex GNU Name System
7273@node GNU Name System (GNS)
7274@section GNU Name System (GNS)
7275
7276@c %**end of header
7277
7278The GNU Name System (GNS) is a decentralized database that enables users
7279to securely resolve names to values.
7280Names can be used to identify other users (for example, in social
7281networking), or network services (for example, VPN services running at a
7282peer in GNUnet, or purely IP-based services on the Internet).
7283Users interact with GNS by typing in a hostname that ends in ".gnu"
7284or ".zkey".
7285
7286Videos giving an overview of most of the GNS and the motivations behind
7287it is available here and here.
7288The remainder of this chapter targets developers that are familiar with
7289high level concepts of GNS as presented in these talks.
7290@c TODO: Add links to here and here and to these.
7291
7292GNS-aware applications should use the GNS resolver to obtain the
7293respective records that are stored under that name in GNS.
7294Each record consists of a type, value, expiration time and flags.
7295
7296The type specifies the format of the value. Types below 65536 correspond
7297to DNS record types, larger values are used for GNS-specific records.
7298Applications can define new GNS record types by reserving a number and
7299implementing a plugin (which mostly needs to convert the binary value
7300representation to a human-readable text format and vice-versa).
7301The expiration time specifies how long the record is to be valid.
7302The GNS API ensures that applications are only given non-expired values.
7303The flags are typically irrelevant for applications, as GNS uses them
7304internally to control visibility and validity of records.
7305
7306Records are stored along with a signature.
7307The signature is generated using the private key of the authoritative
7308zone. This allows any GNS resolver to verify the correctness of a
7309name-value mapping.
7310
7311Internally, GNS uses the NAMECACHE to cache information obtained from
7312other users, the NAMESTORE to store information specific to the local
7313users, and the DHT to exchange data between users.
7314A plugin API is used to enable applications to define new GNS
7315record types.
7316
7317@menu
7318* libgnunetgns::
7319* libgnunetgnsrecord::
7320* GNS plugins::
7321* The GNS Client-Service Protocol::
7322* Hijacking the DNS-Traffic using gnunet-service-dns::
7323* Serving DNS lookups via GNS on W32::
7324@end menu
7325
7326@node libgnunetgns
7327@subsection libgnunetgns
7328
7329@c %**end of header
7330
7331The GNS API itself is extremely simple. Clients first connec to the
7332GNS service using @code{GNUNET_GNS_connect}.
7333They can then perform lookups using @code{GNUNET_GNS_lookup} or cancel
7334pending lookups using @code{GNUNET_GNS_lookup_cancel}.
7335Once finished, clients disconnect using @code{GNUNET_GNS_disconnect}.
7336
7337@menu
7338* Looking up records::
7339* Accessing the records::
7340* Creating records::
7341* Future work::
7342@end menu
7343
7344@node Looking up records
7345@subsubsection Looking up records
7346
7347@c %**end of header
7348
7349@code{GNUNET_GNS_lookup} takes a number of arguments:
7350
7351@table @asis
7352@item handle This is simply the GNS connection handle from
7353@code{GNUNET_GNS_connect}.
7354@item name The client needs to specify the name to
7355be resolved. This can be any valid DNS or GNS hostname.
7356@item zone The client
7357needs to specify the public key of the GNS zone against which the
7358resolution should be done (the ".gnu" zone).
7359Note that a key must be provided, even if the name ends in ".zkey".
7360This should typically be the public key of the master-zone of the user.
7361@item type This is the desired GNS or DNS record type
7362to look for. While all records for the given name will be returned, this
7363can be important if the client wants to resolve record types that
7364themselves delegate resolution, such as CNAME, PKEY or GNS2DNS.
7365Resolving a record of any of these types will only work if the respective
7366record type is specified in the request, as the GNS resolver will
7367otherwise follow the delegation and return the records from the
7368respective destination, instead of the delegating record.
7369@item only_cached This argument should typically be set to
7370@code{GNUNET_NO}. Setting it to @code{GNUNET_YES} disables resolution via
7371the overlay network.
7372@item shorten_zone_key If GNS encounters new names during resolution,
7373their respective zones can automatically be learned and added to the
7374"shorten zone". If this is desired, clients must pass the private key of
7375the shorten zone. If NULL is passed, shortening is disabled.
7376@item proc This argument identifies
7377the function to call with the result. It is given proc_cls, the number of
7378records found (possilby zero) and the array of the records as arguments.
7379proc will only be called once. After proc,> has been called, the lookup
7380must no longer be cancelled.
7381@item proc_cls The closure for proc.
7382@end table
7383
7384@node Accessing the records
7385@subsubsection Accessing the records
7386
7387@c %**end of header
7388
7389The @code{libgnunetgnsrecord} library provides an API to manipulate the
7390GNS record array that is given to proc. In particular, it offers
7391functions such as converting record values to human-readable
7392strings (and back). However, most @code{libgnunetgnsrecord} functions are
7393not interesting to GNS client applications.
7394
7395For DNS records, the @code{libgnunetdnsparser} library provides
7396functions for parsing (and serializing) common types of DNS records.
7397
7398@node Creating records
7399@subsubsection Creating records
7400
7401@c %**end of header
7402
7403Creating GNS records is typically done by building the respective record
7404information (possibly with the help of @code{libgnunetgnsrecord} and
7405@code{libgnunetdnsparser}) and then using the @code{libgnunetnamestore} to
7406publish the information. The GNS API is not involved in this
7407operation.
7408
7409@node Future work
7410@subsubsection Future work
7411
7412@c %**end of header
7413
7414In the future, we want to expand @code{libgnunetgns} to allow
7415applications to observe shortening operations performed during GNS
7416resolution, for example so that users can receive visual feedback when
7417this happens.
7418
7419@node libgnunetgnsrecord
7420@subsection libgnunetgnsrecord
7421
7422@c %**end of header
7423
7424The @code{libgnunetgnsrecord} library is used to manipulate GNS
7425records (in plaintext or in their encrypted format).
7426Applications mostly interact with @code{libgnunetgnsrecord} by using the
7427functions to convert GNS record values to strings or vice-versa, or to
7428lookup a GNS record type number by name (or vice-versa).
7429The library also provides various other functions that are mostly
7430used internally within GNS, such as converting keys to names, checking for
7431expiration, encrypting GNS records to GNS blocks, verifying GNS block
7432signatures and decrypting GNS records from GNS blocks.
7433
7434We will now discuss the four commonly used functions of the API.@
7435@code{libgnunetgnsrecord} does not perform these operations itself,
7436but instead uses plugins to perform the operation.
7437GNUnet includes plugins to support common DNS record types as well as
7438standard GNS record types.
7439
7440@menu
7441* Value handling::
7442* Type handling::
7443@end menu
7444
7445@node Value handling
7446@subsubsection Value handling
7447
7448@c %**end of header
7449
7450@code{GNUNET_GNSRECORD_value_to_string} can be used to convert
7451the (binary) representation of a GNS record value to a human readable,
74520-terminated UTF-8 string.
7453NULL is returned if the specified record type is not supported by any
7454available plugin.
7455
7456@code{GNUNET_GNSRECORD_string_to_value} can be used to try to convert a
7457human readable string to the respective (binary) representation of
7458a GNS record value.
7459
7460@node Type handling
7461@subsubsection Type handling
7462
7463@c %**end of header
7464
7465@code{GNUNET_GNSRECORD_typename_to_number} can be used to obtain the
7466numeric value associated with a given typename. For example, given the
7467typename "A" (for DNS A reocrds), the function will return the number 1.
7468A list of common DNS record types is
7469@uref{http://en.wikipedia.org/wiki/List_of_DNS_record_types, here}.
7470Note that not all DNS record types are supported by GNUnet GNSRECORD
7471plugins at this time.
7472
7473@code{GNUNET_GNSRECORD_number_to_typename} can be used to obtain the
7474typename associated with a given numeric value.
7475For example, given the type number 1, the function will return the
7476typename "A".
7477
7478@node GNS plugins
7479@subsection GNS plugins
7480
7481@c %**end of header
7482
7483Adding a new GNS record type typically involves writing (or extending) a
7484GNSRECORD plugin. The plugin needs to implement the
7485@code{gnunet_gnsrecord_plugin.h} API which provides basic functions that
7486are needed by GNSRECORD to convert typenames and values of the respective
7487record type to strings (and back).
7488These gnsrecord plugins are typically implemented within their respective
7489subsystems.
7490Examples for such plugins can be found in the GNSRECORD, GNS and
7491CONVERSATION subsystems.
7492
7493The @code{libgnunetgnsrecord} library is then used to locate, load and
7494query the appropriate gnsrecord plugin.
7495Which plugin is appropriate is determined by the record type (which is
7496just a 32-bit integer). The @code{libgnunetgnsrecord} library loads all
7497block plugins that are installed at the local peer and forwards the
7498application request to the plugins. If the record type is not
7499supported by the plugin, it should simply return an error code.
7500
7501The central functions of the block APIs (plugin and main library) are the
7502same four functions for converting between values and strings, and
7503typenames and numbers documented in the previous subsection.
7504
7505@node The GNS Client-Service Protocol
7506@subsection The GNS Client-Service Protocol
7507@c %**end of header
7508
7509The GNS client-service protocol consists of two simple messages, the
7510@code{LOOKUP} message and the @code{LOOKUP_RESULT}. Each @code{LOOKUP}
7511message contains a unique 32-bit identifier, which will be included in the
7512corresponding response. Thus, clients can send many lookup requests in
7513parallel and receive responses out-of-order.
7514A @code{LOOKUP} request also includes the public key of the GNS zone,
7515the desired record type and fields specifying whether shortening is
7516enabled or networking is disabled. Finally, the @code{LOOKUP} message
7517includes the name to be resolved.
7518
7519The response includes the number of records and the records themselves
7520in the format created by @code{GNUNET_GNSRECORD_records_serialize}.
7521They can thus be deserialized using
7522@code{GNUNET_GNSRECORD_records_deserialize}.
7523
7524@node Hijacking the DNS-Traffic using gnunet-service-dns
7525@subsection Hijacking the DNS-Traffic using gnunet-service-dns
7526
7527@c %**end of header
7528
7529This section documents how the gnunet-service-dns (and the
7530gnunet-helper-dns) intercepts DNS queries from the local system.
7531This is merely one method for how we can obtain GNS queries.
7532It is also possible to change @code{resolv.conf} to point to a machine
7533running @code{gnunet-dns2gns} or to modify libc's name system switch
7534(NSS) configuration to include a GNS resolution plugin.
7535The method described in this chaper is more of a last-ditch catch-all
7536approach.
7537
7538@code{gnunet-service-dns} enables intercepting DNS traffic using policy
7539based routing.
7540We MARK every outgoing DNS-packet if it was not sent by our application.
7541Using a second routing table in the Linux kernel these marked packets are
7542then routed through our virtual network interface and can thus be
7543captured unchanged.
7544
7545Our application then reads the query and decides how to handle it: A
7546query to an address ending in ".gnu" or ".zkey" is hijacked by
7547@code{gnunet-service-gns} and resolved internally using GNS.
7548In the future, a reverse query for an address of the configured virtual
7549network could be answered with records kept about previous forward
7550queries.
7551Queries that are not hijacked by some application using the DNS service
7552will be sent to the original recipient.
7553The answer to the query will always be sent back through the virtual
7554interface with the original nameserver as source address.
7555
7556
7557@menu
7558* Network Setup Details::
7559@end menu
7560
7561@node Network Setup Details
7562@subsubsection Network Setup Details
7563
7564@c %**end of header
7565
7566The DNS interceptor adds the following rules to the Linux kernel:
7567@example
7568iptables -t mangle -I OUTPUT 1 -p udp --sport $LOCALPORT --dport 53 \
7569-j ACCEPT iptables -t mangle -I OUTPUT 2 -p udp --dport 53 -j MARK \
7570--set-mark 3 ip rule add fwmark 3 table2 ip route add default via \
7571$VIRTUALDNS table2
7572@end example
7573
7574@c FIXME: Rewrite to reflect display which is no longer content by line
7575@c FIXME: due to the < 74 characters limit.
7576Line 1 makes sure that all packets coming from a port our application
7577opened beforehand (@code{$LOCALPORT}) will be routed normally.
7578Line 2 marks every other packet to a DNS-Server with mark 3 (chosen
7579arbitrarily). The third line adds a routing policy based on this mark
75803 via the routing table.
7581
7582@node Serving DNS lookups via GNS on W32
7583@subsection Serving DNS lookups via GNS on W32
7584
7585@c %**end of header
7586
7587This section documents how the libw32nsp (and
7588gnunet-gns-helper-service-w32) do DNS resolutions of DNS queries on the
7589local system. This only applies to GNUnet running on W32.
7590
7591W32 has a concept of "Namespaces" and "Namespace providers".
7592These are used to present various name systems to applications in a
7593generic way.
7594Namespaces include DNS, mDNS, NLA and others. For each namespace any
7595number of providers could be registered, and they are queried in an order
7596of priority (which is adjustable).
7597
7598Applications can resolve names by using WSALookupService*() family of
7599functions.
7600
7601However, these are WSA-only facilities. Common BSD socket functions for
7602namespace resolutions are gethostbyname and getaddrinfo (among others).
7603These functions are implemented internally (by default - by mswsock,
7604which also implements the default DNS provider) as wrappers around
7605WSALookupService*() functions (see "Sample Code for a Service Provider"
7606on MSDN).
7607
7608On W32 GNUnet builds a libw32nsp - a namespace provider, which can then be
7609installed into the system by using w32nsp-install (and uninstalled by
7610w32nsp-uninstall), as described in "Installation Handbook".
7611
7612libw32nsp is very simple and has almost no dependencies. As a response to
7613NSPLookupServiceBegin(), it only checks that the provider GUID passed to
7614it by the caller matches GNUnet DNS Provider GUID, checks that name being
7615resolved ends in ".gnu" or ".zkey", then connects to
7616gnunet-gns-helper-service-w32 at 127.0.0.1:5353 (hardcoded) and sends the
7617name resolution request there, returning the connected socket to the
7618caller.
7619
7620When the caller invokes NSPLookupServiceNext(), libw32nsp reads a
7621completely formed reply from that socket, unmarshalls it, then gives
7622it back to the caller.
7623
7624At the moment gnunet-gns-helper-service-w32 is implemented to ever give
7625only one reply, and subsequent calls to NSPLookupServiceNext() will fail
7626with WSA_NODATA (first call to NSPLookupServiceNext() might also fail if
7627GNS failed to find the name, or there was an error connecting to it).
7628
7629gnunet-gns-helper-service-w32 does most of the processing:
7630
7631@itemize @bullet
7632@item Maintains a connection to GNS.
7633@item Reads GNS config and loads appropriate keys.
7634@item Checks service GUID and decides on the type of record to look up,
7635refusing to make a lookup outright when unsupported service GUID is
7636passed.
7637@item Launches the lookup
7638@end itemize
7639
7640When lookup result arrives, gnunet-gns-helper-service-w32 forms a complete
7641reply (including filling a WSAQUERYSETW structure and, possibly, a binary
7642blob with a hostent structure for gethostbyname() client), marshalls it,
7643and sends it back to libw32nsp. If no records were found, it sends an
7644empty header.
7645
7646This works for most normal applications that use gethostbyname() or
7647getaddrinfo() to resolve names, but fails to do anything with
7648applications that use alternative means of resolving names (such as
7649sending queries to a DNS server directly by themselves).
7650This includes some of well known utilities, like "ping" and "nslookup".
7651
7652@cindex GNS Namecache
7653@node GNS Namecache
7654@section GNS Namecache
7655
7656@c %**end of header
7657
7658The NAMECACHE subsystem is responsible for caching (encrypted) resolution
7659results of the GNU Name System (GNS). GNS makes zone information available
7660to other users via the DHT. However, as accessing the DHT for every
7661lookup is expensive (and as the DHT's local cache is lost whenever the
7662peer is restarted), GNS uses the NAMECACHE as a more persistent cache for
7663DHT lookups.
7664Thus, instead of always looking up every name in the DHT, GNS first
7665checks if the result is already available locally in the NAMECACHE.
7666Only if there is no result in the NAMECACHE, GNS queries the DHT.
7667The NAMECACHE stores data in the same (encrypted) format as the DHT.
7668It thus makes no sense to iterate over all items in the
7669NAMECACHE --- the NAMECACHE does not have a way to provide the keys
7670required to decrypt the entries.
7671
7672Blocks in the NAMECACHE share the same expiration mechanism as blocks in
7673the DHT --- the block expires wheneever any of the records in
7674the (encrypted) block expires.
7675The expiration time of the block is the only information stored in
7676plaintext. The NAMECACHE service internally performs all of the required
7677work to expire blocks, clients do not have to worry about this.
7678Also, given that NAMECACHE stores only GNS blocks that local users
7679requested, there is no configuration option to limit the size of the
7680NAMECACHE. It is assumed to be always small enough (a few MB) to fit on
7681the drive.
7682
7683The NAMECACHE supports the use of different database backends via a
7684plugin API.
7685
7686@menu
7687* libgnunetnamecache::
7688* The NAMECACHE Client-Service Protocol::
7689* The NAMECACHE Plugin API::
7690@end menu
7691
7692@node libgnunetnamecache
7693@subsection libgnunetnamecache
7694
7695@c %**end of header
7696
7697The NAMECACHE API consists of five simple functions. First, there is
7698@code{GNUNET_NAMECACHE_connect} to connect to the NAMECACHE service.
7699This returns the handle required for all other operations on the
7700NAMECACHE. Using @code{GNUNET_NAMECACHE_block_cache} clients can insert a
7701block into the cache.
7702@code{GNUNET_NAMECACHE_lookup_block} can be used to lookup blocks that
7703were stored in the NAMECACHE. Both operations can be cancelled using
7704@code{GNUNET_NAMECACHE_cancel}. Note that cancelling a
7705@code{GNUNET_NAMECACHE_block_cache} operation can result in the block
7706being stored in the NAMECACHE --- or not. Cancellation primarily ensures
7707that the continuation function with the result of the operation will no
7708longer be invoked.
7709Finally, @code{GNUNET_NAMECACHE_disconnect} closes the connection to the
7710NAMECACHE.
7711
7712The maximum size of a block that can be stored in the NAMECACHE is
7713@code{GNUNET_NAMECACHE_MAX_VALUE_SIZE}, which is defined to be 63 kB.
7714
7715@node The NAMECACHE Client-Service Protocol
7716@subsection The NAMECACHE Client-Service Protocol
7717
7718@c %**end of header
7719
7720All messages in the NAMECACHE IPC protocol start with the
7721@code{struct GNUNET_NAMECACHE_Header} which adds a request
7722ID (32-bit integer) to the standard message header.
7723The request ID is used to match requests with the
7724respective responses from the NAMECACHE, as they are allowed to happen
7725out-of-order.
7726
7727
7728@menu
7729* Lookup::
7730* Store::
7731@end menu
7732
7733@node Lookup
7734@subsubsection Lookup
7735
7736@c %**end of header
7737
7738The @code{struct LookupBlockMessage} is used to lookup a block stored in
7739the cache.
7740It contains the query hash. The NAMECACHE always responds with a
7741@code{struct LookupBlockResponseMessage}. If the NAMECACHE has no
7742response, it sets the expiration time in the response to zero.
7743Otherwise, the response is expected to contain the expiration time, the
7744ECDSA signature, the derived key and the (variable-size) encrypted data
7745of the block.
7746
7747@node Store
7748@subsubsection Store
7749
7750@c %**end of header
7751
7752The @code{struct BlockCacheMessage} is used to cache a block in the
7753NAMECACHE.
7754It has the same structure as the @code{struct LookupBlockResponseMessage}.
7755The service responds with a @code{struct BlockCacheResponseMessage} which
7756contains the result of the operation (success or failure).
7757In the future, we might want to make it possible to provide an error
7758message as well.
7759
7760@node The NAMECACHE Plugin API
7761@subsection The NAMECACHE Plugin API
7762@c %**end of header
7763
7764The NAMECACHE plugin API consists of two functions, @code{cache_block} to
7765store a block in the database, and @code{lookup_block} to lookup a block
7766in the database.
7767
7768
7769@menu
7770* Lookup2::
7771* Store2::
7772@end menu
7773
7774@node Lookup2
7775@subsubsection Lookup2
7776
7777@c %**end of header
7778
7779The @code{lookup_block} function is expected to return at most one block
7780to the iterator, and return @code{GNUNET_NO} if there were no non-expired
7781results.
7782If there are multiple non-expired results in the cache, the lookup is
7783supposed to return the result with the largest expiration time.
7784
7785@node Store2
7786@subsubsection Store2
7787
7788@c %**end of header
7789
7790The @code{cache_block} function is expected to try to store the block in
7791the database, and return @code{GNUNET_SYSERR} if this was not possible
7792for any reason.
7793Furthermore, @code{cache_block} is expected to implicitly perform cache
7794maintenance and purge blocks from the cache that have expired. Note that
7795@code{cache_block} might encounter the case where the database already has
7796another block stored under the same key. In this case, the plugin must
7797ensure that the block with the larger expiration time is preserved.
7798Obviously, this can done either by simply adding new blocks and selecting
7799for the most recent expiration time during lookup, or by checking which
7800block is more recent during the store operation.
7801
7802@cindex REVOCATION Subsystem
7803@node REVOCATION Subsystem
7804@section REVOCATION Subsystem
7805@c %**end of header
7806
7807The REVOCATION subsystem is responsible for key revocation of Egos.
7808If a user learns that theis private key has been compromised or has lost
7809it, they can use the REVOCATION system to inform all of the other users
7810that their private key is no longer valid.
7811The subsystem thus includes ways to query for the validity of keys and to
7812propagate revocation messages.
7813
7814@menu
7815* Dissemination::
7816* Revocation Message Design Requirements::
7817* libgnunetrevocation::
7818* The REVOCATION Client-Service Protocol::
7819* The REVOCATION Peer-to-Peer Protocol::
7820@end menu
7821
7822@node Dissemination
7823@subsection Dissemination
7824
7825@c %**end of header
7826
7827When a revocation is performed, the revocation is first of all
7828disseminated by flooding the overlay network.
7829The goal is to reach every peer, so that when a peer needs to check if a
7830key has been revoked, this will be purely a local operation where the
7831peer looks at his local revocation list. Flooding the network is also the
7832most robust form of key revocation --- an adversary would have to control
7833a separator of the overlay graph to restrict the propagation of the
7834revocation message. Flooding is also very easy to implement --- peers that
7835receive a revocation message for a key that they have never seen before
7836simply pass the message to all of their neighbours.
7837
7838Flooding can only distribute the revocation message to peers that are
7839online.
7840In order to notify peers that join the network later, the revocation
7841service performs efficient set reconciliation over the sets of known
7842revocation messages whenever two peers (that both support REVOCATION
7843dissemination) connect.
7844The SET service is used to perform this operation efficiently.
7845
7846@node Revocation Message Design Requirements
7847@subsection Revocation Message Design Requirements
7848
7849@c %**end of header
7850
7851However, flooding is also quite costly, creating O(|E|) messages on a
7852network with |E| edges.
7853Thus, revocation messages are required to contain a proof-of-work, the
7854result of an expensive computation (which, however, is cheap to verify).
7855Only peers that have expended the CPU time necessary to provide
7856this proof will be able to flood the network with the revocation message.
7857This ensures that an attacker cannot simply flood the network with
7858millions of revocation messages. The proof-of-work required by GNUnet is
7859set to take days on a typical PC to compute; if the ability to quickly
7860revoke a key is needed, users have the option to pre-compute revocation
7861messages to store off-line and use instantly after their key has expired.
7862
7863Revocation messages must also be signed by the private key that is being
7864revoked. Thus, they can only be created while the private key is in the
7865possession of the respective user. This is another reason to create a
7866revocation message ahead of time and store it in a secure location.
7867
7868@node libgnunetrevocation
7869@subsection libgnunetrevocation
7870
7871@c %**end of header
7872
7873The REVOCATION API consists of two parts, to query and to issue
7874revocations.
7875
7876
7877@menu
7878* Querying for revoked keys::
7879* Preparing revocations::
7880* Issuing revocations::
7881@end menu
7882
7883@node Querying for revoked keys
7884@subsubsection Querying for revoked keys
7885
7886@c %**end of header
7887
7888@code{GNUNET_REVOCATION_query} is used to check if a given ECDSA public
7889key has been revoked.
7890The given callback will be invoked with the result of the check.
7891The query can be cancelled using @code{GNUNET_REVOCATION_query_cancel} on
7892the return value.
7893
7894@node Preparing revocations
7895@subsubsection Preparing revocations
7896
7897@c %**end of header
7898
7899It is often desirable to create a revocation record ahead-of-time and
7900store it in an off-line location to be used later in an emergency.
7901This is particularly true for GNUnet revocations, where performing the
7902revocation operation itself is computationally expensive and thus is
7903likely to take some time.
7904Thus, if users want the ability to perform revocations quickly in an
7905emergency, they must pre-compute the revocation message.
7906The revocation API enables this with two functions that are used to
7907compute the revocation message, but not trigger the actual revocation
7908operation.
7909
7910@code{GNUNET_REVOCATION_check_pow} should be used to calculate the
7911proof-of-work required in the revocation message. This function takes the
7912public key, the required number of bits for the proof of work (which in
7913GNUnet is a network-wide constant) and finally a proof-of-work number as
7914arguments.
7915The function then checks if the given proof-of-work number is a valid
7916proof of work for the given public key. Clients preparing a revocation
7917are expected to call this function repeatedly (typically with a
7918monotonically increasing sequence of numbers of the proof-of-work number)
7919until a given number satisfies the check.
7920That number should then be saved for later use in the revocation
7921operation.
7922
7923@code{GNUNET_REVOCATION_sign_revocation} is used to generate the
7924signature that is required in a revocation message.
7925It takes the private key that (possibly in the future) is to be revoked
7926and returns the signature.
7927The signature can again be saved to disk for later use, which will then
7928allow performing a revocation even without access to the private key.
7929
7930@node Issuing revocations
7931@subsubsection Issuing revocations
7932
7933
7934Given a ECDSA public key, the signature from @code{GNUNET_REVOCATION_sign}
7935and the proof-of-work,
7936@code{GNUNET_REVOCATION_revoke} can be used to perform the
7937actual revocation. The given callback is called upon completion of the
7938operation. @code{GNUNET_REVOCATION_revoke_cancel} can be used to stop the
7939library from calling the continuation; however, in that case it is
7940undefined whether or not the revocation operation will be executed.
7941
7942@node The REVOCATION Client-Service Protocol
7943@subsection The REVOCATION Client-Service Protocol
7944
7945
7946The REVOCATION protocol consists of four simple messages.
7947
7948A @code{QueryMessage} containing a public ECDSA key is used to check if a
7949particular key has been revoked. The service responds with a
7950@code{QueryResponseMessage} which simply contains a bit that says if the
7951given public key is still valid, or if it has been revoked.
7952
7953The second possible interaction is for a client to revoke a key by
7954passing a @code{RevokeMessage} to the service. The @code{RevokeMessage}
7955contains the ECDSA public key to be revoked, a signature by the
7956corresponding private key and the proof-of-work, The service responds
7957with a @code{RevocationResponseMessage} which can be used to indicate
7958that the @code{RevokeMessage} was invalid (i.e. proof of work incorrect),
7959or otherwise indicates that the revocation has been processed
7960successfully.
7961
7962@node The REVOCATION Peer-to-Peer Protocol
7963@subsection The REVOCATION Peer-to-Peer Protocol
7964
7965@c %**end of header
7966
7967Revocation uses two disjoint ways to spread revocation information among
7968peers.
7969First of all, P2P gossip exchanged via CORE-level neighbours is used to
7970quickly spread revocations to all connected peers.
7971Second, whenever two peers (that both support revocations) connect,
7972the SET service is used to compute the union of the respective revocation
7973sets.
7974
7975In both cases, the exchanged messages are @code{RevokeMessage}s which
7976contain the public key that is being revoked, a matching ECDSA signature,
7977and a proof-of-work.
7978Whenever a peer learns about a new revocation this way, it first
7979validates the signature and the proof-of-work, then stores it to disk
7980(typically to a file $GNUNET_DATA_HOME/revocation.dat) and finally
7981spreads the information to all directly connected neighbours.
7982
7983For computing the union using the SET service, the peer with the smaller
7984hashed peer identity will connect (as a "client" in the two-party set
7985protocol) to the other peer after one second (to reduce traffic spikes
7986on connect) and initiate the computation of the set union.
7987All revocation services use a common hash to identify the SET operation
7988over revocation sets.
7989
7990The current implementation accepts revocation set union operations from
7991all peers at any time; however, well-behaved peers should only initiate
7992this operation once after establishing a connection to a peer with a
7993larger hashed peer identity.
7994
7995@cindex FS
7996@cindex FS Subsystem
7997@node File-sharing (FS) Subsystem
7998@section File-sharing (FS) Subsystem
7999
8000@c %**end of header
8001
8002This chapter describes the details of how the file-sharing service works.
8003As with all services, it is split into an API (libgnunetfs), the service
8004process (gnunet-service-fs) and user interface(s).
8005The file-sharing service uses the datastore service to store blocks and
8006the DHT (and indirectly datacache) for lookups for non-anonymous
8007file-sharing.
8008Furthermore, the file-sharing service uses the block library (and the
8009block fs plugin) for validation of DHT operations.
8010
8011In contrast to many other services, libgnunetfs is rather complex since
8012the client library includes a large number of high-level abstractions;
8013this is necessary since the Fs service itself largely only operates on
8014the block level.
8015The FS library is responsible for providing a file-based abstraction to
8016applications, including directories, meta data, keyword search,
8017verification, and so on.
8018
8019The method used by GNUnet to break large files into blocks and to use
8020keyword search is called the
8021"Encoding for Censorship Resistant Sharing" (ECRS).
8022ECRS is largely implemented in the fs library; block validation is also
8023reflected in the block FS plugin and the FS service.
8024ECRS on-demand encoding is implemented in the FS service.
8025
8026NOTE: The documentation in this chapter is quite incomplete.
8027
8028@menu
8029* Encoding for Censorship-Resistant Sharing (ECRS)::
8030* File-sharing persistence directory structure::
8031@end menu
8032
8033@cindex ECRS
8034@cindex Encoding for Censorship-Resistant Sharing
8035@node Encoding for Censorship-Resistant Sharing (ECRS)
8036@subsection Encoding for Censorship-Resistant Sharing (ECRS)
8037
8038@c %**end of header
8039
8040When GNUnet shares files, it uses a content encoding that is called ECRS,
8041the Encoding for Censorship-Resistant Sharing.
8042Most of ECRS is described in the (so far unpublished) research paper
8043attached to this page. ECRS obsoletes the previous ESED and ESED II
8044encodings which were used in GNUnet before version 0.7.0.
8045The rest of this page assumes that the reader is familiar with the
8046attached paper. What follows is a description of some minor extensions
8047that GNUnet makes over what is described in the paper.
8048The reason why these extensions are not in the paper is that we felt
8049that they were obvious or trivial extensions to the original scheme and
8050thus did not warrant space in the research report.
8051
8052@menu
8053* Namespace Advertisements::
8054* KSBlocks::
8055@end menu
8056
8057@node Namespace Advertisements
8058@subsubsection Namespace Advertisements
8059
8060@c %**end of header
8061@c %**FIXME: all zeroses -> ?
8062
8063An @code{SBlock} with identifier all zeros is a signed
8064advertisement for a namespace. This special @code{SBlock} contains
8065metadata describing the content of the namespace.
8066Instead of the name of the identifier for a potential update, it contains
8067the identifier for the root of the namespace.
8068The URI should always be empty. The @code{SBlock} is signed with the
8069content provder's RSA private key (just like any other SBlock). Peers
8070can search for @code{SBlock}s in order to find out more about a namespace.
8071
8072@node KSBlocks
8073@subsubsection KSBlocks
8074
8075@c %**end of header
8076
8077GNUnet implements @code{KSBlocks} which are @code{KBlocks} that, instead
8078of encrypting a CHK and metadata, encrypt an @code{SBlock} instead.
8079In other words, @code{KSBlocks} enable GNUnet to find @code{SBlocks}
8080using the global keyword search.
8081Usually the encrypted @code{SBlock} is a namespace advertisement.
8082The rationale behind @code{KSBlock}s and @code{SBlock}s is to enable
8083peers to discover namespaces via keyword searches, and, to associate
8084useful information with namespaces. When GNUnet finds @code{KSBlocks}
8085during a normal keyword search, it adds the information to an internal
8086list of discovered namespaces. Users looking for interesting namespaces
8087can then inspect this list, reducing the need for out-of-band discovery
8088of namespaces.
8089Naturally, namespaces (or more specifically, namespace advertisements) can
8090also be referenced from directories, but @code{KSBlock}s should make it
8091easier to advertise namespaces for the owner of the pseudonym since they
8092eliminate the need to first create a directory.
8093
8094Collections are also advertised using @code{KSBlock}s.
8095
8096@table @asis
8097@item Attachment Size
8098@item ecrs.pdf 270.68 KB
8099@item https://gnunet.org/sites/default/files/ecrs.pdf
8100@end table
8101
8102@node File-sharing persistence directory structure
8103@subsection File-sharing persistence directory structure
8104
8105@c %**end of header
8106
8107This section documents how the file-sharing library implements
8108persistence of file-sharing operations and specifically the resulting
8109directory structure.
8110This code is only active if the @code{GNUNET_FS_FLAGS_PERSISTENCE} flag
8111was set when calling @code{GNUNET_FS_start}.
8112In this case, the file-sharing library will try hard to ensure that all
8113major operations (searching, downloading, publishing, unindexing) are
8114persistent, that is, can live longer than the process itself.
8115More specifically, an operation is supposed to live until it is
8116explicitly stopped.
8117
8118If @code{GNUNET_FS_stop} is called before an operation has been stopped, a
8119@code{SUSPEND} event is generated and then when the process calls
8120@code{GNUNET_FS_start} next time, a @code{RESUME} event is generated.
8121Additionally, even if an application crashes (segfault, SIGKILL, system
8122crash) and hence @code{GNUNET_FS_stop} is never called and no
8123@code{SUSPEND} events are generated, operations are still resumed (with
8124@code{RESUME} events).
8125This is implemented by constantly writing the current state of the
8126file-sharing operations to disk.
8127Specifically, the current state is always written to disk whenever
8128anything significant changes (the exception are block-wise progress in
8129publishing and unindexing, since those operations would be slowed down
8130significantly and can be resumed cheaply even without detailed
8131accounting).
8132Note that if the process crashes (or is killed) during a serialization
8133operation, FS does not guarantee that this specific operation is
8134recoverable (no strict transactional semantics, again for performance
8135reasons). However, all other unrelated operations should resume nicely.
8136
8137Since we need to serialize the state continuously and want to recover as
8138much as possible even after crashing during a serialization operation,
8139we do not use one large file for serialization.
8140Instead, several directories are used for the various operations.
8141When @code{GNUNET_FS_start} executes, the master directories are scanned
8142for files describing operations to resume.
8143Sometimes, these operations can refer to related operations in child
8144directories which may also be resumed at this point.
8145Note that corrupted files are cleaned up automatically.
8146However, dangling files in child directories (those that are not
8147referenced by files from the master directories) are not automatically
8148removed.
8149
8150Persistence data is kept in a directory that begins with the "STATE_DIR"
8151prefix from the configuration file
8152(by default, "$SERVICEHOME/persistence/") followed by the name of the
8153client as given to @code{GNUNET_FS_start} (for example, "gnunet-gtk")
8154followed by the actual name of the master or child directory.
8155
8156The names for the master directories follow the names of the operations:
8157
8158@itemize @bullet
8159@item "search"
8160@item "download"
8161@item "publish"
8162@item "unindex"
8163@end itemize
8164
8165Each of the master directories contains names (chosen at random) for each
8166active top-level (master) operation.
8167Note that a download that is associated with a search result is not a
8168top-level operation.
8169
8170In contrast to the master directories, the child directories are only
8171consulted when another operation refers to them.
8172For each search, a subdirectory (named after the master search
8173synchronization file) contains the search results.
8174Search results can have an associated download, which is then stored in
8175the general "download-child" directory.
8176Downloads can be recursive, in which case children are stored in
8177subdirectories mirroring the structure of the recursive download
8178(either starting in the master "download" directory or in the
8179"download-child" directory depending on how the download was initiated).
8180For publishing operations, the "publish-file" directory contains
8181information about the individual files and directories that are part of
8182the publication.
8183However, this directory structure is flat and does not mirror the
8184structure of the publishing operation.
8185Note that unindex operations cannot have associated child operations.
8186
8187@cindex REGEX subsystem
8188@node REGEX Subsystem
8189@section REGEX Subsystem
8190
8191@c %**end of header
8192
8193Using the REGEX subsystem, you can discover peers that offer a particular
8194service using regular expressions.
8195The peers that offer a service specify it using a regular expressions.
8196Peers that want to patronize a service search using a string.
8197The REGEX subsystem will then use the DHT to return a set of matching
8198offerers to the patrons.
8199
8200For the technical details, we have Max's defense talk and Max's Master's
8201thesis.
8202
8203@c An additional publication is under preparation and available to
8204@c team members (in Git).
8205@c FIXME: Where is the file? Point to it. Assuming that it's szengel2012ms
8206
8207@menu
8208* How to run the regex profiler::
8209@end menu
8210
8211@node How to run the regex profiler
8212@subsection How to run the regex profiler
8213
8214@c %**end of header
8215
8216The gnunet-regex-profiler can be used to profile the usage of mesh/regex
8217for a given set of regular expressions and strings.
8218Mesh/regex allows you to announce your peer ID under a certain regex and
8219search for peers matching a particular regex using a string.
8220See @uref{https://gnunet.org/szengel2012ms, szengel2012ms} for a full
8221introduction.
8222
8223First of all, the regex profiler uses GNUnet testbed, thus all the
8224implications for testbed also apply to the regex profiler
8225(for example you need password-less ssh login to the machines listed in
8226your hosts file).
8227
8228@strong{Configuration}
8229
8230Moreover, an appropriate configuration file is needed.
8231Generally you can refer to the
8232@file{contrib/regex_profiler_infiniband.conf} file in the sourcecode
8233of GNUnet for an example configuration.
8234In the following paragraph the important details are highlighted.
8235
8236Announcing of the regular expressions is done by the
8237gnunet-daemon-regexprofiler, therefore you have to make sure it is
8238started, by adding it to the AUTOSTART set of ARM:
8239
8240@example
8241[regexprofiler]
8242AUTOSTART = YES
8243@end example
8244
8245@noindent
8246Furthermore you have to specify the location of the binary:
8247
8248@example
8249[regexprofiler]
8250# Location of the gnunet-daemon-regexprofiler binary.
8251BINARY = /home/szengel/gnunet/src/mesh/.libs/gnunet-daemon-regexprofiler
8252# Regex prefix that will be applied to all regular expressions and
8253# search string.
8254REGEX_PREFIX = "GNVPN-0001-PAD"
8255@end example
8256
8257@noindent
8258When running the profiler with a large scale deployment, you probably
8259want to reduce the workload of each peer.
8260Use the following options to do this.
8261
8262@example
8263[dht]
8264# Force network size estimation
8265FORCE_NSE = 1
8266
8267[dhtcache]
8268DATABASE = heap
8269# Disable RC-file for Bloom filter? (for benchmarking with limited IO
8270# availability)
8271DISABLE_BF_RC = YES
8272# Disable Bloom filter entirely
8273DISABLE_BF = YES
8274
8275[nse]
8276# Minimize proof-of-work CPU consumption by NSE
8277WORKBITS = 1
8278@end example
8279
8280@noindent
8281@strong{Options}
8282
8283To finally run the profiler some options and the input data need to be
8284specified on the command line.
8285
8286@example
8287gnunet-regex-profiler -c config-file -d log-file -n num-links \
8288-p path-compression-length -s search-delay -t matching-timeout \
8289-a num-search-strings hosts-file policy-dir search-strings-file
8290@end example
8291
8292@noindent
8293Where...
8294
8295@itemize @bullet
8296@item ... @code{config-file} means the configuration file created earlier.
8297@item ... @code{log-file} is the file where to write statistics output.
8298@item ... @code{num-links} indicates the number of random links between
8299started peers.
8300@item ... @code{path-compression-length} is the maximum path compression
8301length in the DFA.
8302@item ... @code{search-delay} time to wait between peers finished linking
8303and starting to match strings.
8304@item ... @code{matching-timeout} timeout after which to cancel the
8305searching.
8306@item ... @code{num-search-strings} number of strings in the
8307search-strings-file.
8308@item ... the @code{hosts-file} should contain a list of hosts for the
8309testbed, one per line in the following format:
8310
8311@itemize @bullet
8312@item @code{user@@host_ip:port}
8313@end itemize
8314@item ... the @code{policy-dir} is a folder containing text files
8315containing one or more regular expressions. A peer is started for each
8316file in that folder and the regular expressions in the corresponding file
8317are announced by this peer.
8318@item ... the @code{search-strings-file} is a text file containing search
8319strings, one in each line.
8320@end itemize
8321
8322@noindent
8323You can create regular expressions and search strings for every AS in the
8324Internet using the attached scripts. You need one of the
8325@uref{http://data.caida.org/datasets/routing/routeviews-prefix2as/, CAIDA routeviews prefix2as}
8326data files for this. Run
8327
8328@example
8329create_regex.py <filename> <output path>
8330@end example
8331
8332@noindent
8333to create the regular expressions and
8334
8335@example
8336create_strings.py <input path> <outfile>
8337@end example
8338
8339@noindent
8340to create a search strings file from the previously created
8341regular expressions.
diff --git a/doc/documentation/chapters/installation.texi b/doc/documentation/chapters/installation.texi
new file mode 100644
index 000000000..eca77afcd
--- /dev/null
+++ b/doc/documentation/chapters/installation.texi
@@ -0,0 +1,4123 @@
1@node GNUnet Installation Handbook
2@chapter GNUnet Installation Handbook
3
4This handbook describes how to install (build, setup, compile) and
5setup (configure, start) GNUnet @value{VERSION}. After following these
6instructions you should be able to install and then start user-interfaces
7to interact with the network.
8
9Note: This manual is far from complete, and we welcome informed
10contributions, be 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 software builds from source::
18* Build Instructions for Microsoft Windows Platforms::
19* Build instructions for Debian 7.5::
20* Installing GNUnet from Git on Ubuntu 14.4::
21* Build instructions for Debian 8::
22* Outdated build instructions for previous revisions::
23@c * Portable GNUnet::
24* The graphical configuration interface::
25* How to start and stop a GNUnet peer::
26@end menu
27
28@node Dependencies
29@section Dependencies
30@c %**end of header
31
32This section lists the various known dependencies for
33GNUnet @value{EDITION}.
34Suggestions for missing dependencies or wrong version numbers are welcome.
35
36@menu
37* External dependencies::
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 @geq{} 5.2
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 Optional dependencies
100@subsection Optional dependencies
101
102These applications must be installed for various experimental or otherwise
103optional features such as @command{gnunet-conversation},
104and @command{gnunet-gtk} (most of these features are only build if you
105configure GNUnet with @command{--enable-experimental}):
106
107@itemize @bullet
108@item libpulse @geq{} 2.0,
109optional (for @command{gnunet-conversation})
110@item libopus @geq{} 1.0.1,
111optional (for @command{gnunet-conversation})
112@item libogg @geq{} 1.3.0,
113optional (for @command{gnunet-conversation})
114@item libnss contained @command{certool} binary,
115optional for convenient installation of
116the GNS proxy.
117@item python-zbar @geq{} 0.10,
118optional (for @command{gnunet-qr})
119@item Gtk+ @geq{} 3.0,
120optional (for @command{gnunet-gtk})
121@item libgladeui (must match Gtk+ version),
122optional (for @command{gnunet-gtk})
123@item libqrencode @geq{} 3.0,
124optional (for @command{gnunet-namestore-gtk})
125@end itemize
126
127@node Internal dependencies
128@subsection Internal dependencies
129
130This section tries to give an overview of what processes a typical GNUnet
131peer running a particular application would consist of. All of the
132processes listed here should be automatically started by
133@command{gnunet-arm -s}.
134The list is given as a rough first guide to users for failure diagnostics.
135Ideally, end-users should never have to worry about these internal
136dependencies.
137
138In terms of internal dependencies, a minimum file-sharing system consists
139of the following GNUnet processes (in order of dependency):
140
141@itemize @bullet
142@item gnunet-service-arm
143@item gnunet-service-resolver (required by all)
144@item gnunet-service-statistics (required by all)
145@item gnunet-service-peerinfo
146@item gnunet-service-transport (requires peerinfo)
147@item gnunet-service-core (requires transport)
148@item gnunet-daemon-hostlist (requires core)
149@item gnunet-daemon-topology (requires hostlist, peerinfo)
150@item gnunet-service-datastore
151@item gnunet-service-dht (requires core)
152@item gnunet-service-identity
153@item gnunet-service-fs (requires identity, mesh, dht, datastore, core)
154@end itemize
155
156@noindent
157A minimum VPN system consists of the following GNUnet processes (in
158order of dependency):
159
160@itemize @bullet
161@item gnunet-service-arm
162@item gnunet-service-resolver (required by all)
163@item gnunet-service-statistics (required by all)
164@item gnunet-service-peerinfo
165@item gnunet-service-transport (requires peerinfo)
166@item gnunet-service-core (requires transport)
167@item gnunet-daemon-hostlist (requires core)
168@item gnunet-service-dht (requires core)
169@item gnunet-service-mesh (requires dht, core)
170@item gnunet-service-dns (requires dht)
171@item gnunet-service-regex (requires dht)
172@item gnunet-service-vpn (requires regex, dns, mesh, dht)
173@end itemize
174
175@noindent
176A minimum GNS system consists of the following GNUnet processes (in
177order of dependency):
178
179@itemize @bullet
180@item gnunet-service-arm
181@item gnunet-service-resolver (required by all)
182@item gnunet-service-statistics (required by all)
183@item gnunet-service-peerinfo
184@item gnunet-service-transport (requires peerinfo)
185@item gnunet-service-core (requires transport)
186@item gnunet-daemon-hostlist (requires core)
187@item gnunet-service-dht (requires core)
188@item gnunet-service-mesh (requires dht, core)
189@item gnunet-service-dns (requires dht)
190@item gnunet-service-regex (requires dht)
191@item gnunet-service-vpn (requires regex, dns, mesh, dht)
192@item gnunet-service-identity
193@item gnunet-service-namestore (requires identity)
194@item gnunet-service-gns (requires vpn, dns, dht, namestore, identity)
195@end itemize
196
197@node Pre-installation notes
198@section Pre-installation notes
199
200Please note that in the code instructions for the installation,
201@emph{#} indicates commands run as privileged root user and
202@emph{$} shows commands run as unprivileged ("normal") system user.
203
204
205@node Generic installation instructions
206@section Generic installation instructions
207
208First, in addition to the GNUnet sources you might require downloading the
209latest version of various dependencies, depending on how recent the
210software versions in your distribution of GNU/Linux are.
211Most distributions do not include sufficiently recent versions of these
212dependencies.
213Thus, a typically installation on a "modern" GNU/Linux distribution
214requires you to install the following dependencies (ideally in this
215order):
216
217@itemize @bullet
218@item libgpgerror and libgcrypt
219@item libnettle and libunbound (possibly from distribution), GnuTLS
220@item libgnurl (read the README)
221@item GNU libmicrohttpd
222@item GNU libextractor
223@end itemize
224
225Make sure to first install the various mandatory and optional
226dependencies including development headers from your distribution.
227
228Other dependencies that you should strongly consider to install is a
229database (MySQL, sqlite or Postgres).
230The following instructions will assume that you installed at least sqlite.
231For most distributions you should be able to find pre-build packages for
232the database. Again, make sure to install the client libraries @b{and} the
233respective development headers (if they are packaged separately) as well.
234
235You can find specific, detailed instructions for installing of the
236dependencies (and possibly the rest of the GNUnet installation) in the
237platform-specific descriptions, which can be found in the Index.
238Please consult them now.
239If your distribution is not listed, please study
240@ref{Build instructions for Debian 8}, the build instructions for
241Debian stable, carefully as you try to install the dependencies for your
242own distribution.
243Contributing additional instructions for further platforms is always
244appreciated.
245Please take in mind that operating system development tends to move at
246a rather fast speed. Due to this you should be aware that some of
247the instructions could be outdated by the time you are reading this.
248If you find a mistake, please tell us about it (or even better: send
249a patch to the documentation to fix it!).
250
251Before proceeding further, please double-check the dependency list.
252Note that in addition to satisfying the dependencies, you might have to
253make sure that development headers for the various libraries are also
254installed.
255There maybe files for other distributions, or you might be able to find
256equivalent packages for your distribution.
257
258While it is possible to build and install GNUnet without having root
259access, we will assume that you have full control over your system in
260these instructions.
261First, you should create a system user @emph{gnunet} and an additional
262group @emph{gnunetdns}. On the GNU/Linux distributions Debian and Ubuntu,
263type:
264
265@example
266# adduser --system --home /var/lib/gnunet --group \
267--disabled-password gnunet
268# addgroup --system gnunetdns
269@end example
270
271@noindent
272On other Unixes and GNU systems, this should have the same effect:
273
274@example
275# useradd --system --groups gnunet --home-dir /var/lib/gnunet
276# addgroup --system gnunetdns
277@end example
278
279Now compile and install GNUnet using:
280
281@example
282$ tar xvf gnunet-@value{VERSION}.tar.gz
283$ cd gnunet-@value{VERSION}
284$ ./configure --with-sudo=sudo --with-nssdir=/lib
285$ make
286$ sudo make install
287@end example
288
289If you want to be able to enable DEBUG-level log messages, add
290@code{--enable-logging=verbose} to the end of the
291@command{./configure} command.
292@code{DEBUG}-level log messages are in English only and
293should only be useful for developers (or for filing
294really detailed bug reports).
295
296Finally, you probably want to compile @command{gnunet-gtk}, which
297includes @command{gnunet-setup} (a graphical tool for
298GNUnet configuration) and @command{gnunet-fs-gtk} (a graphical tool for
299GNUnet file-sharing):
300
301@example
302$ tar xvf gnunet-gtk-@value{VERSION}.tar.gz
303$ cd gnunet-gtk-@value{VERSION}
304$ ./configure --with-gnunet=/usr/local/
305$ make
306$ sudo make install
307$ cd ..
308# just to be safe run this:
309$ sudo ldconfig
310@end example
311
312@noindent
313Next, edit the file @file{/etc/gnunet.conf} to contain the following:
314
315@example
316[arm]
317SYSTEM_ONLY = YES
318USER_ONLY = NO
319@end example
320
321@noindent
322You may need to update your @code{ld.so} cache to include
323files installed in @file{/usr/local/lib}:
324
325@example
326# ldconfig
327@end example
328
329@noindent
330Then, switch from user @code{root} to user @code{gnunet} to start
331the peer:
332
333@example
334# su -s /bin/sh - gnunet
335$ gnunet-arm -c /etc/gnunet.conf -s
336@end example
337
338You may also want to add the last line in the gnunet user's @file{crontab}
339prefixed with @code{@@reboot} so that it is executed whenever the system
340is booted:
341
342@example
343@@reboot /usr/local/bin/gnunet-arm -c /etc/gnunet.conf -s
344@end example
345
346@noindent
347This will only start the system-wide GNUnet services.
348Type exit to get back your root shell.
349Now, you need to configure the per-user part. For each
350$USER that should get access to GNUnet on the system, run:
351
352@example
353# adduser $USER gnunet
354@end example
355
356@noindent
357to allow them to access the system-wide GNUnet services. Then, each
358user should create a configuration file @file{~/.config/gnunet.conf}
359with the lines:
360
361@example
362[arm]
363SYSTEM_ONLY = NO
364USER_ONLY = YES
365DEFAULTSERVICES = gns
366@end example
367
368@noindent
369and start the per-user services using
370
371@example
372$ gnunet-arm -c ~/.config/gnunet.conf -s
373@end example
374
375@noindent
376Again, adding a @code{crontab} entry to autostart the peer is advised:
377
378@example
379@@reboot /usr/local/bin/gnunet-arm -c $HOME/.config/gnunet.conf -s
380@end example
381
382@noindent
383Note that some GNUnet services (such as SOCKS5 proxies) may need a
384system-wide TCP port for each user.
385For those services, systems with more than one user may require each user
386to specify a different port number in their personal configuration file.
387
388Finally, the user should perform the basic initial setup for the GNU Name
389System (GNS). This is done by running two commands:
390
391@example
392$ gnunet-gns-import.sh
393$ gnunet-gns-proxy-setup-ca
394@end example
395
396@noindent
397The first generates the default zones, wheras the second setups the GNS
398Certificate Authority with the user's browser. Now, to activate GNS in the
399normal DNS resolution process, you need to edit your
400@file{/etc/nsswitch.conf} where you should find a line like this:
401
402@example
403hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
404@end example
405
406@noindent
407The exact details may differ a bit, which is fine. Add the text
408@emph{"gns [NOTFOUND=return]"} after @emph{"files"}.
409Keep in mind that we included a backslash ("\") here just for
410markup reasons. You should write the text below on @b{one line}
411and @b{without} the "\":
412
413@example
414hosts: files gns [NOTFOUND=return] mdns4_minimal \
415[NOTFOUND=return] dns mdns4
416@end example
417
418@c FIXME: Document new behavior.
419You might want to make sure that @file{/lib/libnss_gns.so.2} exists on
420your system, it should have been created during the installation.
421
422@node Build instructions for Ubuntu 12.04 using Git
423@section Build instructions for Ubuntu 12.04 using Git
424
425@menu
426* Install the required build tools::
427* Install libgcrypt 1.6 and libgpg-error::
428* Install gnutls with DANE support::
429* Install libgnurl::
430* Install libmicrohttpd from Git::
431* Install libextractor from Git::
432* Install GNUnet dependencies::
433* Build GNUnet::
434* Install the GNUnet-gtk user interface from Git::
435@end menu
436
437@node Install the required build tools
438@subsection Install the required build tools
439
440First, make sure Git is installed on your system:
441
442@example
443$ sudo apt-get install git
444@end example
445
446Install the essential buildtools:
447
448@example
449$ sudo apt-get install automake autopoint autoconf libtool
450@end example
451
452@node Install libgcrypt 1.6 and libgpg-error
453@subsection Install libgcrypt 1.6 and libgpg-error
454
455@ref{generic source installation - libgpg-error}
456
457@node Install gnutls with DANE support
458@subsection Install gnutls with DANE support
459
460@itemize @bullet
461@item @ref{generic source installation - nettle}
462@item @ref{generic source installation - ldns}
463@item @ref{generic source installation - libunbound/unbound}
464@item @ref{generic source installation - gnutls}
465@item @ref{generic source installation - libgcrypt}
466@end itemize
467
468@node Install libgnurl
469@subsection Install libgnurl
470
471Follow the @ref{generic source installation - libgnurl}.
472
473@node Install libmicrohttpd from Git
474@subsection Install libmicrohttpd from Git
475
476@example
477$ git clone https://gnunet.org/git/libmicrohttpd
478$ cd libmicrohttpd/
479$ ./bootstrap
480$ ./configure
481$ sudo make install ; cd ..
482@end example
483
484@node Install libextractor from Git
485@subsection Install libextractor from Git
486
487Install libextractor dependencies:
488
489@example
490$ sudo apt-get install zlib1g-dev libgsf-1-dev libmpeg2-4-dev \
491 libpoppler-dev libvorbis-dev libexiv2-dev libjpeg-dev \
492 libtiff-dev libgif-dev libvorbis-dev libflac-dev libsmf-dev \
493 g++
494@end example
495
496Build libextractor:
497
498@example
499$ git clone https://gnunet.org/git/libextractor
500$ cd libextractor
501$ ./bootstrap
502$ ./configure
503$ sudo make install ; cd ..
504@end example
505
506@node Install GNUnet dependencies
507@subsection Install GNUnet dependencies
508
509@example
510$ sudo apt-get install libidn11-dev libunistring-dev libglpk-dev \
511 libpulse-dev libbluetooth-dev libsqlite-dev
512@end example
513
514Install libopus:
515
516@example
517$ wget http://downloads.xiph.org/releases/opus/opus-1.1.tar.gz
518$ tar xf opus-1.1.tar.gz
519$ cd opus-1.1/
520$ ./configure
521$ sudo make install ; cd ..
522@end example
523
524Choose one or more database backends:
525
526SQLite3:
527@example
528$ sudo apt-get install libsqlite3-dev
529@end example
530MySQL:
531@example
532$ sudo apt-get install libmysqlclient-dev
533@end example
534PostgreSQL:
535@example
536$ sudo apt-get install libpq-dev postgresql
537@end example
538
539
540
541@node Build GNUnet
542@subsection Build GNUnet
543
544
545
546@menu
547* Configuring the installation path::
548* Configuring the system::
549* Installing components requiring sudo permission::
550* Build::
551@end menu
552
553@node Configuring the installation path
554@subsubsection Configuring the installation path
555
556You can specify the location of the GNUnet installation by setting the
557prefix when calling the configure script with @code{--prefix=DIRECTORY}
558
559@example
560$ export PATH=$PATH:DIRECTORY/bin
561@end example
562
563@node Configuring the system
564@subsubsection Configuring the system
565
566Please make sure NOW that you have created a user and group 'gnunet'
567and additionally a group 'gnunetdns':
568
569@example
570$ sudo addgroup gnunet
571$ sudo addgroup gnunetdns
572$ sudo adduser gnunet
573@end example
574
575Each GNUnet user should be added to the 'gnunet' group (may
576require fresh login to come into effect):
577
578@example
579$ sudo useradd -G gnunet
580@end example
581
582@node Installing components requiring sudo permission
583@subsubsection Installing components requiring sudo permission
584
585Some components, like the nss plugin required for GNS, may require root
586permissions. To allow these few components to be installed use:
587
588@example
589$ ./configure --with-sudo
590@end example
591
592@node Build
593@subsubsection Build
594
595@example
596$ git clone https://gnunet.org/git/gnunet/
597$ cd gnunet/
598$ ./bootstrap
599@end example
600
601Use the required configure call including the optional installation prefix
602@code{PREFIX} or the sudo permissions:
603
604@example
605$ ./configure [ --with-sudo | --with-prefix=PREFIX ]
606@end example
607
608@example
609$ make; sudo make install
610@end example
611
612After installing it, you need to create an empty configuration file:
613
614@example
615mkdir ~/.gnunet; touch ~/.gnunet/gnunet.conf
616@end example
617
618And finally you can start GNUnet with:
619
620@example
621$ gnunet-arm -s
622@end example
623
624@node Install the GNUnet-gtk user interface from Git
625@subsection Install the GNUnet-gtk user interface from Git
626
627
628Install depencies:
629
630@example
631$ sudo apt-get install libgtk-3-dev libunique-3.0-dev libgladeui-dev \
632 libqrencode-dev
633@end example
634
635Build GNUnet (with an optional prefix) and execute:
636
637@example
638$ git clone https://gnunet.org/git/gnunet-gtk/
639$ cd gnunet-gtk/
640$ ./bootstrap
641$ ./configure [--prefix=PREFIX] --with-gnunet=DIRECTORY
642$ make; sudo make install
643@end example
644
645@node Build instructions for software builds from source
646@section Build instructions for software builds from source
647
648This section describes software builds in case your operating
649system lacks binary substitutes / binary builds for some dependencies
650of GNUnet.
651It is assumed that you have installed common build dependencies
652and that these instructions are treated as generic without any
653debugging help.
654It is furthermore assumed that you use the release tarballs of
655the software, installation from the respective version control
656sources might differ in ways that are only minimal different
657(for example a dependency on autotools etc).
658
659@menu
660* generic source installation - nettle::
661* generic source installation - ldns::
662* generic source installation - libunbound/unbound::
663* generic source installation - libav::
664* generic source installation - libextractor::
665* generic source installation - libgpg-error::
666* generic source installation - libgcrypt::
667* generic source installation - gnutls::
668* generic source installation - libmicrohttpd::
669* generic source installation - libgnurl::
670@end menu
671
672@node generic source installation - nettle
673@subsection generic source installation - nettle
674
675@example
676$ wget http://www.lysator.liu.se/~nisse/archive/nettle-2.7.1.tar.gz
677$ tar xf nettle-2.7.1.tar.gz
678$ cd nettle-2.7.1
679$ ./configure
680$ sudo make install ; cd ..
681@end example
682
683@node generic source installation - ldns
684@subsection generic source installation - ldns
685
686@example
687$ wget https://www.nlnetlabs.nl/downloads/ldns/ldns-1.6.16.tar.gz
688$ tar xf ldns-1.6.16.tar.gz
689$ cd ldns-1.6.16
690$ ./configure
691$ sudo make install ; cd ..
692@end example
693
694@node generic source installation - libunbound/unbound
695@subsection generic source installation - libunbound/unbound
696
697@example
698$ wget https://unbound.net/downloads/unbound-1.4.21.tar.gz
699$ tar xf unbound-1.4.21.tar.gz
700$ cd unbound-1.4.21
701$ ./configure
702$ sudo make install ; cd ..
703@end example
704
705@node generic source installation - libav
706@subsection generic source installation - libav
707
708@example
709$ wget https://libav.org/releases/libav-9.10.tar.xz
710$ cd libav-0.9 ; ./configure --enable-shared;
711$ make; sudo make install; cd ..
712@end example
713
714@node generic source installation - libextractor
715@subsection generic source installation - libextractor
716
717@example
718$ wget https://ftp.gnu.org/gnu/libextractor/libextractor-1.3.tar.gz
719$ tar xvf libextractor-1.3.tar.gz
720$ cd libextractor-1.3 ; ./configure;
721$ make ; sudo make install; cd ..
722@end example
723
724@node generic source installation - libgpg-error
725@subsection generic source installation - libgpg-error
726
727@example
728$ wget https://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.12.tar.bz2
729$ tar xvf libgpg-error-1.12.tar.bz2
730$ cd libgpg-error-1.12; ./configure;
731$ make ; sudo make install; cd ..
732@end example
733
734@node generic source installation - libgcrypt
735@subsection generic source installation - libgcrypt
736@example
737$ wget https://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.0.tar.bz2
738$ tar xvf libgcrypt-1.6.0.tar.bz2
739$ cd libgcrypt-1.6.0; ./configure --with-gpg-error-prefix=/usr/local;
740$ make ; sudo make install ; cd ..
741@end example
742
743@node generic source installation - gnutls
744@subsection generic source installation - gnutls
745
746@example
747$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.7.tar.xz
748$ tar xvf gnutls-3.2.7.tar.xz
749$ cd gnutls-3.2.7
750@end example
751
752@noindent
753If you want a GnuTLS with DANE functionality (recommended for GNUnet),
754you have to compile it against libunbound. Assuming that libunbound
755is installed on your system:
756
757@example
758$ ./configure --enable-libdane
759@end example
760
761@noindent
762Note that the build system of GnuTLS should pick up libunbound without
763the explicit mention of @code{--enable-libdane}.
764If you don't want libdane support you should pass @code{--disable-libdane}
765instead.
766
767@example
768$ ./configure
769$ make ; sudo make install ; cd ..
770@end example
771
772@node generic source installation - libmicrohttpd
773@subsection generic source installation - libmicrohttpd
774
775@example
776$ wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.33.tar.gz
777$ tar xvf libmicrohttpd-0.9.33.tar.gz
778$ cd libmicrohttpd-0.9.33; ./configure;
779$ make ; sudo make install ; cd ..
780@end example
781
782@node generic source installation - libgnurl
783@subsection generic source installation - libgnurl
784
785Example installation of libgnurl version 7.57.0 from source.
786
787@example
788$ wget https://ftp.gnu.org/gnu/gnunet/gnurl-7.57.0.tar.xz
789$ wget https://ftp.gnu.org/gnu/gnunet/gnurl-7.57.0.tar.xz.sig
790$ gpg --verify gnurl-7.57.0.tar.xz.sig
791@end example
792
793@noindent
794If that command fails because you do not have the required public key,
795then run this command to import it:
796
797@example
798$ gpg --keyserver pgp.mit.edu --recv-keys A88C8ADD129828D7EAC02E52E22F9BBFEE348588
799@end example
800
801@noindent
802and rerun the gpg --verify command.
803
804@example
805$ tar xvf gnurl-7.57.0.tar.xz
806$ cd gnurl-7.57.0
807$ ./configure --disable-ntlm-wb
808$ make ; sudo make install; cd ..
809@end example
810
811You have now build and installed libgnurl from source.
812
813@menu
814* Fixing libgnurl build issues::
815@end menu
816
817@node Fixing libgnurl build issues
818@subsubsection Fixing libgnurl build issues
819
820@c FIXME: Obviously this subsection should be evaluated and
821@c if still necessary moved into gnURL itself (README) or
822@c into a separate section which deals with gnURL.
823If you have to compile libgnurl from source (for example if the version
824included in your distribution is too old or it's not included at all)
825you perhaps might get an error message while running the
826@command{configure} script:
827
828@example
829$ configure
830...
831checking for 64-bit curl_off_t data type... unknown
832checking for 32-bit curl_off_t data type... unknown
833checking for 16-bit curl_off_t data type... unknown
834configure: error: cannot find data type for curl_off_t.
835@end example
836
837@noindent
838Solution:
839
840Before running the @command{configure} script, set:
841
842@example
843CFLAGS="-I. -I$BUILD_ROOT/include"
844@end example
845
846@node Build Instructions for Microsoft Windows Platforms
847@section Build Instructions for Microsoft Windows Platforms
848
849@menu
850* Introduction to building on MS Windows::
851* Requirements::
852* Dependencies & Initial Setup::
853* GNUnet Installation::
854* Adjusting Windows for running and testing GNUnet::
855* Building the GNUnet Installer::
856* Using GNUnet with Netbeans on Windows::
857@end menu
858
859@node Introduction to building on MS Windows
860@subsection Introduction to building on MS Windows
861
862
863This document is a guide to building GNUnet and its dependencies on
864Windows platforms. GNUnet development is mostly done under GNU/Linux and
865especially git checkouts may not build out of the box.
866We regret any inconvenience, and if you have problems, please report
867them.
868
869@node Requirements
870@subsection Requirements
871
872The Howto is based upon a @strong{Windows Server 2008 32bit}
873@strong{Installation}, @strong{sbuild} and thus a
874@uref{http://www.mingw.org/wiki/MSYS, MSYS+MinGW}
875(W32-GCC-Compiler-Suite + Unix-like Userland) installation. sbuild
876is a convenient set of scripts which creates a working msys/mingw
877installation and installs most dependencies required for GNUnet.
878
879As of the point of the creation of these instructions,
880GNUnet @strong{requires} a Windows @strong{Server} 2003 or
881newer for full feature support.
882Windows Vista and later will also work, but
883@strong{non-server version can not run a VPN-Exit-Node} as the NAT
884features have been removed as of Windows Vista.
885
886@c TODO: We should document Windows 10!
887@c It seems like the situation hasn't changed with W10
888
889@node Dependencies & Initial Setup
890@subsection Dependencies & Initial Setup
891
892
893@itemize @bullet
894
895@item
896Install a fresh version of @strong{Python 2.x}, even if you are using a
897x64-OS, install a 32-bit version for use with sbuild.
898Python 3.0 is currently incompatible.
899
900@item
901Install your favorite @uref{http://code.google.com/p/tortoisegit/, git} &
902@uref{http://tortoisesvn.net/, subversion}-clients.
903
904@item
905You will also need some archive-manager like
906@uref{http://www.7-zip.org/, 7zip}.
907
908@item
909Pull a copy of sbuild to a directory of your choice, which will be used
910in the remainder of this guide. For now, we will use
911@file{c:\gnunet\sbuild\}
912
913@item
914in @file{sbuild\src\mingw\mingw32-buildall.sh}, comment out the packages
915@strong{gnunet-svn} and @strong{gnunet-gtk-svn}, as we don't want sbuild
916to compile/install those for us.
917
918@item
919Follow LRN's sbuild installation instructions.-
920@end itemize
921
922Please note that sbuild may (or will most likely) fail during
923installation, thus you really HAVE to @strong{check the logfiles} created
924during the installation process.
925Certain packages may fail to build initially due to missing dependencies,
926thus you may have to
927@strong{substitute those with binary-versions initially}. Later on once
928dependencies are satisfied you can re-build the newer package versions.
929
930@strong{It is normal that you may have to repeat this step multiple times
931and there is no uniform way to fix all compile-time issues, as the
932build-process of many of the dependencies installed are rather unstable
933on win32 and certain releases may not even compile at all.}
934
935Most dependencies for GNUnet have been set up by sbuild, thus we now
936should add the @file{bin/} directories in your new msys and mingw
937installations to PATH. You will want to create a backup of your finished
938msys-environment by now.
939
940@node GNUnet Installation
941@subsection GNUnet Installation
942
943First, we need to launch our msys-shell, you can do this via
944
945@file{C:\gnunet\sbuild\msys\msys.bat}
946
947You might wish to take a look at this file and adjust some
948login-parameters to your msys environment.
949
950Also, sbuild added two pointpoints to your msys-environment, though those
951might remain invisible:
952
953@itemize @bullet
954
955@item
956/mingw, which will mount your mingw-directory from sbuild/mingw and the
957other one is
958
959@item
960/src which contains all the installation sources sbuild just compiled.
961@end itemize
962
963Check out the current GNUnet sources (git HEAD) from the
964GNUnet repository "gnunet.git", we will do this in your home directory:
965
966@code{git clone https://gnunet.org/git/gnunet/ ~/gnunet}
967
968Now, we will first need to bootstrap the checked out installation and then
969configure it accordingly.
970
971@example
972cd ~/gnunet
973./bootstrap
974STRIP=true CPPFLAGS="-DUSE_IPV6=1 -DW32_VEH" CFLAGS="$CFLAGS -g -O2" \
975./configure --prefix=/ --docdir=/share/doc/gnunet \
976--with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw \
977--with-libcurl=/mingw --with-extractor=/mingw --with-sqlite=/mingw \
978--with-microhttpd=/mingw --with-plibc=/mingw --enable-benchmarks \
979--enable-expensivetests --enable-experimental --with-qrencode=/mingw \
980--enable-silent-rules --enable-experimental 2>&1 | tee -a ./configure.log
981@end example
982
983The parameters above will configure for a reasonable GNUnet installation
984to the your msys-root directory.
985Depending on which features your would like to build or you may need to
986specify additional dependencies. Sbuild installed most libs into
987the /mingw subdirectory, so remember to prefix library locations with
988this path.
989
990Like on a unixoid system, you might want to use your home directory as
991prefix for your own GNUnet installation for development, without tainting
992the buildenvironment. Just change the "prefix" parameter to point towards
993~/ in this case.
994
995Now it's time to compile GNUnet as usual. Though this will take some time,
996so you may fetch yourself a coffee or some Mate now...
997
998@example
999make ; make install
1000@end example
1001
1002@node Adjusting Windows for running and testing GNUnet
1003@subsection Adjusting Windows for running and testing GNUnet
1004
1005Assuming the build succeeded and you
1006@strong{added the bin directory of your GNUnet to PATH}, you can now use
1007your gnunet-installation as usual.
1008Remember that UAC or the windows firewall may popup initially, blocking
1009further execution of gnunet until you acknowledge them.
1010
1011You will also have to take the usual steps to get peer-to-peer (p2p)
1012software running properly (port forwarding, ...),
1013and GNUnet will require administrative permissions as it may even
1014install a device-driver (in case you are using gnunet-vpn and/or
1015gnunet-exit).
1016
1017@node Building the GNUnet Installer
1018@subsection Building the GNUnet Installer
1019
1020The GNUnet installer is made with
1021@uref{http://nsis.sourceforge.net/, NSIS}.
1022The installer script is located in @file{contrib\win} in the
1023GNUnet source tree.
1024
1025@node Using GNUnet with Netbeans on Windows
1026@subsection Using GNUnet with Netbeans on Windows
1027
1028TODO
1029
1030@node Build instructions for Debian 7.5
1031@section Build instructions for Debian 7.5
1032
1033
1034These are the installation instructions for Debian 7.5. They were tested
1035using a minimal, fresh Debian 7.5 AMD64 installation without non-free
1036software (no contrib or non-free).
1037By "minimal", we mean that during installation, we did not select any
1038desktop environment, servers or system utilities during the "tasksel"
1039step. Note that the packages and the dependencies that we will install
1040during this chapter take about 1.5 GB of disk space.
1041Combined with GNUnet and space for objects during compilation, you should
1042not even attempt this unless you have about 2.5 GB free after the minimal
1043Debian installation.
1044Using these instructions to build a VM image is likely to require a
1045minimum of 4-5 GB for the VM (as you will likely also want a desktop
1046manager).
1047
1048GNUnet's security model assumes that your @file{/home} directory is
1049encrypted. Thus, if possible, you should encrypt your home partition
1050(or per-user home directory).
1051
1052Naturally, the exact details of the starting state for your installation
1053should not matter much. For example, if you selected any of those
1054installation groups you might simply already have some of the necessary
1055packages installed.
1056We did this for testing, as this way we are less likely to forget to
1057mention a required package.
1058Note that we will not install a desktop environment, but of course you
1059will need to install one to use GNUnet's graphical user interfaces.
1060Thus, it is suggested that you simply install the desktop environment of
1061your choice before beginning with the instructions.
1062
1063
1064
1065@menu
1066* Update::
1067* Stable? Hah!::
1068* Update again::
1069* Installing packages::
1070* Installing dependencies from source::
1071* Installing GNUnet from source::
1072* But wait there is more!::
1073@end menu
1074
1075@node Update
1076@subsection Update
1077
1078After any installation, you should begin by running
1079
1080@example
1081# apt-get update ; apt-get upgrade
1082@end example
1083
1084to ensure that all of your packages are up-to-date. Note that the "#" is
1085used to indicate that you need to type in this command as "root"
1086(or prefix with "sudo"), whereas "$" is used to indicate typing in a
1087command as a normal user.
1088
1089@node Stable? Hah!
1090@subsection Stable? Hah!
1091
1092Yes, we said we start with a Debian 7.5 "stable" system. However, to
1093reduce the amount of compilation by hand, we will begin by allowing the
1094installation of packages from the testing and unstable distributions as
1095well.
1096We will stick to "stable" packages where possible, but some packages will
1097be taken from the other distributions.
1098Start by modifying @file{/etc/apt/sources.list} to contain the
1099following (possibly adjusted to point to your mirror of choice):
1100
1101@example
1102# These were there before:
1103deb http://ftp.de.debian.org/debian/ wheezy main
1104deb-src http://ftp.de.debian.org/debian/ wheezy main
1105deb http://security.debian.org/ wheezy/updates main
1106deb-src http://security.debian.org/ wheezy/updates main
1107deb http://ftp.de.debian.org/debian/ wheezy-updates main
1108deb-src http://ftp.de.debian.org/debian/ wheezy-updates main
1109
1110# Add these lines (feel free to adjust the mirror):
1111deb http://ftp.de.debian.org/debian/ testing main
1112deb http://ftp.de.debian.org/debian/ unstable main
1113@end example
1114
1115The next step is to create/edit your @file{/etc/apt/preferences}
1116file to look like this:
1117
1118@example
1119Package: *
1120Pin: release a=stable,n=wheezy
1121Pin-Priority: 700
1122
1123Package: *
1124Pin: release o=Debian,a=testing
1125Pin-Priority: 650
1126
1127Package: *
1128Pin: release o=Debian,a=unstable
1129Pin-Priority: 600
1130@end example
1131
1132You can read more about Apt Preferences here and here.
1133Note that other pinnings are likely to also work for GNUnet, the key
1134thing is that you need some packages from unstable (as shown below).
1135However, as unstable is unlikely to be comprehensive (missing packages)
1136or might be problematic (crashing packages), you probably want others
1137from stable and/or testing.
1138
1139@node Update again
1140@subsection Update again
1141
1142Now, run again@
1143
1144@example
1145# apt-get update@
1146# apt-get upgrade@
1147@end example
1148
1149to ensure that all your new distribution indices are downloaded, and
1150that your pinning is correct: the upgrade step should cause no changes
1151at all.
1152
1153@node Installing packages
1154@subsection Installing packages
1155
1156We begin by installing a few Debian packages from stable:@
1157
1158@example
1159# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
1160 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev \
1161 texlive libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev \
1162 libbz2-dev libexiv2-dev libflac-dev libgif-dev libglib2.0-dev \
1163 libgtk-3-dev libmagic-dev libjpeg8-dev libmpeg2-4-dev libmp4v2-dev \
1164 librpm-dev libsmf-dev libtidy-dev libtiff5-dev libvorbis-dev \
1165 libogg-dev zlib1g-dev g++ gettext libgsf-1-dev libunbound-dev \
1166 libqrencode-dev libgladeui-dev nasm texlive-latex-extra \
1167 libunique-3.0-dev gawk miniupnpc libfuse-dev libbluetooth-dev
1168@end example
1169
1170After that, we install a few more packages from unstable:@
1171
1172@example
1173# apt-get install -t unstable nettle-dev libgstreamer1.0-dev \
1174 gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
1175 libgstreamer-plugins-base1.0-dev
1176@end example
1177
1178@node Installing dependencies from source
1179@subsection Installing dependencies from source
1180
1181Next, we need to install a few dependencies from source.
1182You might want to do this as a "normal" user and only run the
1183@code{make install} steps as root (hence the @code{sudo} in the
1184commands below). Also, you do this from any
1185directory. We begin by downloading all dependencies, then extracting the
1186sources, and finally compiling and installing the libraries.
1187
1188For these steps, follow the instructions given in the
1189installation from source instruction in this order:
1190
1191@itemize @bullet
1192@item @ref{generic source installation - libav}
1193@item @ref{generic source installation - libextractor}
1194@item @ref{generic source installation - libgpg-error}
1195@item @ref{generic source installation - libgcrypt}
1196@item @ref{generic source installation - gnutls}
1197@item @ref{generic source installation - libmicrohttpd}
1198@item @ref{generic source installation - libgnurl}
1199@end itemize
1200
1201@node Installing GNUnet from source
1202@subsection Installing GNUnet from source
1203
1204
1205For this, simply follow the generic installation instructions from
1206here.
1207
1208@node But wait there is more!
1209@subsection But wait there is more!
1210
1211So far, we installed all of the packages and dependencies required to
1212ensure that all of GNUnet would be built.
1213However, while for example the plugins to interact with the MySQL or
1214Postgres databases have been created, we did not actually install or
1215configure those databases. Thus, you will need to install
1216and configure those databases or stick with the default Sqlite database.
1217Sqlite is usually fine for most applications, but MySQL can offer better
1218performance and Postgres better resillience.
1219
1220
1221@node Installing GNUnet from Git on Ubuntu 14.4
1222@section Installing GNUnet from Git on Ubuntu 14.4
1223
1224@strong{Install the required build tools:}
1225
1226@example
1227$ sudo apt-get install git automake autopoint autoconf
1228@end example
1229
1230@strong{Install the required dependencies}
1231
1232@example
1233$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
1234 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
1235 libmicrohttpd-dev libgnutls28-dev
1236@end example
1237
1238@strong{Choose one or more database backends}
1239
1240@itemize @bullet
1241
1242@item SQLite3:
1243
1244@example
1245$ sudo apt-get install libsqlite3-dev
1246@end example
1247
1248@item MySQL:
1249
1250@example
1251$ sudo apt-get install libmysqlclient-dev
1252@end example
1253
1254@item PostgreSQL:
1255
1256@example
1257$ sudo apt-get install libpq-dev postgresql
1258@end example
1259
1260@end itemize
1261
1262@strong{Install the optional dependencies for gnunet-conversation:}
1263
1264@example
1265$ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev
1266@end example
1267
1268@strong{Install the libgrypt 1.6.1:}
1269
1270@itemize @bullet
1271
1272@item For Ubuntu 14.04:
1273
1274@example
1275$ sudo apt-get install libgcrypt20-dev
1276@end example
1277
1278@item For Ubuntu older 14.04:
1279
1280@example
1281$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2
1282$ tar xf libgcrypt-1.6.1.tar.bz2
1283$ cd libgcrypt-1.6.1
1284$ ./configure
1285$ sudo make install
1286$ cd ..
1287@end example
1288
1289@end itemize
1290
1291@strong{Install libgnurl}
1292
1293@example
1294$ wget https://gnunet.org/sites/default/files/gnurl-7.35.0.tar.bz2
1295$ tar xf gnurl-7.35.0.tar.bz2
1296$ cd gnurl-7.35.0
1297$ ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
1298 --without-libmetalink --without-winidn --without-librtmp \
1299 --without-nghttp2 --without-nss --without-cyassl --without-polarssl \
1300 --without-ssl --without-winssl --without-darwinssl --disable-sspi \
1301 --disable-ntlm-wb --disable-ldap --disable-rtsp --disable-dict \
1302 --disable-telnet --disable-tftp --disable-pop3 --disable-imap \
1303 --disable-smtp --disable-gopher --disable-file --disable-ftp
1304$ sudo make install
1305$ cd ..
1306@end example
1307
1308@strong{Install GNUnet}
1309
1310@example
1311$ git clone https://gnunet.org/git/gnunet/
1312$ cd gnunet/
1313$ ./bootstrap
1314@end example
1315
1316If you want to:
1317
1318@itemize @bullet
1319
1320@item Install to a different directory:
1321
1322@example
1323--prefix=PREFIX
1324@end example
1325
1326@item
1327Have sudo permission, but do not want to compile as root:
1328
1329@example
1330--with-sudo
1331@end example
1332
1333@item
1334Want debug message enabled:
1335
1336@example
1337--enable-logging=verbose
1338@end example
1339
1340@end itemize
1341
1342
1343@example
1344$ ./configure [ --with-sudo | --prefix=PREFIX | --enable-logging=verbose]
1345$ make; sudo make install
1346@end example
1347
1348After installing it, you need to create an empty configuration file:
1349
1350@example
1351touch ~/.config/gnunet.conf
1352@end example
1353
1354And finally you can start GNUnet with
1355
1356@example
1357$ gnunet-arm -s
1358@end example
1359
1360@node Build instructions for Debian 8
1361@section Build instructions for Debian 8
1362@c FIXME: I -> we
1363
1364These are the installation instructions for Debian 8. They were tested
1365sing a fresh Debian 8 AMD64 installation without non-free software (no
1366contrib or non-free). During installation, I only selected "lxde" for the
1367desktop environment.
1368Note that the packages and the dependencies that we will install during
1369this chapter take about 1.5 GB of disk space. Combined with GNUnet and
1370space for objects during compilation, you should not even attempt this
1371unless you have about 2.5 GB free after the Debian installation.
1372Using these instructions to build a VM image is likely to require a
1373minimum of 4-5 GB for the VM (as you will likely also want a desktop
1374manager).
1375
1376GNUnet's security model assumes that your @code{/home} directory is
1377encrypted.
1378Thus, if possible, you should encrypt your entire disk, or at least just
1379your home partition (or per-user home directory).
1380
1381Naturally, the exact details of the starting state for your installation
1382should not matter much.
1383For example, if you selected any of those installation groups you might
1384simply already have some of the necessary packages installed. Thus, it is
1385suggested that you simply install the desktop environment of your choice
1386before beginning with the instructions.
1387
1388
1389@menu
1390* Update Debian::
1391* Installing Debian Packages::
1392* Installing Dependencies from Source2::
1393* Installing GNUnet from Source2::
1394* But wait (again) there is more!::
1395@end menu
1396
1397@node Update Debian
1398@subsection Update Debian
1399
1400After any installation, you should begin by running
1401
1402@example
1403# apt-get update
1404# apt-get upgrade
1405@end example
1406
1407to ensure that all of your packages are up-to-date. Note that the "#" is
1408used to indicate that you need to type in this command as "root" (or
1409prefix with "sudo"), whereas "$" is used to indicate typing in a command
1410as a normal user.
1411
1412@node Installing Debian Packages
1413@subsection Installing Debian Packages
1414
1415We begin by installing a few Debian packages from stable:
1416
1417@example
1418# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
1419libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev texlive \
1420libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev libbz2-dev \
1421libflac-dev libgif-dev libglib2.0-dev libgtk-3-dev libmpeg2-4-dev \
1422libtidy-dev libvorbis-dev libogg-dev zlib1g-dev g++ gettext \
1423libgsf-1-dev libunbound-dev libqrencode-dev libgladeui-dev nasm \
1424texlive-latex-extra libunique-3.0-dev gawk miniupnpc libfuse-dev \
1425libbluetooth-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
1426libgstreamer-plugins-base1.0-dev nettle-dev libextractor-dev \
1427libgcrypt20-dev libmicrohttpd-dev
1428@end example
1429
1430@node Installing Dependencies from Source2
1431@subsection Installing Dependencies from Source2
1432
1433Yes, we said we start with a Debian 8 "stable" system, but because Debian
1434linked GnuTLS without support for DANE, we need to compile a few things,
1435in addition to GNUnet, still by hand. Yes, you can run GNUnet using the
1436respective Debian packages, but then you will not get DANE support.
1437
1438Next, we need to install a few dependencies from source. You might want
1439to do this as a "normal" user and only run the @code{make install} steps
1440as root (hence the @code{sudo} in the commands below). Also, you do this
1441from any directory. We begin by downloading all dependencies, then
1442extracting the sources, and finally compiling and installing the
1443libraries:
1444
1445@example
1446$ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.12.tar.xz
1447$ tar xvf gnutls-3.3.12.tar.xz
1448$ cd gnutls-3.3.12 ; ./configure ; make ; sudo make install ; cd ..
1449@end example
1450
1451For the installation and compilation of libgnurl/gnURL refer to
1452the generic installation section,
1453@xref{generic source installation - libgnurl}.
1454
1455@node Installing GNUnet from Source2
1456@subsection Installing GNUnet from Source2
1457
1458For this, simply follow the generic installation instructions from@
1459here.
1460
1461@node But wait (again) there is more!
1462@subsection But wait (again) there is more!
1463
1464So far, we installed all of the packages and dependencies required to
1465ensure that all of GNUnet would be built. However, while for example the
1466plugins to interact with the MySQL or Postgres databases have been
1467created, we did not actually install or configure those databases.
1468Thus, you will need to install and configure those databases or stick
1469with the default Sqlite database. Sqlite is usually fine for most
1470applications, but MySQL can offer better performance and Postgres better
1471resillience.
1472
1473@node Outdated build instructions for previous revisions
1474@section Outdated build instructions for previous revisions
1475
1476This chapter contains a collection of outdated, older installation guides.
1477They are mostly intended to serve as a starting point for writing
1478up-to-date instructions and should not be expected to work for
1479GNUnet 0.10.x.
1480A set of older installation instructions can also be found in the
1481file @file{doc/outdated-and-old-installation-instructions.txt} in the
1482source tree of GNUnet.
1483
1484This file covers old instructions which no longer receive security
1485updates or any kind of support.
1486
1487@menu
1488* Installing GNUnet 0.10.1 on Ubuntu 14.04::
1489* Building GLPK for MinGW::
1490* GUI build instructions for Ubuntu 12.04 using Subversion::
1491@c * Installation with gnunet-update::
1492* Instructions for Microsoft Windows Platforms (Old)::
1493@end menu
1494
1495
1496@node Installing GNUnet 0.10.1 on Ubuntu 14.04
1497@subsection Installing GNUnet 0.10.1 on Ubuntu 14.04
1498
1499Install the required dependencies:
1500
1501@example
1502$ sudo apt-get install libltdl-dev libgpg-error-dev libidn11-dev \
1503 libunistring-dev libglpk-dev libbluetooth-dev libextractor-dev \
1504 libmicrohttpd-dev libgnutls28-dev
1505@end example
1506
1507Choose one or more database backends:
1508
1509@itemize @bullet
1510
1511@item SQLite3
1512
1513@example
1514 $ sudo apt-get install libsqlite3-dev@
1515@end example
1516
1517@item MySQL
1518
1519@example
1520$ sudo apt-get install libmysqlclient-dev@
1521@end example
1522
1523@item PostgreSQL
1524
1525@example
1526 $ sudo apt-get install libpq-dev postgresql@
1527@end example
1528
1529@end itemize
1530
1531Install the optional dependencies for gnunet-conversation:
1532
1533@example
1534 $ sudo apt-get install gstreamer1.0 libpulse-dev libopus-dev
1535@end example
1536
1537Install libgcrypt 1.6:
1538
1539@itemize @bullet
1540
1541@item For Ubuntu 14.04:
1542
1543@example
1544$ sudo apt-get install libgcrypt20-dev
1545@end example
1546
1547@item For Ubuntu older than 14.04:
1548
1549@example
1550wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2
1551$ tar xf libgcrypt-1.6.1.tar.bz2
1552$ cd libgcrypt-1.6.1
1553$ ./configure
1554$ sudo make install
1555$ cd ..
1556@end example
1557@end itemize
1558
1559Install libgnurl:
1560
1561@pxref{generic source installation - libgnurl}.
1562
1563Install GNUnet:
1564
1565@example
1566$ wget http://ftpmirror.gnu.org/gnunet/gnunet-0.10.1.tar.gz
1567$ tar xf gnunet-0.10.1.tar.gz
1568$ cd gnunet-0.10.1
1569@end example
1570
1571If you want to:
1572
1573@itemize @bullet
1574
1575@item
1576Install to a different directory:
1577
1578@example
1579--prefix=PREFIX
1580@end example
1581
1582@item
1583Have sudo permission, but do not want to compile as root:
1584
1585@example
1586--with-sudo
1587@end example
1588
1589@item
1590Want debug message enabled:
1591
1592@example
1593--enable-logging=verbose
1594@end example
1595
1596@end itemize
1597
1598@example
1599$ ./configure [ --with-sudo | --prefix=PREFIX | --enable-logging=verbose]
1600$ make; sudo make install
1601@end example
1602
1603After installing it, you need to create an empty configuration file:
1604
1605@example
1606touch ~/.config/gnunet.conf
1607@end example
1608
1609And finally you can start GNUnet with
1610
1611@example
1612$ gnunet-arm -s
1613@end example
1614
1615@node Building GLPK for MinGW
1616@subsection Building GLPK for MinGW
1617
1618GNUnet now requires the GNU Linear Programming Kit (GLPK).
1619Since there's is no package you can install with @code{mingw-get} you
1620have to compile it from source:
1621
1622@itemize @bullet
1623
1624@item Download the latest version from
1625@uref{http://ftp.gnu.org/gnu/glpk/}
1626
1627@item Unzip the downloaded source tarball using your favourite
1628unzipper application In the MSYS shell
1629
1630@item change to the respective directory
1631
1632@item Configure glpk for "i686-pc-mingw32":
1633
1634@example
1635./configure '--build=i686-pc-mingw32'
1636@end example
1637
1638@item run
1639
1640@example
1641make install check
1642@end example
1643
1644@end itemize
1645
1646MinGW does not automatically detect the correct buildtype so you have to
1647specify it manually.
1648
1649
1650@node GUI build instructions for Ubuntu 12.04 using Subversion
1651@subsection GUI build instructions for Ubuntu 12.04 using Subversion
1652
1653After installing GNUnet you can continue installing the GNUnet GUI tools:
1654
1655First, install the required dependencies:
1656
1657@example
1658$ sudo apt-get install libgladeui-dev libqrencode-dev
1659@end example
1660
1661Please ensure that the GNUnet shared libraries can be found by the linker.
1662If you installed GNUnet libraries in a non standard path
1663(say GNUNET_PREFIX=/usr/local/lib/), you can
1664
1665@itemize @bullet
1666
1667@item set the environmental variable permanently to:
1668
1669@example
1670LD_LIBRARY_PATH=$GNUNET_PREFIX
1671@end example
1672
1673@item or add @code{$GNUNET_PREFIX} to @file{/etc/ld.so.conf}
1674
1675@end itemize
1676
1677Now you can checkout and compile the GNUnet GUI tools:
1678
1679@example
1680$ git clone https://gnunet.org/git/gnunet-gtk
1681$ cd gnunet-gtk
1682$ ./bootstrap
1683$ ./configure --prefix=$GNUNET_PREFIX/.. --with-gnunet=$GNUNET_PREFIX/..
1684$ make install
1685@end example
1686
1687@c @node Installation with gnunet-update
1688@c @subsection Installation with gnunet-update
1689
1690@c gnunet-update project is an effort to introduce updates to GNUnet
1691@c installations. An interesting to-be-implemented-feature of gnunet-update
1692@c is that these updates are propagated through GNUnet's peer-to-peer
1693@c network. More information about gnunet-update can be found at
1694@c @c FIXME: Use correct cgit URL
1695@c @uref{https://gnunet.org/git/gnunet-update.git/tree/plain/README}.
1696
1697@c While the project is still under development, we have implemented the
1698@c following features which we believe may be helpful for users and we
1699@c would like them to be tested:
1700
1701@c @itemize @bullet
1702
1703@c @item
1704@c Packaging GNUnet installation along with its run-time dependencies into
1705@c update packages
1706
1707@c @item
1708@c Installing update packages into compatible hosts
1709
1710@c @item
1711@c Updating an existing installation (which had been installed by
1712@c gnunet-update) to a newer one
1713
1714@c @end itemize
1715
1716@c The above said features of gnunet-update are currently available for
1717@c testing on GNU/Linux systems.
1718
1719@c The following is a guide to help you get started with gnunet-update.
1720@c It shows you how to install the testing binary packages of GNUnet
1721@c 0.9.1 we have at @uref{https://gnunet.org/install/}.
1722
1723@c gnunet-update needs the following dependencies:
1724
1725@c @itemize @bullet
1726@c @item
1727@c python @geq{} 2.6
1728
1729@c @item
1730@c gnupg
1731
1732@c @item
1733@c python-gpgme
1734@c @end itemize
1735
1736
1737@c Checkout gnunet-update:
1738
1739@c @c FIXME: git!
1740@c @example
1741@c $ svn checkout -r24905 https://gnunet.org/svn/gnunet-update@
1742@c @end example
1743
1744@c For security reasons, all packages released for gnunet-update from us are
1745@c signed with the key at @uref{https://gnunet.org/install/key.txt}.
1746@c You would need to import this key into your gpg key ring.
1747@c gnunet-update uses this key to verify the integrity of the packages it
1748@c installs:
1749
1750@c @example
1751@c $ gpg --recv-keys 7C613D78@
1752@c @end example
1753
1754@c Download the packages relevant to your architecture (currently I have
1755@c access to GNU/Linux machines on x86_64 and i686, so only two for now,
1756@c hopefully more later) from https://gnunet.org/install/.
1757
1758@c To install the downloaded package into the directory /foo:
1759
1760@c @example
1761@c gnunet-update/bin/gnunet-update install downloaded/package /foo
1762@c @end example
1763
1764@c The installer reports the directories into which shared libraries and
1765@c dependencies have been installed. You may need to add the reported shared
1766@c library installation paths to LD_LIBRARY_PATH before you start running any
1767@c installed binaries.
1768
1769@c Please report bugs at https://gnunet.org/bugs/ under the project
1770@c 'gnunet-update'.
1771
1772@node Instructions for Microsoft Windows Platforms (Old)
1773@subsection Instructions for Microsoft Windows Platforms (Old)
1774
1775This document is a @b{DEPRECATED} installation guide for GNUnet on
1776Windows.
1777It will not work for recent GNUnet versions, but maybe it will be of
1778some use if problems arise.
1779
1780The Windows build uses a UNIX emulator for Windows,
1781@uref{http://www.mingw.org/, MinGW}, to build the executable modules.
1782These modules run natively on Windows and do not require additional
1783emulation software besides the usual dependencies.
1784
1785GNUnet development is mostly done under GNU/Linux and especially git
1786checkouts may not build out of the box.
1787We regret any inconvenience, and if you have problems, please report them.
1788
1789@menu
1790* Hardware and OS requirements::
1791* Software installation::
1792* Building libextractor and GNUnet::
1793* Installer::
1794* Source::
1795@end menu
1796
1797@node Hardware and OS requirements
1798@subsubsection Hardware and OS requirements
1799
1800@itemize @bullet
1801
1802@item Pentium II or equivalent processor, @geq{} 350 MHz
1803
1804@item 128 MB RAM
1805
1806@item 600 MB free disk space
1807
1808@item Windows 2000 or Windows XP are recommended
1809
1810@end itemize
1811
1812@node Software installation
1813@subsubsection Software installation
1814
1815@itemize @bullet
1816
1817@item
1818@strong{Compression software}@
1819
1820The software packages GNUnet depends on are usually compressed using UNIX
1821tools like @command{tar}, @command{gzip}, @command{xzip} and
1822@command{bzip2}.
1823If you do not already have an utility that is able to extract such
1824archives, get @uref{http://www.7-zip.org/, 7-Zip}.
1825
1826@item
1827@strong{UNIX environment}@
1828
1829The MinGW project provides the compiler toolchain that is used to build
1830GNUnet.
1831Get the following packages from the
1832@uref{http://sourceforge.net/projects/mingw/files/, MinGW} project:
1833
1834@itemize @bullet
1835
1836@item GCC core
1837@item GCC g++
1838@item MSYS
1839@item MSYS Developer Tool Kit (msysDTK)
1840@item MSYS Developer Tool Kit - msys-autoconf (bin)
1841@item MSYS Developer Tool Kit - msys-automake (bin)
1842@item MinGW Runtime
1843@item MinGW Utilities
1844@item Windows API
1845@item Binutils
1846@item make
1847@item pdcurses
1848@item GDB (snapshot)
1849@end itemize
1850
1851@itemize @bullet
1852
1853
1854@item Install MSYS (to c:\mingw, for example.)@
1855Do @strong{not} use spaces in the pathname.
1856For example, avoid a location such as @file{c:\program files\mingw}.
1857
1858@item Install MinGW runtime, utilities and GCC to a subdirectory
1859(to @file{c:\mingw\mingw}, for example)
1860
1861@item Install the Development Kit to the MSYS directory
1862(@file{c:\mingw})
1863
1864@item Create a batch file bash.bat in your MSYS directory with
1865the files:
1866
1867@example
1868bin\sh.exe --login
1869@end example
1870
1871This batch file opens a shell which is used to invoke the build
1872processes.
1873MinGW's standard shell (@command{msys.bat}) is not suitable
1874because it opens a separate console window.
1875On Vista, @command{bash.bat} needs to be run as Administrator.
1876
1877@item
1878Start @command{bash.sh} and rename
1879@file{c:\mingw\mingw\lib\libstdc++.la} to avoid problems:
1880
1881@example
1882mv /usr/mingw/lib/libstdc++.la /usr/mingw/lib/libstdc++.la.broken
1883@end example
1884
1885@item
1886Unpack the Windows API to the MinGW directory (@file{c:\mingw\mingw\}) and
1887remove the declaration of DATADIR from
1888(@file{c:\mingw\mingw\include\objidl.h} (lines 55-58)
1889
1890@item
1891Unpack autoconf, automake to the MSYS directory (@file{c:\mingw})
1892
1893@item
1894Install all other packages to the MinGW directory (@file{c:\mingw\mingw\})
1895@end itemize
1896
1897
1898@item @strong{GNU Libtool}@
1899GNU Libtool is required to use shared libraries.
1900Get the prebuilt package from here and unpack it to the
1901MinGW directory (@file{c:\mingw})
1902
1903@item @strong{Pthreads}@
1904GNUnet uses the portable POSIX thread library for multi-threading:
1905
1906@itemize @bullet
1907
1908@item Save
1909@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/libpthreadGC2.a, libpthreadGC2.a}
1910(x86) or
1911@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/libpthreadGC2.a, libpthreadGC2.a}
1912(x64) as libpthread.a into the @file{lib}
1913directory (@file{c:\mingw\mingw\lib\libpthread.a}).
1914
1915@item Save
1916@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x86/pthreadGC2.dll, pthreadGC2.dll}
1917(x86) or
1918@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/x64/pthreadGC2.dll, libpthreadGC2.a}
1919(x64) into the MinGW @file{bin} directory (@file{c:\mingw\mingw\bin}).
1920
1921@item Download all header files from
1922@uref{ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/, include/}
1923to the @file{include} directory (@file{c:\mingw\mingw\include}).
1924@end itemize
1925
1926
1927@item @strong{GNU MP}@
1928GNUnet uses the GNU Multiple Precision library for special cryptographic
1929operations. Get the GMP binary package from the
1930@uref{http://sourceforge.net/projects/mingwrep/, MinGW repository} and
1931unpack it to the MinGW directory (@file{c:\mingw\mingw})
1932
1933@item @strong{GNU Gettext}@
1934GNU gettext is used to provide national language support.
1935Get the prebuilt package from hereand unpack it to the MinGW
1936directory (@file{c:\mingw\mingw})
1937
1938@item @strong{GNU iconv}@
1939GNU Libiconv is used for character encoding conversion.
1940Get the prebuilt package from here and unpack it to the MinGW
1941directory (@file{c:\mingw\mingw}).
1942
1943@item @strong{SQLite}@
1944GNUnet uses the SQLite database to store data.
1945Get the prebuilt binary from here and unpack it to your MinGW directory.
1946
1947@item @strong{MySQL}@
1948As an alternative to SQLite, GNUnet also supports MySQL.
1949
1950@itemize @bullet
1951
1952@item Get the binary installer from the
1953@uref{http://dev.mysql.com/downloads/mysql/4.1.html#Windows, MySQL project}
1954(version 4.1), install it and follow the instructions in
1955@file{README.mysql}.
1956
1957@item Create a temporary build directory (@file{c:\mysql})
1958
1959@item Copy the directories @file{include\} and @file{lib\} from the
1960MySQL directory to the new directory
1961
1962@item Get the patches from
1963@uref{http://bugs.mysql.com/bug.php?id=8906&files=1, Bug #8906} and
1964@uref{http://bugs.mysql.com/bug.php?id=8872&files=1, Bug #8872} (the
1965latter is only required for MySQL
1966
1967@example
1968patch -p 0
1969@end example
1970
1971@item Move @file{lib\opt\libmysql.dll} to @file{lib\libmysql.dll}
1972
1973@item Change to @file{lib\} and create an import library:
1974
1975@example
1976dlltool --input-def ../include/libmySQL.def \
1977--dllname libmysql.dll \
1978--output-lib libmysqlclient.a -k
1979@end example
1980
1981@item Copy include\* to include\mysql\
1982
1983@item Pass @code{--with-mysql=/c/mysql} to
1984@command{./configure} and copy @file{libmysql.dll}
1985to your PATH or GNUnet's @file{bin} directory
1986@end itemize
1987
1988
1989@item @strong{GTK+}@
1990@command{gnunet-gtk} and @command{libextractor} depend on GTK.
1991Get the the binary and developer packages of @command{atk},
1992@command{glib}, @command{gtk}, @command{iconv},
1993@command{gettext-runtime}, @command{pango} from
1994@uref{ftp://ftp.gtk.org/pub/gtk/v2.6/win32, gtk.org} and unpack them
1995to the MinGW directory (@file{c:\mingw\mingw}).
1996@c FIXME: The URL below for pkg-config seems wrong.
1997Get @uref{http://www.gtk.org/download/win32.php, pkg-config} and
1998@command{libpng} and unpack them to the MinGW directory
1999(@file{c:\mingw\mingw}).
2000Here is an all-in-one package for the
2001@uref{http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip, gtk+dependencies}
2002. Do not overwrite any existing files!
2003
2004@item @strong{Glade}@
2005@command{gnunet-gtk} and @command{gnunet-setup} were created using
2006this interface builder
2007
2008@itemize @bullet
2009
2010@item Get the Glade and libglade (-bin and -devel) packages
2011(without GTK!) from
2012@uref{http://gladewin32.sourceforge.net/, GladeWin32} and unpack them to
2013the MinGW directory (@file{c:\mingw\mingw}).
2014
2015@item Get @command{libxml} from here and unpack it to the MinGW
2016directory (@file{c:\mingw\mingw}).
2017@end itemize
2018
2019@c FIXME: URLs
2020@item @strong{zLib}@
2021@command{libextractor} requires @command{zLib} to decompress some file
2022formats. GNUnet uses it to (de)compress meta-data.
2023Get zLib from here (Signature) and unpack it to the MinGW directory
2024(@file{c:\mingw\mingw}).
2025
2026@item @strong{Bzip2}@
2027@command{libextractor} also requires @command{Bzip2} to
2028decompress some file formats.
2029Get the Bzip2 (binary and developer package) from
2030@uref{http://gnuwin32.sourceforge.net/packages/bzip2.htm, GnuWin32} and
2031unpack it to the MinGW directory (@file{c:\mingw\mingw}).
2032
2033@item @strong{Libgcrypt}@
2034@command{Libgcrypt} provides the cryptographic functions used by GNUnet.
2035Get Libgcrypt from @uref{ftp://ftp.gnupg.org/gcrypt/libgcrypt/, here},
2036compile and place it in the MinGW directory
2037(@file{c:\mingw\mingw}). Currently libgcrypt @geq{} 1.4.2 is required to
2038compile GNUnet.
2039
2040@item @strong{PlibC}@
2041PlibC emulates Unix functions under Windows. Get PlibC from here and
2042unpack it to the MinGW directory (c:\mingw\mingw)
2043
2044@item @strong{OGG Vorbis}@
2045@command{OGG Vorbis} is used to extract meta-data from @file{.ogg} files.
2046Get the packages
2047@uref{http://www.gnunet.org/libextractor/download/win/libogg-1.1.4.zip, libogg}
2048and
2049@uref{http://www.gnunet.org/libextractor/download/win/libvorbis-1.2.3.zip, libvorbis}
2050from the
2051@uref{http://ftp.gnu.org/gnu/libextractor/libextractor-w32-1.0.0.zip, libextractor win32 build}
2052and unpack them to the MinGW directory (c:\mingw\mingw).
2053
2054@item @strong{Exiv2}@
2055(lib)Exiv2 is used to extract meta-data from files with Exiv2 meta-data.
2056Download
2057@uref{http://www.gnunet.org/libextractor/download/win/exiv2-0.18.2.zip, Exiv2}
2058and unpack it to the MSYS directory (c:\mingw).
2059@end itemize
2060
2061@node Building libextractor and GNUnet
2062@subsubsection Building libextractor and GNUnet
2063
2064Before you compile @command{libextractor} or @command{GNUnet},
2065be sure to set @code{PKG_CONFIG_PATH}:
2066
2067@example
2068export PKG_CONFIG_PATH=/mingw/lib/pkgconfig
2069@end example
2070
2071@noindent
2072@xref{GNUnet Installation Handbook}, for basic instructions on building
2073@command{libextractor} and @command{GNUnet}.
2074By default, all modules that are created in this way contain
2075debug information and are quite large. To compile release versions
2076(small and fast) set the variable @code{CFLAGS}:
2077
2078@example
2079export CFLAGS='-O2 -march=pentium -fomit-frame-pointer'
2080./configure --prefix=$HOME --with-extractor=$HOME
2081@end example
2082
2083@node Installer
2084@subsubsection Installer
2085
2086The GNUnet installer is made with
2087@uref{http://nsis.sourceforge.net/, NSIS}. The installer script is
2088located in @file{contrib\win} in the GNUnet source tree.
2089
2090@node Source
2091@subsubsection Source
2092
2093@c FIXME: URL
2094The sources of all dependencies are available here.
2095
2096@c @node Portable GNUnet
2097@c @section Portable GNUnet
2098
2099@c Quick instructions on how to use the most recent GNUnet on most GNU/Linux
2100@c distributions
2101
2102@c Currently this has only been tested on Ubuntu 12.04, 12.10, 13.04, Debian
2103@c and CentOS 6, but it should work on almost any GNU/Linux distribution.
2104@c More in-detail information can be found in the handbook.
2105
2106@c Note 2017-10: Currently this section assumes the old SVN repo of GNUnet
2107@c which no longer exists.
2108
2109@c @menu
2110@c * Prerequisites::
2111@c * Download & set up gnunet-update::
2112@c * Install GNUnet::
2113@c @end menu
2114
2115@c @node Prerequisites
2116@c @subsection Prerequisites
2117
2118@c Open a terminal and paste this line into it to install all required tools
2119@c needed:
2120
2121@c @example
2122@c sudo apt-get install python-gpgme subversion
2123@c @end example
2124
2125@c @node Download & set up gnunet-update
2126@c @subsection Download & set up gnunet-update
2127
2128@c The following command will download a working version of gnunet-update
2129@c with the subversion tool and import the public key which is needed for
2130@c authentication:
2131
2132@c @example
2133@c svn checkout -r24905 https://gnunet.org/svn/gnunet-update ~/gnunet-update
2134@c cd ~/gnunet-update
2135@c gpg --keyserver "hkp://keys.gnupg.net" --recv-keys 7C613D78
2136@c @end example
2137
2138@c @node Install GNUnet
2139@c @subsection Install GNUnet
2140
2141@c Download and install GNUnet binaries which can be found here and set
2142@c library paths:
2143
2144@c @example
2145@c wget -P /tmp https://gnunet.org/install/packs/gnunet-0.9.4-`uname -m`.tgz
2146@c ./bin/gnunet-update install /tmp/gnunet-0.9*.tgz ~
2147@c echo "PATH DEFAULT=$@{PATH@}:$HOME/bin" >> ~/.pam_environment
2148@c echo -e "$@{HOME@}/lib\n$@{HOME@}/lib/gnunet-deps" | sudo tee \
2149@c /etc/ld.so.conf.d/gnunet.conf > /dev/null
2150@c sudo ldconfig
2151@c @end example
2152
2153@c You may need to re-login once after executing these last commands
2154
2155@c That's it, GNUnet is installed in your home directory now. GNUnet can be
2156@c configured and afterwards started by executing:
2157
2158@c @example
2159@c gnunet-arm -s
2160@c @end example
2161
2162@node The graphical configuration interface
2163@section The graphical configuration interface
2164
2165If you also would like to use @command{gnunet-gtk} and
2166@command{gnunet-setup} (highly recommended for beginners), do:
2167
2168@example
2169wget -P /tmp \
2170https://gnunet.org/install/packs/gnunet-0.9.4-gtk-0.9.4-`uname -m`.tgz
2171sh ~/gnunet-update/bin/gnunet-update install /tmp/gnunet-*gtk*.tgz ~
2172sudo ldconfig
2173@end example
2174
2175Now you can run @command{gnunet-setup} for easy configuration of your
2176GNUnet peer.
2177
2178@menu
2179* Configuring your peer::
2180* Configuring the Friend-to-Friend (F2F) mode::
2181* Configuring the hostlist to bootstrap::
2182* Configuration of the HOSTLIST proxy settings::
2183* Configuring your peer to provide a hostlist ::
2184* Configuring the datastore::
2185* Configuring the MySQL database::
2186* Reasons for using MySQL::
2187* Reasons for not using MySQL::
2188* Setup Instructions::
2189* Testing::
2190* Performance Tuning::
2191* Setup for running Testcases::
2192* Configuring the Postgres database::
2193* Reasons to use Postgres::
2194* Reasons not to use Postgres::
2195* Manual setup instructions::
2196* Testing the setup manually::
2197* Configuring the datacache::
2198* Configuring the file-sharing service::
2199* Configuring logging::
2200* Configuring the transport service and plugins::
2201* Configuring the wlan transport plugin::
2202* Configuring HTTP(S) reverse proxy functionality using Apache or nginx::
2203* Blacklisting peers::
2204* Configuration of the HTTP and HTTPS transport plugins::
2205* Configuring the GNU Name System::
2206* Configuring the GNUnet VPN::
2207* Bandwidth Configuration::
2208* Configuring NAT::
2209* Peer configuration for distributions::
2210@end menu
2211
2212@node Configuring your peer
2213@subsection Configuring your peer
2214
2215This chapter will describe the various configuration options in GNUnet.
2216
2217The easiest way to configure your peer is to use the
2218@command{gnunet-setup} tool.
2219@command{gnunet-setup} is part of the @command{gnunet-gtk}
2220application. You might have to install it separately.
2221
2222Many of the specific sections from this chapter actually are linked from
2223within @command{gnunet-setup} to help you while using the setup tool.
2224
2225While you can also configure your peer by editing the configuration
2226file by hand, this is not recommended for anyone except for developers
2227as it requires a more in-depth understanding of the configuration files
2228and internal dependencies of GNUnet.
2229
2230@node Configuring the Friend-to-Friend (F2F) mode
2231@subsection Configuring the Friend-to-Friend (F2F) mode
2232
2233GNUnet knows three basic modes of operation:
2234@itemize @bullet
2235@item In standard "peer-to-peer" mode,
2236your peer will connect to any peer.
2237@item In the pure "friend-to-friend"
2238mode, your peer will ONLY connect to peers from a list of friends
2239specified in the configuration.
2240@item Finally, in mixed mode,
2241GNUnet will only connect to arbitrary peers if it
2242has at least a specified number of connections to friends.
2243@end itemize
2244
2245When configuring any of the F2F ("friend-to-friend") modes,
2246you first need to create a file with the peer identities
2247of your friends. Ask your friends to run
2248
2249@example
2250$ gnunet-peerinfo -sq
2251@end example
2252
2253@noindent
2254The resulting output of this command needs to be added to your
2255@file{friends} file, which is simply a plain text file with one line
2256per friend with the output from the above command.
2257
2258You then specify the location of your @file{friends} file in the
2259@code{FRIENDS} option of the "topology" section.
2260
2261Once you have created the @file{friends} file, you can tell GNUnet to only
2262connect to your friends by setting the @code{FRIENDS-ONLY} option
2263(again in the "topology" section) to YES.
2264
2265If you want to run in mixed-mode, set "FRIENDS-ONLY" to NO and configure a
2266minimum number of friends to have (before connecting to arbitrary peers)
2267under the "MINIMUM-FRIENDS" option.
2268
2269If you want to operate in normal P2P-only mode, simply set
2270@code{MINIMUM-FRIENDS} to zero and @code{FRIENDS_ONLY} to NO.
2271This is the default.
2272
2273@node Configuring the hostlist to bootstrap
2274@subsection Configuring the hostlist to bootstrap
2275
2276After installing the software you need to get connected to the GNUnet
2277network. The configuration file included in your download is already
2278configured to connect you to the GNUnet network.
2279In this section the relevant configuration settings are explained.
2280
2281To get an initial connection to the GNUnet network and to get to know
2282peers already connected to the network you can use the so called
2283"bootstrap servers".
2284These servers can give you a list of peers connected to the network.
2285To use these bootstrap servers you have to configure the hostlist daemon
2286to activate bootstrapping.
2287
2288To activate bootstrapping, edit the @code{[hostlist]}-section in your
2289configuration file. You have to set the argument @command{-b} in the
2290options line:
2291
2292@example
2293[hostlist]
2294OPTIONS = -b
2295@end example
2296
2297Additionally you have to specify which server you want to use.
2298The default bootstrapping server is
2299"@uref{http://v10.gnunet.org/hostlist, http://v10.gnunet.org/hostlist}".
2300[^] To set the server you have to edit the line "SERVERS" in the hostlist
2301section. To use the default server you should set the lines to
2302
2303@example
2304SERVERS = http://v10.gnunet.org/hostlist [^]
2305@end example
2306
2307@noindent
2308To use bootstrapping your configuration file should include these lines:
2309
2310@example
2311[hostlist]
2312OPTIONS = -b
2313SERVERS = http://v10.gnunet.org/hostlist [^]
2314@end example
2315
2316@noindent
2317Besides using bootstrap servers you can configure your GNUnet peer to
2318recieve hostlist advertisements.
2319Peers offering hostlists to other peers can send advertisement messages
2320to peers that connect to them. If you configure your peer to receive these
2321messages, your peer can download these lists and connect to the peers
2322included. These lists are persistent, which means that they are saved to
2323your hard disk regularly and are loaded during startup.
2324
2325To activate hostlist learning you have to add the @command{-e}
2326switch to the @code{OPTIONS} line in the hostlist section:
2327
2328@example
2329[hostlist]
2330OPTIONS = -b -e
2331@end example
2332
2333@noindent
2334Furthermore you can specify in which file the lists are saved.
2335To save the lists in the file @file{hostlists.file} just add the line:
2336
2337@example
2338HOSTLISTFILE = hostlists.file
2339@end example
2340
2341@noindent
2342Best practice is to activate both bootstrapping and hostlist learning.
2343So your configuration file should include these lines:
2344
2345@example
2346[hostlist]
2347OPTIONS = -b -e
2348HTTPPORT = 8080
2349SERVERS = http://v10.gnunet.org/hostlist [^]
2350HOSTLISTFILE = $SERVICEHOME/hostlists.file
2351@end example
2352
2353@node Configuration of the HOSTLIST proxy settings
2354@subsection Configuration of the HOSTLIST proxy settings
2355
2356The hostlist client can be configured to use a proxy to connect to the
2357hostlist server.
2358This functionality can be configured in the configuration file directly
2359or using the @command{gnunet-setup} tool.
2360
2361The hostlist client supports the following proxy types at the moment:
2362
2363@itemize @bullet
2364@item HTTP and HTTP 1.0 only proxy
2365@item SOCKS 4/4a/5/5 with hostname
2366@end itemize
2367
2368In addition authentication at the proxy with username and password can be
2369configured.
2370
2371To configure proxy support for the hostlist client in the
2372@command{gnunet-setup} tool, select the "hostlist" tab and select
2373the appropriate proxy type.
2374The hostname or IP address (including port if required) has to be entered
2375in the "Proxy hostname" textbox. If required, enter username and password
2376in the "Proxy username" and "Proxy password" boxes.
2377Be aware that this information will be stored in the configuration in
2378plain text (TODO: Add explanation and generalize the part in Chapter 3.6
2379about the encrypted home).
2380
2381To provide these options directly in the configuration, you can
2382enter the following settings in the @code{[hostlist]} section of
2383the configuration:
2384
2385@example
2386# Type of proxy server,
2387# Valid values: HTTP, HTTP_1_0, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
2388# Default: HTTP
2389# PROXY_TYPE = HTTP
2390
2391# Hostname or IP of proxy server
2392# PROXY =
2393# User name for proxy server
2394# PROXY_USERNAME =
2395# User password for proxy server
2396# PROXY_PASSWORD =
2397@end example
2398
2399@node Configuring your peer to provide a hostlist
2400@subsection Configuring your peer to provide a hostlist
2401
2402If you operate a peer permanently connected to GNUnet you can configure
2403your peer to act as a hostlist server, providing other peers the list of
2404peers known to him.
2405
2406Your server can act as a bootstrap server and peers needing to obtain a
2407list of peers can contact it to download this list.
2408To download this hostlist the peer uses HTTP.
2409For this reason you have to build your peer with libgnurl (or libcurl)
2410and microhttpd support.
2411How you build your peer with these options can be found here:
2412@xref{Generic installation instructions}.
2413
2414To configure your peer to act as a bootstrap server you have to add the
2415@command{-p} option to @code{OPTIONS} in the @code{[hostlist]} section
2416of your configuration file.
2417Besides that you have to specify a port number for the http server.
2418In conclusion you have to add the following lines:
2419
2420@example
2421[hostlist]
2422HTTPPORT = 12980
2423OPTIONS = -p
2424@end example
2425
2426@noindent
2427If your peer acts as a bootstrap server other peers should know about
2428that. You can advertise the hostlist your are providing to other peers.
2429Peers connecting to your peer will get a message containing an
2430advertisement for your hostlist and the URL where it can be downloaded.
2431If this peer is in learning mode, it will test the hostlist and, in the
2432case it can obtain the list successfully, it will save it for
2433bootstrapping.
2434
2435To activate hostlist advertisement on your peer, you have to set the
2436following lines in your configuration file:
2437
2438@example
2439[hostlist]
2440EXTERNAL_DNS_NAME = example.org
2441HTTPPORT = 12981
2442OPTIONS = -p -a
2443@end example
2444
2445@noindent
2446With this configuration your peer will a act as a bootstrap server and
2447advertise this hostlist to other peers connecting to it.
2448The URL used to download the list will be
2449@code{@uref{http://example.org:12981/, http://example.org:12981/}}.
2450
2451Please notice:
2452
2453@itemize @bullet
2454@item The hostlist is @b{not} human readable, so you should not try to
2455download it using your webbrowser. Just point your GNUnet peer to the
2456address!
2457@item Advertising without providing a hostlist does not make sense and
2458will not work.
2459@end itemize
2460
2461@node Configuring the datastore
2462@subsection Configuring the datastore
2463
2464The datastore is what GNUnet uses for long-term storage of file-sharing
2465data. Note that long-term does not mean 'forever' since content does have
2466an expiration date, and of course storage space is finite (and hence
2467sometimes content may have to be discarded).
2468
2469Use the @code{QUOTA} option to specify how many bytes of storage space
2470you are willing to dedicate to GNUnet.
2471
2472In addition to specifying the maximum space GNUnet is allowed to use for
2473the datastore, you need to specify which database GNUnet should use to do
2474so. Currently, you have the choice between sqLite, MySQL and Postgres.
2475
2476@node Configuring the MySQL database
2477@subsection Configuring the MySQL database
2478
2479This section describes how to setup the MySQL database for GNUnet.
2480
2481Note that the mysql plugin does NOT work with mysql before 4.1 since we
2482need prepared statements.
2483We are generally testing the code against MySQL 5.1 at this point.
2484
2485@node Reasons for using MySQL
2486@subsection Reasons for using MySQL
2487
2488@itemize @bullet
2489
2490@item On up-to-date hardware wher
2491mysql can be used comfortably, this module
2492will have better performance than the other database choices (according
2493to our tests).
2494
2495@item Its often possible to recover the mysql database from internal
2496inconsistencies. Some of the other databases do not support repair.
2497@end itemize
2498
2499@node Reasons for not using MySQL
2500@subsection Reasons for not using MySQL
2501
2502@itemize @bullet
2503@item Memory usage (likely not an issue if you have more than 1 GB)
2504@item Complex manual setup
2505@end itemize
2506
2507@node Setup Instructions
2508@subsection Setup Instructions
2509
2510@itemize @bullet
2511
2512@item In @file{gnunet.conf} set in section @code{DATASTORE} the value for
2513@code{DATABASE} to @code{mysql}.
2514
2515@item Access mysql as root:
2516
2517@example
2518$ mysql -u root -p
2519@end example
2520
2521@noindent
2522and issue the following commands, replacing $USER with the username
2523that will be running @command{gnunet-arm} (so typically "gnunet"):
2524
2525@example
2526CREATE DATABASE gnunet;
2527GRANT select,insert,update,delete,create,alter,drop,create \
2528temporary tables ON gnunet.* TO $USER@@localhost;
2529SET PASSWORD FOR $USER@@localhost=PASSWORD('$the_password_you_like');
2530FLUSH PRIVILEGES;
2531@end example
2532
2533@item
2534In the $HOME directory of $USER, create a @file{.my.cnf} file with the
2535following lines
2536
2537@example
2538[client]
2539user=$USER
2540password=$the_password_you_like
2541@end example
2542
2543@end itemize
2544
2545Thats it. Note that @file{.my.cnf} file is a slight security risk unless
2546its on a safe partition. The @file{$HOME/.my.cnf} can of course be
2547a symbolic link.
2548Luckily $USER has only priviledges to mess up GNUnet's tables,
2549which should be pretty harmless.
2550
2551@node Testing
2552@subsection Testing
2553
2554You should briefly try if the database connection works. First, login
2555as $USER. Then use:
2556
2557@example
2558$ mysql -u $USER
2559mysql> use gnunet;
2560@end example
2561
2562@noindent
2563If you get the message
2564
2565@example
2566Database changed
2567@end example
2568
2569@noindent
2570it probably works.
2571
2572If you get
2573
2574@example
2575ERROR 2002: Can't connect to local MySQL server
2576through socket '/tmp/mysql.sock' (2)
2577@end example
2578
2579@noindent
2580it may be resolvable by
2581
2582@example
2583ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
2584@end example
2585
2586@noindent
2587so there may be some additional trouble depending on your mysql setup.
2588
2589@node Performance Tuning
2590@subsection Performance Tuning
2591
2592For GNUnet, you probably want to set the option
2593
2594@example
2595innodb_flush_log_at_trx_commit = 0
2596@end example
2597
2598@noindent
2599for a rather dramatic boost in MySQL performance. However, this reduces
2600the "safety" of your database as with this options you may loose
2601transactions during a power outage.
2602While this is totally harmless for GNUnet, the option applies to all
2603applications using MySQL. So you should set it if (and only if) GNUnet is
2604the only application on your system using MySQL.
2605
2606@node Setup for running Testcases
2607@subsection Setup for running Testcases
2608
2609If you want to run the testcases, you must create a second database
2610"gnunetcheck" with the same username and password. This database will
2611then be used for testing (@command{make check}).
2612
2613@node Configuring the Postgres database
2614@subsection Configuring the Postgres database
2615
2616This text describes how to setup the Postgres database for GNUnet.
2617
2618This Postgres plugin was developed for Postgres 8.3 but might work for
2619earlier versions as well.
2620
2621@node Reasons to use Postgres
2622@subsection Reasons to use Postgres
2623
2624@itemize @bullet
2625@item Easier to setup than MySQL
2626@item Real database
2627@end itemize
2628
2629@node Reasons not to use Postgres
2630@subsection Reasons not to use Postgres
2631
2632@itemize @bullet
2633@item Quite slow
2634@item Still some manual setup required
2635@end itemize
2636
2637@node Manual setup instructions
2638@subsection Manual setup instructions
2639
2640@itemize @bullet
2641@item In @file{gnunet.conf} set in section @code{DATASTORE} the value for
2642@code{DATABASE} to @code{postgres}.
2643@item Access Postgres to create a user:
2644
2645@table @asis
2646@item with Postgres 8.x, use:
2647
2648@example
2649# su - postgres
2650$ createuser
2651@end example
2652
2653@noindent
2654and enter the name of the user running GNUnet for the role interactively.
2655Then, when prompted, do not set it to superuser, allow the creation of
2656databases, and do not allow the creation of new roles.
2657
2658@item with Postgres 9.x, use:
2659
2660@example
2661# su - postgres
2662$ createuser -d $GNUNET_USER
2663@end example
2664
2665@noindent
2666where $GNUNET_USER is the name of the user running GNUnet.
2667
2668@end table
2669
2670
2671@item
2672As that user (so typically as user "gnunet"), create a database (or two):
2673
2674@example
2675$ createdb gnunet
2676# this way you can run "make check"
2677$ createdb gnunetcheck
2678@end example
2679
2680@end itemize
2681
2682Now you should be able to start @code{gnunet-arm}.
2683
2684@node Testing the setup manually
2685@subsection Testing the setup manually
2686
2687You may want to try if the database connection works. First, again login
2688as the user who will run @command{gnunet-arm}. Then use:
2689
2690@example
2691$ psql gnunet # or gnunetcheck
2692gnunet=> \dt
2693@end example
2694
2695@noindent
2696If, after you have started @command{gnunet-arm} at least once, you get
2697a @code{gn090} table here, it probably works.
2698
2699@node Configuring the datacache
2700@subsection Configuring the datacache
2701@c %**end of header
2702
2703The datacache is what GNUnet uses for storing temporary data. This data is
2704expected to be wiped completely each time GNUnet is restarted (or the
2705system is rebooted).
2706
2707You need to specify how many bytes GNUnet is allowed to use for the
2708datacache using the @code{QUOTA} option in the section @code{[dhtcache]}.
2709Furthermore, you need to specify which database backend should be used to
2710store the data. Currently, you have the choice between
2711sqLite, MySQL and Postgres.
2712
2713@node Configuring the file-sharing service
2714@subsection Configuring the file-sharing service
2715
2716In order to use GNUnet for file-sharing, you first need to make sure
2717that the file-sharing service is loaded.
2718This is done by setting the @code{AUTOSTART} option in
2719section @code{[fs]} to "YES". Alternatively, you can run
2720
2721@example
2722$ gnunet-arm -i fs
2723@end example
2724
2725@noindent
2726to start the file-sharing service by hand.
2727
2728Except for configuring the database and the datacache the only important
2729option for file-sharing is content migration.
2730
2731Content migration allows your peer to cache content from other peers as
2732well as send out content stored on your system without explicit requests.
2733This content replication has positive and negative impacts on both system
2734performance and privacy.
2735
2736FIXME: discuss the trade-offs. Here is some older text about it...
2737
2738Setting this option to YES allows gnunetd to migrate data to the local
2739machine. Setting this option to YES is highly recommended for efficiency.
2740Its also the default. If you set this value to YES, GNUnet will store
2741content on your machine that you cannot decrypt.
2742While this may protect you from liability if the judge is sane, it may
2743not (IANAL). If you put illegal content on your machine yourself, setting
2744this option to YES will probably increase your chances to get away with it
2745since you can plausibly deny that you inserted the content.
2746Note that in either case, your anonymity would have to be broken first
2747(which may be possible depending on the size of the GNUnet network and the
2748strength of the adversary).
2749
2750@node Configuring logging
2751@subsection Configuring logging
2752
2753Logging in GNUnet 0.9.0 is controlled via the "-L" and "-l" options.
2754Using @code{-L}, a log level can be specified. With log level
2755@code{ERROR} only serious errors are logged.
2756The default log level is @code{WARNING} which causes anything of
2757concern to be logged.
2758Log level @code{INFO} can be used to log anything that might be
2759interesting information whereas
2760@code{DEBUG} can be used by developers to log debugging messages
2761(but you need to run @code{./configure} with
2762@code{--enable-logging=verbose} to get them compiled).
2763The @code{-l} option is used to specify the log file.
2764
2765Since most GNUnet services are managed by @code{gnunet-arm}, using the
2766@code{-l} or @code{-L} options directly is not possible.
2767Instead, they can be specified using the @code{OPTIONS} configuration
2768value in the respective section for the respective service.
2769In order to enable logging globally without editing the @code{OPTIONS}
2770values for each service, @command{gnunet-arm} supports a
2771@code{GLOBAL_POSTFIX} option.
2772The value specified here is given as an extra option to all services for
2773which the configuration does contain a service-specific @code{OPTIONS}
2774field.
2775
2776@code{GLOBAL_POSTFIX} can contain the special sequence "@{@}" which
2777is replaced by the name of the service that is being started.
2778Furthermore, @code{GLOBAL_POSTFIX} is special in that sequences
2779starting with "$" anywhere in the string are expanded (according
2780to options in @code{PATHS}); this expansion otherwise is
2781only happening for filenames and then the "$" must be the
2782first character in the option. Both of these restrictions do
2783not apply to @code{GLOBAL_POSTFIX}.
2784Note that specifying @code{%} anywhere in the @code{GLOBAL_POSTFIX}
2785disables both of these features.
2786
2787In summary, in order to get all services to log at level
2788@code{INFO} to log-files called @code{SERVICENAME-logs}, the
2789following global prefix should be used:
2790
2791@example
2792GLOBAL_POSTFIX = -l $SERVICEHOME/@{@}-logs -L INFO
2793@end example
2794
2795@node Configuring the transport service and plugins
2796@subsection Configuring the transport service and plugins
2797
2798The transport service in GNUnet is responsible to maintain basic
2799connectivity to other peers.
2800Besides initiating and keeping connections alive it is also responsible
2801for address validation.
2802
2803The GNUnet transport supports more than one transport protocol.
2804These protocols are configured together with the transport service.
2805
2806The configuration section for the transport service itself is quite
2807similar to all the other services
2808
2809@example
2810AUTOSTART = YES
2811@@UNIXONLY@@ PORT = 2091
2812HOSTNAME = localhost
2813HOME = $SERVICEHOME
2814CONFIG = $DEFAULTCONFIG
2815BINARY = gnunet-service-transport
2816#PREFIX = valgrind
2817NEIGHBOUR_LIMIT = 50
2818ACCEPT_FROM = 127.0.0.1;
2819ACCEPT_FROM6 = ::1;
2820PLUGINS = tcp udp
2821UNIXPATH = /tmp/gnunet-service-transport.sock
2822@end example
2823
2824Different are the settings for the plugins to load @code{PLUGINS}.
2825The first setting specifies which transport plugins to load.
2826
2827@itemize @bullet
2828@item transport-unix
2829A plugin for local only communication with UNIX domain sockets. Used for
2830testing and available on unix systems only. Just set the port
2831
2832@example
2833[transport-unix]
2834PORT = 22086
2835TESTING_IGNORE_KEYS = ACCEPT_FROM;
2836@end example
2837
2838@item transport-tcp
2839A plugin for communication with TCP. Set port to 0 for client mode with
2840outbound only connections
2841
2842@example
2843[transport-tcp]
2844# Use 0 to ONLY advertise as a peer behind NAT (no port binding)
2845PORT = 2086
2846ADVERTISED_PORT = 2086
2847TESTING_IGNORE_KEYS = ACCEPT_FROM;
2848# Maximum number of open TCP connections allowed
2849MAX_CONNECTIONS = 128
2850@end example
2851
2852@item transport-udp
2853A plugin for communication with UDP. Supports peer discovery using
2854broadcasts.
2855
2856@example
2857[transport-udp]
2858PORT = 2086
2859BROADCAST = YES
2860BROADCAST_INTERVAL = 30 s
2861MAX_BPS = 1000000
2862TESTING_IGNORE_KEYS = ACCEPT_FROM;
2863@end example
2864
2865@item transport-http
2866HTTP and HTTPS support is split in two part: a client plugin initiating
2867outbound connections and a server part accepting connections from the
2868client. The client plugin just takes the maximum number of connections as
2869an argument.
2870
2871@example
2872[transport-http_client]
2873MAX_CONNECTIONS = 128
2874TESTING_IGNORE_KEYS = ACCEPT_FROM;
2875@end example
2876
2877@example
2878[transport-https_client]
2879MAX_CONNECTIONS = 128
2880TESTING_IGNORE_KEYS = ACCEPT_FROM;
2881@end example
2882
2883@noindent
2884The server has a port configured and the maximum nunber of connections.
2885The HTTPS part has two files with the certificate key and the certificate
2886file.
2887
2888The server plugin supports reverse proxies, so a external hostname can be
2889set using the @code{EXTERNAL_HOSTNAME} setting.
2890The webserver under this address should forward the request to the peer
2891and the configure port.
2892
2893@example
2894[transport-http_server]
2895EXTERNAL_HOSTNAME = fulcrum.net.in.tum.de/gnunet
2896PORT = 1080
2897MAX_CONNECTIONS = 128
2898TESTING_IGNORE_KEYS = ACCEPT_FROM;
2899@end example
2900
2901@example
2902[transport-https_server]
2903PORT = 4433
2904CRYPTO_INIT = NORMAL
2905KEY_FILE = https.key
2906CERT_FILE = https.cert
2907MAX_CONNECTIONS = 128
2908TESTING_IGNORE_KEYS = ACCEPT_FROM;
2909@end example
2910
2911@item transport-wlan
2912
2913The next section describes how to setup the WLAN plugin,
2914so here only the settings. Just specify the interface to use:
2915
2916@example
2917[transport-wlan]
2918# Name of the interface in monitor mode (typically monX)
2919INTERFACE = mon0
2920# Real hardware, no testing
2921TESTMODE = 0
2922TESTING_IGNORE_KEYS = ACCEPT_FROM;
2923@end example
2924@end itemize
2925
2926@node Configuring the wlan transport plugin
2927@subsection Configuring the wlan transport plugin
2928
2929The wlan transport plugin enables GNUnet to send and to receive data on a
2930wlan interface.
2931It has not to be connected to a wlan network as long as sender and
2932receiver are on the same channel. This enables you to get connection to
2933GNUnet where no internet access is possible, for example during
2934catastrophes or when censorship cuts you off from the internet.
2935
2936
2937@menu
2938* Requirements for the WLAN plugin::
2939* Configuration::
2940* Before starting GNUnet::
2941* Limitations and known bugs::
2942@end menu
2943
2944
2945@node Requirements for the WLAN plugin
2946@subsubsection Requirements for the WLAN plugin
2947
2948@itemize @bullet
2949
2950@item wlan network card with monitor support and packet injection
2951(see @uref{http://www.aircrack-ng.org/, aircrack-ng.org})
2952
2953@item Linux kernel with mac80211 stack, introduced in 2.6.22, tested with
29542.6.35 and 2.6.38
2955
2956@item Wlantools to create the a monitor interface, tested with airmon-ng
2957of the aircrack-ng package
2958@end itemize
2959
2960@node Configuration
2961@subsubsection Configuration
2962
2963There are the following options for the wlan plugin (they should be like
2964this in your default config file, you only need to adjust them if the
2965values are incorrect for your system)
2966
2967@example
2968# section for the wlan transport plugin
2969[transport-wlan]
2970# interface to use, more information in the
2971# "Before starting GNUnet" section of the handbook.
2972INTERFACE = mon0
2973# testmode for developers:
2974# 0 use wlan interface,
2975#1 or 2 use loopback driver for tests 1 = server, 2 = client
2976TESTMODE = 0
2977@end example
2978
2979@node Before starting GNUnet
2980@subsubsection Before starting GNUnet
2981
2982Before starting GNUnet, you have to make sure that your wlan interface is
2983in monitor mode.
2984One way to put the wlan interface into monitor mode (if your interface
2985name is wlan0) is by executing:
2986
2987@example
2988sudo airmon-ng start wlan0
2989@end example
2990
2991@noindent
2992Here is an example what the result should look like:
2993
2994@example
2995Interface Chipset Driver
2996wlan0 Intel 4965 a/b/g/n iwl4965 - [phy0]
2997(monitor mode enabled on mon0)
2998@end example
2999
3000@noindent
3001The monitor interface is mon0 is the one that you have to put into the
3002configuration file.
3003
3004@node Limitations and known bugs
3005@subsubsection Limitations and known bugs
3006
3007Wlan speed is at the maximum of 1 Mbit/s because support for choosing the
3008wlan speed with packet injection was removed in newer kernels.
3009Please pester the kernel developers about fixing this.
3010
3011The interface channel depends on the wlan network that the card is
3012connected to. If no connection has been made since the start of the
3013computer, it is usually the first channel of the card.
3014Peers will only find each other and communicate if they are on the same
3015channel. Channels must be set manually, i.e. using:
3016
3017@example
3018iwconfig wlan0 channel 1
3019@end example
3020
3021@node Configuring HTTP(S) reverse proxy functionality using Apache or nginx
3022@subsection Configuring HTTP(S) reverse proxy functionality using Apache or nginx
3023
3024The HTTP plugin supports data transfer using reverse proxies. A reverse
3025proxy forwards the HTTP request he receives with a certain URL to another
3026webserver, here a GNUnet peer.
3027
3028So if you have a running Apache or nginx webserver you can configure it to
3029be a GNUnet reverse proxy. Especially if you have a well-known webiste
3030this improves censorship resistance since it looks as normal surfing
3031behaviour.
3032
3033To do so, you have to do two things:
3034
3035@itemize @bullet
3036@item Configure your webserver to forward the GNUnet HTTP traffic
3037@item Configure your GNUnet peer to announce the respective address
3038@end itemize
3039
3040As an example we want to use GNUnet peer running:
3041
3042@itemize @bullet
3043
3044@item HTTP server plugin on @code{gnunet.foo.org:1080}
3045
3046@item HTTPS server plugin on @code{gnunet.foo.org:4433}
3047
3048@item A apache or nginx webserver on
3049@uref{http://www.foo.org/, http://www.foo.org:80/}
3050
3051@item A apache or nginx webserver on https://www.foo.org:443/
3052@end itemize
3053
3054And we want the webserver to accept GNUnet traffic under
3055@code{http://www.foo.org/bar/}. The required steps are described here:
3056
3057@menu
3058* Reverse Proxy - Configure your Apache2 HTTP webserver::
3059* Reverse Proxy - Configure your Apache2 HTTPS webserver::
3060* Reverse Proxy - Configure your nginx HTTPS webserver::
3061* Reverse Proxy - Configure your nginx HTTP webserver::
3062* Reverse Proxy - Configure your GNUnet peer::
3063@end menu
3064
3065@node Reverse Proxy - Configure your Apache2 HTTP webserver
3066@subsubsection Reverse Proxy - Configure your Apache2 HTTP webserver
3067
3068First of all you need mod_proxy installed.
3069
3070Edit your webserver configuration. Edit
3071@code{/etc/apache2/apache2.conf} or the site-specific configuration file.
3072
3073In the respective @code{server config},@code{virtual host} or
3074@code{directory} section add the following lines:
3075
3076@example
3077ProxyTimeout 300
3078ProxyRequests Off
3079<Location /bar/ >
3080ProxyPass http://gnunet.foo.org:1080/
3081ProxyPassReverse http://gnunet.foo.org:1080/
3082</Location>
3083@end example
3084
3085@node Reverse Proxy - Configure your Apache2 HTTPS webserver
3086@subsubsection Reverse Proxy - Configure your Apache2 HTTPS webserver
3087
3088We assume that you already have an HTTPS server running, if not please
3089check how to configure a HTTPS host. An easy to use example is the
3090@file{apache2/sites-available/default-ssl} example configuration file.
3091
3092In the respective HTTPS @code{server config},@code{virtual host} or
3093@code{directory} section add the following lines:
3094
3095@example
3096SSLProxyEngine On
3097ProxyTimeout 300
3098ProxyRequests Off
3099<Location /bar/ >
3100ProxyPass https://gnunet.foo.org:4433/
3101ProxyPassReverse https://gnunet.foo.org:4433/
3102</Location>
3103@end example
3104
3105@noindent
3106More information about the apache mod_proxy configuration can be found
3107here: @uref{http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass}
3108.
3109
3110@node Reverse Proxy - Configure your nginx HTTPS webserver
3111@subsubsection Reverse Proxy - Configure your nginx HTTPS webserver
3112
3113Since nginx does not support chunked encoding, you first of all have to
3114install @code{chunkin}: @uref{http://wiki.nginx.org/HttpChunkinModule}.
3115
3116To enable chunkin add:
3117
3118@example
3119chunkin on;
3120error_page 411 = @@my_411_error;
3121location @@my_411_error @{
3122chunkin_resume;
3123@}
3124@end example
3125
3126@noindent
3127Edit your webserver configuration. Edit @file{/etc/nginx/nginx.conf} or
3128the site-specific configuration file.
3129
3130In the @code{server} section add:
3131
3132@example
3133location /bar/
3134@{
3135proxy_pass http://gnunet.foo.org:1080/;
3136proxy_buffering off;
3137proxy_connect_timeout 5; # more than http_server
3138proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
3139proxy_http_version 1.1; # 1.0 default
3140proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
3141@}
3142@end example
3143
3144@node Reverse Proxy - Configure your nginx HTTP webserver
3145@subsubsection Reverse Proxy - Configure your nginx HTTP webserver
3146
3147Edit your webserver configuration. Edit @file{/etc/nginx/nginx.conf} or
3148the site-specific configuration file.
3149
3150In the @code{server} section add:
3151
3152@example
3153ssl_session_timeout 6m;
3154location /bar/
3155@{
3156proxy_pass https://gnunet.foo.org:4433/;
3157proxy_buffering off;
3158proxy_connect_timeout 5; # more than http_server
3159proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
3160proxy_http_version 1.1; # 1.0 default
3161proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
3162@}
3163@end example
3164
3165@node Reverse Proxy - Configure your GNUnet peer
3166@subsubsection Reverse Proxy - Configure your GNUnet peer
3167
3168To have your GNUnet peer announce the address, you have to specify the
3169@code{EXTERNAL_HOSTNAME} option in the @code{[transport-http_server]}
3170section:
3171
3172@example
3173[transport-http_server]
3174EXTERNAL_HOSTNAME = http://www.foo.org/bar/
3175@end example
3176
3177@noindent
3178and/or @code{[transport-https_server]} section:
3179
3180@example
3181[transport-https_server]
3182EXTERNAL_HOSTNAME = https://www.foo.org/bar/
3183@end example
3184
3185@noindent
3186Now restart your webserver and your peer...
3187
3188@node Blacklisting peers
3189@subsection Blacklisting peers
3190
3191Transport service supports to deny connecting to a specific peer of to a
3192specific peer with a specific transport plugin using te blacklisting
3193component of transport service. With@ blacklisting it is possible to deny
3194connections to specific peers of@ to use a specific plugin to a specific
3195peer. Peers can be blacklisted using@ the configuration or a blacklist
3196client can be asked.
3197
3198To blacklist peers using the configuration you have to add a section to
3199your configuration containing the peer id of the peer to blacklist and
3200the plugin@ if required.
3201
3202Examples:
3203
3204To blacklist connections to P565... on peer AG2P... using tcp add:
3205
3206@c FIXME: This is too long and produces errors in the pdf.
3207@example
3208[transport-blacklist AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
3209P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G = tcp
3210@end example
3211
3212To blacklist connections to P565... on peer AG2P... using all plugins add:
3213
3214@example
3215[transport-blacklist-AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
3216P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G =
3217@end example
3218
3219You can also add a blacklist client usign the blacklist API. On a
3220blacklist check, blacklisting first checks internally if the peer is
3221blacklisted and if not, it asks the blacklisting clients. Clients are
3222asked if it is OK to connect to a peer ID, the plugin is omitted.
3223
3224On blacklist check for (peer, plugin)
3225@itemize @bullet
3226@item Do we have a local blacklist entry for this peer and this plugin?@
3227@item YES: disallow connection@
3228@item Do we have a local blacklist entry for this peer and all plugins?@
3229@item YES: disallow connection@
3230@item Does one of the clients disallow?@
3231@item YES: disallow connection
3232@end itemize
3233
3234@node Configuration of the HTTP and HTTPS transport plugins
3235@subsection Configuration of the HTTP and HTTPS transport plugins
3236
3237The client parts of the http and https transport plugins can be configured
3238to use a proxy to connect to the hostlist server. This functionality can
3239be configured in the configuration file directly or using the
3240gnunet-setup tool.
3241
3242Both the HTTP and HTTPS clients support the following proxy types at
3243the moment:
3244
3245@itemize @bullet
3246@item HTTP 1.1 proxy
3247@item SOCKS 4/4a/5/5 with hostname
3248@end itemize
3249
3250In addition authentication at the proxy with username and password can be
3251configured.
3252
3253To configure proxy support for the clients in the gnunet-setup tool,
3254select the "transport" tab and activate the respective plugin. Now you
3255can select the appropriate proxy type. The hostname or IP address
3256(including port if required) has to be entered in the "Proxy hostname"
3257textbox. If required, enter username and password in the "Proxy username"
3258and "Proxy password" boxes. Be aware that these information will be stored
3259in the configuration in plain text.
3260
3261To configure these options directly in the configuration, you can
3262configure the following settings in the @code{[transport-http_client]}
3263and @code{[transport-https_client]} section of the configuration:
3264
3265@example
3266# Type of proxy server,
3267# Valid values: HTTP, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
3268# Default: HTTP
3269# PROXY_TYPE = HTTP
3270
3271# Hostname or IP of proxy server
3272# PROXY =
3273# User name for proxy server
3274# PROXY_USERNAME =
3275# User password for proxy server
3276# PROXY_PASSWORD =
3277@end example
3278
3279@node Configuring the GNU Name System
3280@subsection Configuring the GNU Name System
3281
3282@menu
3283* Configuring system-wide DNS interception::
3284* Configuring the GNS nsswitch plugin::
3285* Configuring GNS on W32::
3286* GNS Proxy Setup::
3287* Setup of the GNS CA::
3288* Testing the GNS setup::
3289* Automatic Shortening in the GNU Name System::
3290@end menu
3291
3292
3293@node Configuring system-wide DNS interception
3294@subsubsection Configuring system-wide DNS interception
3295
3296Before you install GNUnet, make sure you have a user and group 'gnunet'
3297as well as an empty group 'gnunetdns'.
3298
3299When using GNUnet with system-wide DNS interception, it is absolutely
3300necessary for all GNUnet service processes to be started by
3301@code{gnunet-service-arm} as user and group 'gnunet'. You also need to be
3302sure to run @code{make install} as root (or use the @code{sudo} option to
3303configure) to grant GNUnet sufficient privileges.
3304
3305With this setup, all that is required for enabling system-wide DNS
3306interception is for some GNUnet component (VPN or GNS) to request it.
3307The @code{gnunet-service-dns} will then start helper programs that will
3308make the necessary changes to your firewall (@code{iptables}) rules.
3309
3310Note that this will NOT work if your system sends out DNS traffic to a
3311link-local IPv6 address, as in this case GNUnet can intercept the traffic,
3312but not inject the responses from the link-local IPv6 address. Hence you
3313cannot use system-wide DNS interception in conjunction with link-local
3314IPv6-based DNS servers. If such a DNS server is used, it will bypass
3315GNUnet's DNS traffic interception.
3316
3317Using the GNU Name System (GNS) requires two different configuration
3318steps.
3319First of all, GNS needs to be integrated with the operating system. Most
3320of this section is about the operating system level integration.
3321
3322Additionally, each individual user who wants to use the system must also
3323initialize their GNS zones. This can be done by running (after starting
3324GNUnet)
3325
3326@example
3327$ gnunet-gns-import.sh
3328@end example
3329
3330@noindent
3331after the local GNUnet peer has been started. Note that the namestore (in
3332particular the namestore database backend) should not be reconfigured
3333afterwards (as records are not automatically migrated between backends).
3334
3335The remainder of this chapter will detail the various methods for
3336configuring the use of GNS with your operating system.
3337
3338At this point in time you have different options depending on your OS:
3339
3340@table @asis
3341
3342@item Use the gnunet-gns-proxy This approach works for all operating
3343systems and is likely the easiest. However, it enables GNS only for
3344browsers, not for other applications that might be using DNS, such as SSH.
3345Still, using the proxy is required for using HTTP with GNS and is thus
3346recommended for all users. To do this, you simply have to run the
3347@code{gnunet-gns-proxy-setup-ca} script as the user who will run the
3348browser (this will create a GNS certificate authority (CA) on your system
3349and import its key into your browser), then start @code{gnunet-gns-proxy}
3350and inform your browser to use the Socks5 proxy which
3351@code{gnunet-gns-proxy} makes available by default on port 7777.
3352@item Use a nsswitch plugin (recommended on GNU systems)
3353This approach has the advantage of offering fully personalized resolution
3354even on multi-user systems. A potential disadvantage is that some
3355applications might be able to bypass GNS.
3356@item Use a W32 resolver plugin (recommended on W32)
3357This is currently the only option on W32 systems.
3358@item Use system-wide DNS packet interception
3359This approach is recommended for the GNUnet VPN. It can be used to handle
3360GNS at the same time; however, if you only use this method, you will only
3361get one root zone per machine (not so great for multi-user systems).
3362@end table
3363
3364You can combine system-wide DNS packet interception with the nsswitch
3365plugin.
3366The setup of the system-wide DNS interception is described here. All of
3367the other GNS-specific configuration steps are described in the following
3368sections.
3369
3370@node Configuring the GNS nsswitch plugin
3371@subsubsection Configuring the GNS nsswitch plugin
3372
3373The Name Service Switch (NSS) is a facility in Unix-like operating systems
3374@footnote{More accurate: NSS is a functionality of the GNU C Library}
3375that provides a variety of sources for common configuration databases and
3376name resolution mechanisms.
3377A superuser (system administrator) usually configures the
3378operating system's name services using the file
3379@file{/etc/nsswitch.conf}.
3380
3381GNS provides a NSS plugin to integrate GNS name resolution with the
3382operating system's name resolution process.
3383To use the GNS NSS plugin you have to either
3384
3385@itemize @bullet
3386@item install GNUnet as root or
3387@item compile GNUnet with the @code{--with-sudo=yes} switch.
3388@end itemize
3389
3390Name resolution is controlled by the @emph{hosts} section in the NSS
3391configuration. By default this section first performs a lookup in the
3392@file{/etc/hosts} file and then in DNS.
3393The nsswitch file should contain a line similar to:
3394
3395@example
3396hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4
3397@end example
3398
3399@noindent
3400Here the GNS NSS plugin can be added to perform a GNS lookup before
3401performing a DNS lookup.
3402The GNS NSS plugin has to be added to the "hosts" section in
3403@file{/etc/nsswitch.conf} file before DNS related plugins:
3404
3405@example
3406...
3407hosts: files gns [NOTFOUND=return] dns mdns4_minimal mdns4
3408...
3409@end example
3410
3411@noindent
3412The @code{NOTFOUND=return} will ensure that if a @code{.gnu} name is not
3413found in GNS it will not be queried in DNS.
3414
3415@node Configuring GNS on W32
3416@subsubsection Configuring GNS on W32
3417
3418This document is a guide to configuring GNU Name System on W32-compatible
3419platforms.
3420
3421After GNUnet is installed, run the w32nsp-install tool:
3422
3423@example
3424w32nsp-install.exe libw32nsp-0.dll
3425@end example
3426
3427@noindent
3428('0' is the library version of W32 NSP; it might increase in the future,
3429change the invocation accordingly).
3430
3431This will install GNS namespace provider into the system and allow other
3432applications to resolve names that end in '@strong{gnu}'
3433and '@strong{zkey}'. Note that namespace provider requires
3434gnunet-gns-helper-service-w32 to be running, as well as gns service
3435itself (and its usual dependencies).
3436
3437Namespace provider is hardcoded to connect to @strong{127.0.0.1:5353},
3438and this is where gnunet-gns-helper-service-w32 should be listening to
3439(and is configured to listen to by default).
3440
3441To uninstall the provider, run:
3442
3443@example
3444w32nsp-uninstall.exe
3445@end example
3446
3447@noindent
3448(uses provider GUID to uninstall it, does not need a dll name).
3449
3450Note that while MSDN claims that other applications will only be able to
3451use the new namespace provider after re-starting, in reality they might
3452stat to use it without that. Conversely, they might stop using the
3453provider after it's been uninstalled, even if they were not re-started.
3454W32 will not permit namespace provider library to be deleted or
3455overwritten while the provider is installed, and while there is at least
3456one process still using it (even after it was uninstalled).
3457
3458@node GNS Proxy Setup
3459@subsubsection GNS Proxy Setup
3460
3461When using the GNU Name System (GNS) to browse the WWW, there are several
3462issues that can be solved by adding the GNS Proxy to your setup:
3463
3464@itemize @bullet
3465
3466@item If the target website does not support GNS, it might assume that it
3467is operating under some name in the legacy DNS system (such as
3468example.com). It may then attempt to set cookies for that domain, and the
3469web server might expect a @code{Host: example.com} header in the request
3470from your browser.
3471However, your browser might be using @code{example.gnu} for the
3472@code{Host} header and might only accept (and send) cookies for
3473@code{example.gnu}. The GNS Proxy will perform the necessary translations
3474of the hostnames for cookies and HTTP headers (using the LEHO record for
3475the target domain as the desired substitute).
3476
3477@item If using HTTPS, the target site might include an SSL certificate
3478which is either only valid for the LEHO domain or might match a TLSA
3479record in GNS. However, your browser would expect a valid certificate for
3480@code{example.gnu}, not for some legacy domain name. The proxy will
3481validate the certificate (either against LEHO or TLSA) and then
3482on-the-fly produce a valid certificate for the exchange, signed by your
3483own CA. Assuming you installed the CA of your proxy in your browser's
3484certificate authority list, your browser will then trust the
3485HTTPS/SSL/TLS connection, as the hostname mismatch is hidden by the proxy.
3486
3487@item Finally, the proxy will in the future indicate to the server that it
3488speaks GNS, which will enable server operators to deliver GNS-enabled web
3489sites to your browser (and continue to deliver legacy links to legacy
3490browsers)
3491@end itemize
3492
3493@node Setup of the GNS CA
3494@subsubsection Setup of the GNS CA
3495
3496First you need to create a CA certificate that the proxy can use.
3497To do so use the provided script gnunet-gns-proxy-ca:
3498
3499@example
3500$ gnunet-gns-proxy-setup-ca
3501@end example
3502
3503@noindent
3504This will create a personal certification authority for you and add this
3505authority to the firefox and chrome database. The proxy will use the this
3506CA certificate to generate @code{*.gnu} client certificates on the fly.
3507
3508Note that the proxy uses libcurl. Make sure your version of libcurl uses
3509GnuTLS and NOT OpenSSL. The proxy will @b{not} work with libcurl compiled
3510against OpenSSL.
3511
3512You can check the configuration your libcurl was build with by
3513running:
3514
3515@example
3516curl --version
3517@end example
3518
3519the output will look like this (without the linebreaks):
3520
3521@example
3522gnurl --version
3523curl 7.56.0 (x86_64-unknown-linux-gnu) libcurl/7.56.0 \
3524GnuTLS/3.5.13 zlib/1.2.11 libidn2/2.0.4
3525Release-Date: 2017-10-08
3526Protocols: http https
3527Features: AsynchDNS IDN IPv6 Largefile NTLM SSL libz \
3528TLS-SRP UnixSockets HTTPS-proxy
3529@end example
3530
3531@node Testing the GNS setup
3532@subsubsection Testing the GNS setup
3533
3534Now for testing purposes we can create some records in our zone to test
3535the SSL functionality of the proxy:
3536
3537@example
3538$ gnunet-namestore -a -e "1 d" -n "homepage" -t A -V 131.159.74.67
3539$ gnunet-namestore -a -e "1 d" -n "homepage" -t LEHO -V "gnunet.org"
3540@end example
3541
3542@noindent
3543At this point we can start the proxy. Simply execute
3544
3545@example
3546$ gnunet-gns-proxy
3547@end example
3548
3549@noindent
3550Configure your browser to use this SOCKSv5 proxy on port 7777 and visit
3551this link.
3552If you use @command{Firefox} (or one of its deriviates/forks such as
3553Icecat) you also have to go to @code{about:config} and set the key
3554@code{network.proxy.socks_remote_dns} to @code{true}.
3555
3556When you visit @code{https://homepage.gnu/}, you should get to the
3557@code{https://gnunet.org/} frontpage and the browser (with the correctly
3558configured proxy) should give you a valid SSL certificate for
3559@code{homepage.gnu} and no warnings. It should look like this:
3560
3561@c FIXME: Image does not exist, create it or save it from Drupal?
3562@c @image{images/gnunethpgns.png,5in,, picture of homepage.gnu in Webbrowser}
3563
3564@node Automatic Shortening in the GNU Name System
3565@subsubsection Automatic Shortening in the GNU Name System
3566
3567This page describes a possible option for 'automatic name shortening',
3568which you can choose to enable with the GNU Name System.
3569
3570When GNS encounters a name for the first time, it can use the 'NICK'
3571record of the originating zone to automatically generate a name for the
3572zone. If automatic shortening is enabled, those auto-generated names will
3573be placed (as private records) into your personal 'shorten' zone (to
3574prevent confusion with manually selected names).
3575Then, in the future, if the same name is encountered again, GNS will
3576display the shortened name instead (the first time, the long name will
3577still be used as shortening typically happens asynchronously as looking up
3578the 'NICK' record takes some time). Using this feature can be a convenient
3579way to avoid very long @code{.gnu} names; however, note that names from
3580the shorten-zone are assigned on a first-come-first-serve basis and should
3581not be trusted. Furthermore, if you enable this feature, you will no
3582longer see the full delegation chain for zones once shortening has been
3583applied.
3584
3585@node Configuring the GNUnet VPN
3586@subsection Configuring the GNUnet VPN
3587
3588@menu
3589* IPv4 address for interface::
3590* IPv6 address for interface::
3591* Configuring the GNUnet VPN DNS::
3592* Configuring the GNUnet VPN Exit Service::
3593* IP Address of external DNS resolver::
3594* IPv4 address for Exit interface::
3595* IPv6 address for Exit interface::
3596@end menu
3597
3598Before configuring the GNUnet VPN, please make sure that system-wide DNS
3599interception is configured properly as described in the section on the
3600GNUnet DNS setup. @pxref{Configuring the GNU Name System},
3601if you haven't done so already.
3602
3603The default options for the GNUnet VPN are usually sufficient to use
3604GNUnet as a Layer 2 for your Internet connection.
3605However, what you always have to specify is which IP protocol you want
3606to tunnel: IPv4, IPv6 or both.
3607Furthermore, if you tunnel both, you most likely should also tunnel
3608all of your DNS requests.
3609You theoretically can tunnel "only" your DNS traffic, but that usually
3610makes little sense.
3611
3612The other options as shown on the gnunet-setup tool are:
3613
3614@node IPv4 address for interface
3615@subsubsection IPv4 address for interface
3616
3617This is the IPv4 address the VPN interface will get. You should pick an
3618'private' IPv4 network that is not yet in use for you system. For example,
3619if you use @code{10.0.0.1/255.255.0.0} already, you might use
3620@code{10.1.0.1/255.255.0.0}.
3621If you use @code{10.0.0.1/255.0.0.0} already, then you might use
3622@code{192.168.0.1/255.255.0.0}.
3623If your system is not in a private IP-network, using any of the above will
3624work fine.
3625You should try to make the mask of the address big enough
3626(@code{255.255.0.0} or, even better, @code{255.0.0.0}) to allow more
3627mappings of remote IP Addresses into this range.
3628However, even a @code{255.255.255.0} mask will suffice for most users.
3629
3630@node IPv6 address for interface
3631@subsubsection IPv6 address for interface
3632
3633The IPv6 address the VPN interface will get. Here you can specify any
3634non-link-local address (the address should not begin with @code{fe80:}).
3635A subnet Unique Local Unicast (@code{fd00::/8} prefix) that you are
3636currently not using would be a good choice.
3637
3638@node Configuring the GNUnet VPN DNS
3639@subsubsection Configuring the GNUnet VPN DNS
3640
3641To resolve names for remote nodes, activate the DNS exit option.
3642
3643@node Configuring the GNUnet VPN Exit Service
3644@subsubsection Configuring the GNUnet VPN Exit Service
3645
3646If you want to allow other users to share your Internet connection (yes,
3647this may be dangerous, just as running a Tor exit node) or want to
3648provide access to services on your host (this should be less dangerous,
3649as long as those services are secure), you have to enable the GNUnet exit
3650daemon.
3651
3652You then get to specify which exit functions you want to provide. By
3653enabling the exit daemon, you will always automatically provide exit
3654functions for manually configured local services (this component of the
3655system is under
3656development and not documented further at this time). As for those
3657services you explicitly specify the target IP address and port, there is
3658no significant security risk in doing so.
3659
3660Furthermore, you can serve as a DNS, IPv4 or IPv6 exit to the Internet.
3661Being a DNS exit is usually pretty harmless. However, enabling IPv4 or
3662IPv6-exit without further precautions may enable adversaries to access
3663your local network, send spam, attack other systems from your Internet
3664connection and to other mischief that will appear to come from your
3665machine. This may or may not get you into legal trouble.
3666If you want to allow IPv4 or IPv6-exit functionality, you should strongly
3667consider adding additional firewall rules manually to protect your local
3668network and to restrict outgoing TCP traffic (i.e. by not allowing access
3669to port 25). While we plan to improve exit-filtering in the future,
3670you're currently on your own here.
3671Essentially, be prepared for any kind of IP-traffic to exit the respective
3672TUN interface (and GNUnet will enable IP-forwarding and NAT for the
3673interface automatically).
3674
3675Additional configuration options of the exit as shown by the gnunet-setup
3676tool are:
3677
3678@node IP Address of external DNS resolver
3679@subsubsection IP Address of external DNS resolver
3680
3681If DNS traffic is to exit your machine, it will be send to this DNS
3682resolver. You can specify an IPv4 or IPv6 address.
3683
3684@node IPv4 address for Exit interface
3685@subsubsection IPv4 address for Exit interface
3686
3687This is the IPv4 address the Interface will get. Make the mask of the
3688address big enough (255.255.0.0 or, even better, 255.0.0.0) to allow more
3689mappings of IP addresses into this range. As for the VPN interface, any
3690unused, private IPv4 address range will do.
3691
3692@node IPv6 address for Exit interface
3693@subsubsection IPv6 address for Exit interface
3694
3695The public IPv6 address the interface will get. If your kernel is not a
3696very recent kernel and you are willing to manually enable IPv6-NAT, the
3697IPv6 address you specify here must be a globally routed IPv6 address of
3698your host.
3699
3700Suppose your host has the address @code{2001:4ca0::1234/64}, then
3701using @code{2001:4ca0::1:0/112} would be fine (keep the first 64 bits,
3702then change at least one bit in the range before the bitmask, in the
3703example above we changed bit 111 from 0 to 1).
3704
3705You may also have to configure your router to route traffic for the entire
3706subnet (@code{2001:4ca0::1:0/112} for example) through your computer (this
3707should be automatic with IPv6, but obviously anything can be
3708disabled).
3709
3710@node Bandwidth Configuration
3711@subsection Bandwidth Configuration
3712
3713You can specify how many bandwidth GNUnet is allowed to use to receive
3714and send data. This is important for users with limited bandwidth or
3715traffic volume.
3716
3717@node Configuring NAT
3718@subsection Configuring NAT
3719
3720Most hosts today do not have a normal global IP address but instead are
3721behind a router performing Network Address Translation (NAT) which assigns
3722each host in the local network a private IP address.
3723As a result, these machines cannot trivially receive inbound connections
3724from the Internet. GNUnet supports NAT traversal to enable these machines
3725to receive incoming connections from other peers despite their
3726limitations.
3727
3728In an ideal world, you can press the "Attempt automatic configuration"
3729button in gnunet-setup to automatically configure your peer correctly.
3730Alternatively, your distribution might have already triggered this
3731automatic configuration during the installation process.
3732However, automatic configuration can fail to determine the optimal
3733settings, resulting in your peer either not receiving as many connections
3734as possible, or in the worst case it not connecting to the network at all.
3735
3736To manually configure the peer, you need to know a few things about your
3737network setup. First, determine if you are behind a NAT in the first
3738place.
3739This is always the case if your IP address starts with "10.*" or
3740"192.168.*". Next, if you have control over your NAT router, you may
3741choose to manually configure it to allow GNUnet traffic to your host.
3742If you have configured your NAT to forward traffic on ports 2086 (and
3743possibly 1080) to your host, you can check the "NAT ports have been opened
3744manually" option, which corresponds to the "PUNCHED_NAT" option in the
3745configuration file. If you did not punch your NAT box, it may still be
3746configured to support UPnP, which allows GNUnet to automatically
3747configure it. In that case, you need to install the "upnpc" command,
3748enable UPnP (or PMP) on your NAT box and set the "Enable NAT traversal
3749via UPnP or PMP" option (corresponding to "ENABLE_UPNP" in the
3750configuration file).
3751
3752Some NAT boxes can be traversed using the autonomous NAT traversal method.
3753This requires certain GNUnet components to be installed with "SUID"
3754prividledges on your system (so if you're installing on a system you do
3755not have administrative rights to, this will not work).
3756If you installed as 'root', you can enable autonomous NAT traversal by
3757checking the "Enable NAT traversal using ICMP method".
3758The ICMP method requires a way to determine your NAT's external (global)
3759IP address. This can be done using either UPnP, DynDNS, or by manual
3760configuration. If you have a DynDNS name or know your external IP address,
3761you should enter that name under "External (public) IPv4 address" (which
3762corresponds to the "EXTERNAL_ADDRESS" option in the configuration file).
3763If you leave the option empty, GNUnet will try to determine your external
3764IP address automatically (which may fail, in which case autonomous
3765NAT traversal will then not work).
3766
3767Finally, if you yourself are not behind NAT but want to be able to
3768connect to NATed peers using autonomous NAT traversal, you need to check
3769the "Enable connecting to NATed peers using ICMP method" box.
3770
3771
3772@node Peer configuration for distributions
3773@subsection Peer configuration for distributions
3774
3775The "GNUNET_DATA_HOME" in "[path]" in @file{/etc/gnunet.conf} should be
3776manually set to "/var/lib/gnunet/data/" as the default
3777"~/.local/share/gnunet/" is probably not that appropriate in this case.
3778Similarly, distributions may consider pointing "GNUNET_RUNTIME_DIR" to
3779"/var/run/gnunet/" and "GNUNET_HOME" to "/var/lib/gnunet/". Also, should a
3780distribution decide to override system defaults, all of these changes
3781should be done in a custom @file{/etc/gnunet.conf} and not in the files
3782in the @file{config.d/} directory.
3783
3784Given the proposed access permissions, the "gnunet-setup" tool must be
3785run as use "gnunet" (and with option "-c /etc/gnunet.conf" so that it
3786modifies the system configuration). As always, gnunet-setup should be run
3787after the GNUnet peer was stopped using "gnunet-arm -e". Distributions
3788might want to include a wrapper for gnunet-setup that allows the
3789desktop-user to "sudo" (i.e. using gtksudo) to the "gnunet" user account
3790and then runs "gnunet-arm -e", "gnunet-setup" and "gnunet-arm -s" in
3791sequence.
3792
3793@node How to start and stop a GNUnet peer
3794@section How to start and stop a GNUnet peer
3795
3796This section describes how to start a GNUnet peer. It assumes that you
3797have already compiled and installed GNUnet and its' dependencies.
3798Before you start a GNUnet peer, you may want to create a configuration
3799file using gnunet-setup (but you do not have to).
3800Sane defaults should exist in your
3801@file{$GNUNET_PREFIX/share/gnunet/config.d/} directory, so in practice
3802you could simply start without any configuration. If you want to
3803configure your peer later, you need to stop it before invoking the
3804@code{gnunet-setup} tool to customize further and to test your
3805configuration (@code{gnunet-setup} has build-in test functions).
3806
3807The most important option you might have to still set by hand is in
3808[PATHS]. Here, you use the option "GNUNET_HOME" to specify the path where
3809GNUnet should store its data.
3810It defaults to @code{$HOME/}, which again should work for most users.
3811Make sure that the directory specified as GNUNET_HOME is writable to
3812the user that you will use to run GNUnet (note that you can run frontends
3813using other users, GNUNET_HOME must only be accessible to the user used to
3814run the background processes).
3815
3816You will also need to make one central decision: should all of GNUnet be
3817run under your normal UID, or do you want distinguish between system-wide
3818(user-independent) GNUnet services and personal GNUnet services. The
3819multi-user setup is slightly more complicated, but also more secure and
3820generally recommended.
3821
3822@menu
3823* The Single-User Setup::
3824* The Multi-User Setup::
3825* Killing GNUnet services::
3826* Access Control for GNUnet::
3827@end menu
3828
3829@node The Single-User Setup
3830@subsection The Single-User Setup
3831
3832For the single-user setup, you do not need to do anything special and can
3833just start the GNUnet background processes using @code{gnunet-arm}.
3834By default, GNUnet looks in @file{~/.config/gnunet.conf} for a
3835configuration (or @code{$XDG_CONFIG_HOME/gnunet.conf} if@
3836@code{$XDG_CONFIG_HOME} is defined). If your configuration lives
3837elsewhere, you need to pass the @code{-c FILENAME} option to all GNUnet
3838commands.
3839
3840Assuming the configuration file is called @file{~/.config/gnunet.conf},
3841you start your peer using the @code{gnunet-arm} command (say as user
3842@code{gnunet}) using:
3843
3844@example
3845gnunet-arm -c ~/.config/gnunet.conf -s
3846@end example
3847
3848@noindent
3849The "-s" option here is for "start". The command should return almost
3850instantly. If you want to stop GNUnet, you can use:
3851
3852@example
3853gnunet-arm -c ~/.config/gnunet.conf -e
3854@end example
3855
3856@noindent
3857The "-e" option here is for "end".
3858
3859Note that this will only start the basic peer, no actual applications
3860will be available.
3861If you want to start the file-sharing service, use (after starting
3862GNUnet):
3863
3864@example
3865gnunet-arm -c ~/.config/gnunet.conf -i fs
3866@end example
3867
3868@noindent
3869The "-i fs" option here is for "initialize" the "fs" (file-sharing)
3870application. You can also selectively kill only file-sharing support using
3871
3872@example
3873gnunet-arm -c ~/.config/gnunet.conf -k fs
3874@end example
3875
3876@noindent
3877Assuming that you want certain services (like file-sharing) to be always
3878automatically started whenever you start GNUnet, you can activate them by
3879setting "FORCESTART=YES" in the respective section of the configuration
3880file (for example, "[fs]"). Then GNUnet with file-sharing support would
3881be started whenever you@ enter:
3882
3883@example
3884gnunet-arm -c ~/.config/gnunet.conf -s
3885@end example
3886
3887@noindent
3888Alternatively, you can combine the two options:
3889
3890@example
3891gnunet-arm -c ~/.config/gnunet.conf -s -i fs
3892@end example
3893
3894@noindent
3895Using @code{gnunet-arm} is also the preferred method for initializing
3896GNUnet from @code{init}.
3897
3898Finally, you should edit your @code{crontab} (using the @code{crontab}
3899command) and insert a line@
3900
3901@example
3902@@reboot gnunet-arm -c ~/.config/gnunet.conf -s
3903@end example
3904
3905to automatically start your peer whenever your system boots.
3906
3907@node The Multi-User Setup
3908@subsection The Multi-User Setup
3909
3910This requires you to create a user @code{gnunet} and an additional group
3911@code{gnunetdns}, prior to running @code{make install} during
3912installation.
3913Then, you create a configuration file @file{/etc/gnunet.conf} which should
3914contain the lines:@
3915
3916@example
3917[arm]
3918SYSTEM_ONLY = YES
3919USER_ONLY = NO
3920@end example
3921
3922@noindent
3923Then, perform the same steps to run GNUnet as in the per-user
3924configuration, except as user @code{gnunet} (including the
3925@code{crontab} installation).
3926You may also want to run @code{gnunet-setup} to configure your peer
3927(databases, etc.).
3928Make sure to pass @code{-c /etc/gnunet.conf} to all commands. If you
3929run @code{gnunet-setup} as user @code{gnunet}, you might need to change
3930permissions on @file{/etc/gnunet.conf} so that the @code{gnunet} user can
3931write to the file (during setup).
3932
3933Afterwards, you need to perform another setup step for each normal user
3934account from which you want to access GNUnet. First, grant the normal user
3935(@code{$USER}) permission to the group gnunet:
3936
3937@example
3938# adduser $USER gnunet
3939@end example
3940
3941@noindent
3942Then, create a configuration file in @file{~/.config/gnunet.conf} for the
3943$USER with the lines:
3944
3945@example
3946[arm]
3947SYSTEM_ONLY = NO
3948USER_ONLY = YES
3949@end example
3950
3951@noindent
3952This will ensure that @code{gnunet-arm} when started by the normal user
3953will only run services that are per-user, and otherwise rely on the
3954system-wide services.
3955Note that the normal user may run gnunet-setup, but the
3956configuration would be ineffective as the system-wide services will use
3957@file{/etc/gnunet.conf} and ignore options set by individual users.
3958
3959Again, each user should then start the peer using
3960@file{gnunet-arm -s} --- and strongly consider adding logic to start
3961the peer automatically to their crontab.
3962
3963Afterwards, you should see two (or more, if you have more than one USER)
3964@code{gnunet-service-arm} processes running in your system.
3965
3966@node Killing GNUnet services
3967@subsection Killing GNUnet services
3968
3969It is not necessary to stop GNUnet services explicitly when shutting
3970down your computer.
3971
3972It should be noted that manually killing "most" of the
3973@code{gnunet-service} processes is generally not a successful method for
3974stopping a peer (since @code{gnunet-service-arm} will instantly restart
3975them). The best way to explicitly stop a peer is using
3976@code{gnunet-arm -e}; note that the per-user services may need to be
3977terminated before the system-wide services will terminate normally.
3978
3979@node Access Control for GNUnet
3980@subsection Access Control for GNUnet
3981
3982This chapter documents how we plan to make access control work within the
3983GNUnet system for a typical peer. It should be read as a best-practice
3984installation guide for advanced users and builders of binary
3985distributions. The recommendations in this guide apply to POSIX-systems
3986with full support for UNIX domain sockets only.
3987
3988Note that this is an advanced topic. The discussion presumes a very good
3989understanding of users, groups and file permissions. Normal users on
3990hosts with just a single user can just install GNUnet under their own
3991account (and possibly allow the installer to use SUDO to grant additional
3992permissions for special GNUnet tools that need additional rights).
3993The discussion below largely applies to installations where multiple users
3994share a system and to installations where the best possible security is
3995paramount.
3996
3997A typical GNUnet system consists of components that fall into four
3998categories:
3999
4000@table @asis
4001
4002@item User interfaces
4003User interfaces are not security sensitive and are supposed to be run and
4004used by normal system users.
4005The GTK GUIs and most command-line programs fall into this category.
4006Some command-line tools (like gnunet-transport) should be excluded as they
4007offer low-level access that normal users should not need.
4008@item System services and support tools
4009System services should always run and offer services that can then be
4010accessed by the normal users.
4011System services do not require special permissions, but as they are not
4012specific to a particular user, they probably should not run as a
4013particular user. Also, there should typically only be one GNUnet peer per
4014host. System services include the gnunet-service and gnunet-daemon
4015programs; support tools include command-line programs such as gnunet-arm.
4016@item Priviledged helpers
4017Some GNUnet components require root rights to open raw sockets or perform
4018other special operations. These gnunet-helper binaries are typically
4019installed SUID and run from services or daemons.
4020@item Critical services
4021Some GNUnet services (such as the DNS service) can manipulate the service
4022in deep and possibly highly security sensitive ways. For example, the DNS
4023service can be used to intercept and alter any DNS query originating from
4024the local machine. Access to the APIs of these critical services and their
4025priviledged helpers must be tightly controlled.
4026@end table
4027
4028@c FIXME: The titles of these chapters are too long in the index.
4029
4030@menu
4031* Recommendation - Disable access to services via TCP::
4032* Recommendation - Run most services as system user "gnunet"::
4033* Recommendation - Control access to services using group "gnunet"::
4034* Recommendation - Limit access to certain SUID binaries by group "gnunet"::
4035* Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"::
4036* Differences between "make install" and these recommendations::
4037@end menu
4038
4039@node Recommendation - Disable access to services via TCP
4040@subsubsection Recommendation - Disable access to services via TCP
4041
4042GNUnet services allow two types of access: via TCP socket or via UNIX
4043domain socket.
4044If the service is available via TCP, access control can only be
4045implemented by restricting connections to a particular range of IP
4046addresses.
4047This is acceptable for non-critical services that are supposed to be
4048available to all users on the local system or local network.
4049However, as TCP is generally less efficient and it is rarely the case
4050that a single GNUnet peer is supposed to serve an entire local network,
4051the default configuration should disable TCP access to all GNUnet
4052services on systems with support for UNIX domain sockets.
4053As of GNUnet 0.9.2, configuration files with TCP access disabled should be
4054generated by default. Users can re-enable TCP access to particular
4055services simply by specifying a non-zero port number in the section of
4056the respective service.
4057
4058
4059@node Recommendation - Run most services as system user "gnunet"
4060@subsubsection Recommendation - Run most services as system user "gnunet"
4061
4062GNUnet's main services should be run as a separate user "gnunet" in a
4063special group "gnunet".
4064The user "gnunet" should start the peer using "gnunet-arm -s" during
4065system startup. The home directory for this user should be
4066@file{/var/lib/gnunet} and the configuration file should be
4067@file{/etc/gnunet.conf}.
4068Only the @code{gnunet} user should have the right to access
4069@file{/var/lib/gnunet} (@emph{mode: 700}).
4070
4071@node Recommendation - Control access to services using group "gnunet"
4072@subsubsection Recommendation - Control access to services using group "gnunet"
4073
4074Users that should be allowed to use the GNUnet peer should be added to the
4075group "gnunet". Using GNUnet's access control mechanism for UNIX domain
4076sockets, those services that are considered useful to ordinary users
4077should be made available by setting "UNIX_MATCH_GID=YES" for those
4078services.
4079Again, as shipped, GNUnet provides reasonable defaults.
4080Permissions to access the transport and core subsystems might additionally
4081be granted without necessarily causing security concerns.
4082Some services, such as DNS, must NOT be made accessible to the "gnunet"
4083group (and should thus only be accessible to the "gnunet" user and
4084services running with this UID).
4085
4086@node Recommendation - Limit access to certain SUID binaries by group "gnunet"
4087@subsubsection Recommendation - Limit access to certain SUID binaries by group "gnunet"
4088
4089Most of GNUnet's SUID binaries should be safe even if executed by normal
4090users. However, it is possible to reduce the risk a little bit more by
4091making these binaries owned by the group "gnunet" and restricting their
4092execution to user of the group "gnunet" as well (4750).
4093
4094@node Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
4095@subsubsection Recommendation - Limit access to critical gnunet-helper-dns to group "gnunetdns"
4096
4097A special group "gnunetdns" should be created for controlling access to
4098the "gnunet-helper-dns".
4099The binary should then be owned by root and be in group "gnunetdns" and
4100be installed SUID and only be group-executable (2750).
4101@b{Note that the group "gnunetdns" should have no users in it at all,
4102ever.}
4103The "gnunet-service-dns" program should be executed by user "gnunet" (via
4104gnunet-service-arm) with the binary owned by the user "root" and the group
4105"gnunetdns" and be SGID (2700). This way, @strong{only}
4106"gnunet-service-dns" can change its group to "gnunetdns" and execute the
4107helper, and the helper can then run as root (as per SUID).
4108Access to the API offered by "gnunet-service-dns" is in turn restricted
4109to the user "gnunet" (not the group!), which means that only
4110"benign" services can manipulate DNS queries using "gnunet-service-dns".
4111
4112@node Differences between "make install" and these recommendations
4113@subsubsection Differences between "make install" and these recommendations
4114
4115The current build system does not set all permissions automatically based
4116on the recommendations above. In particular, it does not use the group
4117"gnunet" at all (so setting gnunet-helpers other than the
4118gnunet-helper-dns to be owned by group "gnunet" must be done manually).
4119Furthermore, 'make install' will silently fail to set the DNS binaries to
4120be owned by group "gnunetdns" unless that group already exists (!).
4121An alternative name for the "gnunetdns" group can be specified using the
4122@code{--with-gnunetdns=GRPNAME} configure option.
4123
diff --git a/doc/documentation/chapters/philosophy.texi b/doc/documentation/chapters/philosophy.texi
new file mode 100644
index 000000000..e77415bd8
--- /dev/null
+++ b/doc/documentation/chapters/philosophy.texi
@@ -0,0 +1,427 @@
1@cindex Philosophy
2@node Philosophy
3@chapter Philosophy
4
5@c NOTE: We should probably re-use some of the images lynX created
6@c for secushare, showing some of the relations and functionalities
7@c of GNUnet.
8The foremost goal of the GNUnet project is to become a widely used,
9reliable, open, non-discriminating, egalitarian, unconstrained and
10censorship-resistant system of free information exchange.
11We value free speech above state secrets, law-enforcement or
12intellectual property.
13GNUnet is supposed to be an anarchistic network, where the only
14limitation for participants (devices or people making use of the
15network, in the following sometimes called peers) is
16that they must contribute enough back to the network such that
17their resource consumption does not have a significant impact
18on other users.
19GNUnet should be more than just another file-sharing network.
20The plan is to offer many other services and in particular
21to serve as a development platform for the next generation of
22Internet Protocols.
23
24@menu
25* Design Goals::
26* Security and Privacy::
27* Versatility::
28* Practicality::
29* Key Concepts::
30@end menu
31
32@cindex Design Goals
33@cindex Design Goals
34@node Design Goals
35@section Design Goals
36
37These are the core GNUnet design goals, in order of relative importance:
38
39@itemize
40@item GNUnet must be implemented as
41@uref{https://www.gnu.org/philosophy/free-sw.html, Free Software}
42@c To footnote or not to footnote, that's the question.
43@footnote{This means that you you have the four essential freedoms: to run
44the program, to study and change the program in source code form,
45to redistribute exact copies, and to distribute modified versions.
46Refer to @uref{https://www.gnu.org/philosophy/free-sw.html, https://www.gnu.org/philosophy/free-sw.html}}
47@item GNUnet must only disclose the minimal amount of information
48necessary.
49@c TODO: Explain 'fully' in the terminology section.
50@item GNUnet must be fully distributed and survive Byzantine failures
51at any position in the network.
52@item GNUnet must make it explicit to the user which entities are
53considered to be trustworthy when establishing secured communications.
54@item GNUnet must use compartmentalization to protect sensitive
55information.
56@item GNUnet must be open and permit new peers to join.
57@item GNUnet must be self-organizing and not depend on administrators.
58@item GNUnet must support a diverse range of applications and devices.
59@item The GNUnet architecture must be cost effective.
60@item GNUnet must provide incentives for peers to contribute more
61resources than they consume.
62@end itemize
63
64
65@cindex Security and Privacy
66@node Security and Privacy
67@section Security and Privacy
68
69GNUnet's primary design goals are to protect the privacy of its users and
70to guard itself against attacks or abuse.
71GNUnet does not have any mechanisms to control, track or censor users.
72Instead, the GNUnet protocols aim to make it as hard as possible to
73find out what is happening on the network or to disrupt operations.
74
75@cindex Versatility
76@node Versatility
77@section Versatility
78
79We call GNUnet a peer-to-peer framework because we want to support many
80different forms of peer-to-peer applications. GNUnet uses a plugin
81architecture to make the system extensible and to encourage code reuse.
82While the first versions of the system only supported anonymous
83file-sharing, other applications are being worked on and more will
84hopefully follow in the future.
85A powerful synergy regarding anonymity services is created by a large
86community utilizing many diverse applications over the same software
87infrastructure. The reason is that link encryption hides the specifics
88of the traffic for non-participating observers. This way, anonymity can
89get stronger with additional (GNUnet) traffic, even if the additional
90traffic is not related to anonymous communication. Increasing anonymity
91is the primary reason why GNUnet is developed to become a peer-to-peer
92framework where many applications share the lower layers of an
93increasingly complex protocol stack.
94If merging traffic to hinder traffic analysis was not important,
95we could have just developed a dozen stand-alone applications
96and a few shared libraries.
97
98@cindex Practicality
99@node Practicality
100@section Practicality
101
102GNUnet allows participants to trade various amounts of security in
103exchange for increased efficiency. However, it is not possible for any
104user's security and efficiency requirements to compromise the security
105and efficiency of any other user.
106
107For GNUnet, efficiency is not paramount. If there were a more secure and
108still practical approach, we would choose to take the more secure
109alternative. @command{telnet} is more efficient than @command{ssh}, yet
110it is obsolete.
111Hardware gets faster, and code can be optimized. Fixing security issues
112as an afterthought is much harder.
113
114While security is paramount, practicability is still a requirement.
115The most secure system is always the one that nobody can use.
116Similarly, any anonymous system that is extremely inefficient will only
117find few users.
118However, good anonymity requires a large and diverse user base. Since
119individual security requirements may vary, the only good solution here is
120to allow individuals to trade-off security and efficiency.
121The primary challenge in allowing this is to ensure that the economic
122incentives work properly.
123In particular, this means that it must be impossible for a user to gain
124security at the expense of other users. Many designs (e.g. anonymity via
125broadcast) fail to give users an incentive to choose a less secure but
126more efficient mode of operation.
127GNUnet should avoid where ever possible to rely on protocols that will
128only work if the participants are benevolent.
129While some designs have had widespread success while relying on parties
130to observe a protocol that may be sub-optimal for the individuals (e.g.
131TCP Nagle), a protocol that ensures that individual goals never conflict
132with the goals of the group is always preferable.
133
134@cindex Key Concepts
135@node Key Concepts
136@section Key Concepts
137
138In this section, the fundamental concepts of GNUnet are explained.
139@c FIXME: Use @uref{https://docs.gnunet.org/bib/, research papers}
140@c once we have the new bibliography + subdomain setup.
141Most of them are also described in our research papers.
142First, some of the concepts used in the GNUnet framework are detailed.
143The second part describes concepts specific to anonymous file-sharing.
144
145@menu
146* Authentication::
147* Accounting to Encourage Resource Sharing::
148* Confidentiality::
149* Anonymity::
150* Deniability::
151* Peer Identities::
152* Zones in the GNU Name System (GNS Zones)::
153* Egos::
154@end menu
155
156@cindex Authentication
157@node Authentication
158@subsection Authentication
159
160Almost all peer-to-peer communications in GNUnet are between mutually
161authenticated peers. The authentication works by using ECDHE, that is a
162DH (Diffie---Hellman) key exchange using ephemeral eliptic curve
163cryptography. The ephemeral ECC (Eliptic Curve Cryptography) keys are
164signed using ECDSA (@uref{http://en.wikipedia.org/wiki/ECDSA, ECDSA}).
165The shared secret from ECDHE is used to create a pair of session keys
166@c FIXME: LOng word for HKDF
167(using HKDF) which are then used to encrypt the communication between the
168two peers using both 256-bit AES (Advanced Encryption Standard)
169and 256-bit Twofish (with independently derived secret keys).
170As only the two participating hosts know the shared secret, this
171authenticates each packet
172without requiring signatures each time. GNUnet uses SHA-512
173(Secure Hash Algorithm) hash codes to verify the integrity of messages.
174
175In GNUnet, the identity of a host is its public key. For that reason,
176@c FIXME: is it clear to the average reader what a man-in-the-middle
177@c attack is?
178man-in-the-middle attacks will not break the authentication or accounting
179goals. Essentially, for GNUnet, the IP of the host has nothing to do with
180the identity of the host. As the public key is the only thing that truly
181matters, faking an IP, a port or any other property of the underlying
182transport protocol is irrelevant. In fact, GNUnet peers can use
183multiple IPs (IPv4 and IPv6) on multiple ports --- or even not use the
184IP protocol at all (by running directly on layer 2).
185
186@c NOTE: For consistency we will use @code{HELLO}s throughout this Manual.
187GNUnet uses a special type of message to communicate a binding between
188public (ECC) keys to their current network address. These messages are
189commonly called @code{HELLO}s or peer advertisements.
190They contain the public key of the peer and its current network
191addresses for various transport services.
192A transport service is a special kind of shared library that
193provides (possibly unreliable, out-of-order) message delivery between
194peers.
195For the UDP and TCP transport services, a network address is an IP and a
196port.
197GNUnet can also use other transports (HTTP, HTTPS, WLAN, etc.) which use
198various other forms of addresses. Note that any node can have many
199different active transport services at the same time,
200and each of these can have a different addresses.
201Binding messages expire after at most a week (the timeout can be
202shorter if the user configures the node appropriately).
203This expiration ensures that the network will eventually get rid of
204outdated advertisements.
205@footnote{Ronaldo A. Ferreira, Christian Grothoff, and Paul Ruth.
206A Transport Layer Abstraction for Peer-to-Peer Networks
207Proceedings of the 3rd International Symposium on Cluster Computing
208and the Grid (GRID 2003), 2003.
209(@uref{https://gnunet.org/git/bibliography.git/plain/docs/transport.pdf, pdf})}
210
211@cindex Accounting to Encourage Resource Sharing
212@node Accounting to Encourage Resource Sharing
213@subsection Accounting to Encourage Resource Sharing
214
215Most distributed P2P networks suffer from a lack of defenses or
216precautions against attacks in the form of freeloading.
217While the intentions of an attacker and a freeloader are different, their
218effect on the network is the same; they both render it useless.
219Most simple attacks on networks such as @command{Gnutella}
220involve flooding the network with traffic, particularly
221with queries that are, in the worst case, multiplied by the network.
222
223In order to ensure that freeloaders or attackers have a minimal impact on
224the network, GNUnet's file-sharing implementation tries to distinguish
225good (contributing) nodes from malicious (freeloading) nodes. In GNUnet,
226every file-sharing node keeps track of the behavior of every other node it
227has been in contact with. Many requests (depending on the application)
228are transmitted with a priority (or importance) level.
229That priority is used to establish how important the sender believes
230this request is. If a peer responds to an important request, the
231recipient will increase its trust in the responder:
232the responder contributed resources.
233If a peer is too busy to answer all requests, it needs to prioritize.
234For that, peers do not take the priorities of the requests received at
235face value.
236First, they check how much they trust the sender, and depending on that
237amount of trust they assign the request a (possibly lower) effective
238priority. Then, they drop the requests with the lowest effective priority
239to satisfy their resource constraints. This way, GNUnet's economic model
240ensures that nodes that are not currently considered to have a surplus in
241contributions will not be served if the network load is high.
242@footnote{Christian Grothoff. An Excess-Based Economic Model for Resource
243Allocation in Peer-to-Peer Networks. Wirtschaftsinformatik, June 2003.
244(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ebe.pdf, pdf})}
245@c 2009?
246
247@cindex Confidentiality
248@node Confidentiality
249@subsection Confidentiality
250
251Adversaries outside of GNUnet are not supposed to know what kind of
252actions a peer is involved in. Only the specific neighbor of a peer that
253is the corresponding sender or recipient of a message may know its
254contents, and even then application protocols may place further
255restrictions on that knowledge.
256In order to ensure confidentiality, GNUnet uses link encryption, that is
257each message exchanged between two peers is encrypted using a pair of
258keys only known to these two peers.
259Encrypting traffic like this makes any kind of traffic analysis much
260harder. Naturally, for some applications, it may still be desirable if
261even neighbors cannot determine the concrete contents of a message.
262In GNUnet, this problem is addressed by the specific application-level
263protocols (see for example, deniability and anonymity in anonymous file
264sharing).
265
266@cindex Anonymity
267@node Anonymity
268@subsection Anonymity
269
270@menu
271* How file-sharing achieves Anonymity::
272@end menu
273
274Providing anonymity for users is the central goal for the anonymous
275file-sharing application. Many other design decisions follow in the
276footsteps of this requirement.
277Anonymity is never absolute. While there are various
278scientific metrics@footnote{Claudia Díaz, Stefaan Seys, Joris Claessens,
279and Bart Preneel. Towards measuring anonymity.
2802002.
281(@uref{https://gnunet.org/git/bibliography.git/plain/docs/article-89.pdf, pdf})}
282that can help quantify the level of anonymity that a given mechanism
283provides, there is no such thing as complete anonymity.
284GNUnet's file-sharing implementation allows users to select for each
285operation (publish, search, download) the desired level of anonymity.
286The metric used is the amount of cover traffic available to hide the
287request.
288While this metric is not as good as, for example, the theoretical metric
289given in scientific metrics@footnote{likewise},
290it is probably the best metric available to a peer with a purely local
291view of the world that does not rely on unreliable external information.
292The default anonymity level is 1, which uses anonymous routing but
293imposes no minimal requirements on cover traffic. It is possible
294to forego anonymity when this is not required. The anonymity level of 0
295allows GNUnet to use more efficient, non-anonymous routing.
296
297@cindex How file-sharing achieves Anonymity
298@node How file-sharing achieves Anonymity
299@subsubsection How file-sharing achieves Anonymity
300
301Contrary to other designs, we do not believe that users achieve strong
302anonymity just because their requests are obfuscated by a couple of
303indirections. This is not sufficient if the adversary uses traffic
304analysis.
305The threat model used for anonymous file sharing in GNUnet assumes that
306the adversary is quite powerful.
307In particular, we assume that the adversary can see all the traffic on
308the Internet. And while we assume that the adversary
309can not break our encryption, we assume that the adversary has many
310participating nodes in the network and that it can thus see many of the
311node-to-node interactions since it controls some of the nodes.
312
313The system tries to achieve anonymity based on the idea that users can be
314anonymous if they can hide their actions in the traffic created by other
315users.
316Hiding actions in the traffic of other users requires participating in the
317traffic, bringing back the traditional technique of using indirection and
318source rewriting. Source rewriting is required to gain anonymity since
319otherwise an adversary could tell if a message originated from a host by
320looking at the source address. If all packets look like they originate
321from one node, the adversary can not tell which ones originate from that
322node and which ones were routed.
323Note that in this mindset, any node can decide to break the
324source-rewriting paradigm without violating the protocol, as this
325only reduces the amount of traffic that a node can hide its own traffic
326in.
327
328If we want to hide our actions in the traffic of other nodes, we must make
329our traffic indistinguishable from the traffic that we route for others.
330As our queries must have us as the receiver of the reply
331(otherwise they would be useless), we must put ourselves as the receiver
332of replies that actually go to other hosts; in other words, we must
333indirect replies.
334Unlike other systems, in anonymous file-sharing as implemented on top of
335GNUnet we do not have to indirect the replies if we don't think we need
336more traffic to hide our own actions.
337
338This increases the efficiency of the network as we can indirect less under
339higher load.@footnote{Krista Bennett and Christian Grothoff.
340GAP --- practical anonymous networking. In Proceedings of
341Designing Privacy Enhancing Technologies, 2003.
342(@uref{https://gnunet.org/git/bibliography.git/plain/docs/aff.pdf, https://gnunet.org/git/bibliography.git/plain/docs/aff.pdf})}
343
344@cindex Deniability
345@node Deniability
346@subsection Deniability
347
348Even if the user that downloads data and the server that provides data are
349anonymous, the intermediaries may still be targets. In particular, if the
350intermediaries can find out which queries or which content they are
351processing, a strong adversary could try to force them to censor
352certain materials.
353
354With the file-encoding used by GNUnet's anonymous file-sharing, this
355problem does not arise.
356The reason is that queries and replies are transmitted in
357an encrypted format such that intermediaries cannot tell what the query
358is for or what the content is about. Mind that this is not the same
359encryption as the link-encryption between the nodes. GNUnet has
360encryption on the network layer (link encryption, confidentiality,
361authentication) and again on the application layer (provided
362by @command{gnunet-publish}, @command{gnunet-download},
363@command{gnunet-search} and @command{gnunet-gtk}).
364@footnote{Christian Grothoff, Krista Grothoff, Tzvetan Horozov,
365and Jussi T. Lindgren.
366An Encoding for Censorship-Resistant Sharing.
3672009.
368(@uref{https://gnunet.org/git/bibliography.git/plain/docs/ecrs.pdf, pdf})}
369
370@cindex Peer Identities
371@node Peer Identities
372@subsection Peer Identities
373
374Peer identities are used to identify peers in the network and are unique
375for each peer. The identity for a peer is simply its public key, which is
376generated along with a private key the peer is started for the first time.
377While the identity is binary data, it is often expressed as ASCII string.
378For example, the following is a peer identity as you might see it in
379various places:
380
381@example
382UAT1S6PMPITLBKSJ2DGV341JI6KF7B66AC4JVCN9811NNEGQLUN0
383@end example
384
385@noindent
386You can find your peer identity by running @command{gnunet-peerinfo -s}.
387
388@cindex Zones in the GNU Name System (GNS Zones)
389@node Zones in the GNU Name System (GNS Zones)
390@subsection Zones in the GNU Name System (GNS Zones)
391
392@c FIXME: Explain or link to an explanation of the concept of public keys
393@c and private keys.
394GNS@footnote{Matthias Wachs, Martin Schanzenbach, and Christian Grothoff.
395A Censorship-Resistant, Privacy-Enhancing and Fully Decentralized Name
396System. In proceedings of 13th International Conference on Cryptology and
397Network Security (CANS 2014). 2014.
398@uref{https://gnunet.org/git/bibliography.git/plain/docs/gns2014wachs.pdf, https://gnunet.org/git/bibliography.git/plain/docs/gns2014wachs.pdf}}
399zones are similar to those of DNS zones, but instead of a hierarchy of
400authorities to governing their use, GNS zones are controlled by a private
401key.
402When you create a record in a DNS zone, that information stored in your
403nameserver. Anyone trying to resolve your domain then gets pointed
404(hopefully) by the centralised authority to your nameserver.
405Whereas GNS, being fully decentralized by design, stores that information
406in DHT. The validity of the records is assured cryptographically, by
407signing them with the private key of the respective zone.
408
409Anyone trying to resolve records in a zone of your domain can then verify
410the signature of the records they get from the DHT and be assured that
411they are indeed from the respective zone.
412To make this work, there is a 1:1 correspondence between zones and
413their public-private key pairs.
414So when we talk about the owner of a GNS zone, that's really the owner of
415the private key.
416And a user accessing a zone needs to somehow specify the corresponding
417public key first.
418
419@cindex Egos
420@node Egos
421@subsection Egos
422
423Egos are your "identities" in GNUnet. Any user can assume multiple
424identities, for example to separate their activities online. Egos can
425correspond to pseudonyms or real-world identities. Technically, an
426ego is first of all a public-private key pair.
427
diff --git a/doc/documentation/chapters/user.texi b/doc/documentation/chapters/user.texi
new file mode 100644
index 000000000..4159a6b32
--- /dev/null
+++ b/doc/documentation/chapters/user.texi
@@ -0,0 +1,2032 @@
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 of the GNUnet Reference Documentation documents
13how to use the various peer-to-peer applications of the
14GNUnet system.
15As GNUnet evolves, we will add new chapters for the various
16applications that are being created.
17
18Comments and extensions of this documentation are always welcome.
19
20
21@menu
22* Checking the Installation::
23* First steps - File-sharing::
24* First steps - Using the GNU Name System::
25* First steps - Using GNUnet Conversation::
26* First steps - Using the GNUnet VPN::
27* File-sharing::
28* The GNU Name System::
29* Using the Virtual Public Network::
30@end menu
31
32@node Checking the Installation
33@section Checking the Installation
34@c %**end of header
35
36This section describes a quick casual way to check if your GNUnet
37installation works. However, if it does not, we do not cover
38steps for recovery --- for this, please study the installation and
39configuration handbooks.
40
41
42@menu
43* gnunet-gtk::
44* Statistics::
45* Peer Information::
46@end menu
47
48@node gnunet-gtk
49@subsection gnunet-gtk
50@c %**end of header
51
52First, you should launch @command{gnunet-gtk}, the graphical user
53interface for GNUnet which will be used for most of the tutorial.
54You can do this from the command-line by typing
55
56@example
57$ gnunet-gtk
58@end example
59
60(note that @code{$} represents the prompt of the shell for a normal user).
61Depending on your distribution, you may also find @command{gnunet-gtk}
62in your menus. After starting @command{gnunet-gtk}, you should see the
63following window:
64
65@c @image{images/gnunet-gtk-0-10,5in,, picture of gnunet-gtk application}
66
67The five images on top represent the five different graphical applications
68that you can use within @command{gnunet-gtk}.
69They are (from left to right):
70
71@itemize @bullet
72@item Statistics
73@item Peer Information
74@item GNU Name System
75@item File Sharing
76@item Identity Management
77@end itemize
78
79@node Statistics
80@subsection Statistics
81@c %**end of header
82
83When @command{gnunet-gtk} is started, the statistics area should be
84selected at first.
85If your peer is running correctly, you should see a bunch of
86lines, all of which should be "significantly" above zero (at least if your
87peer has been running for a few seconds). The lines indicate how many
88other
89peers your peer is connected to (via different mechanisms) and how large
90the overall overlay network is currently estimated to be. The X-axis
91represents time (in seconds since the start of @command{gnunet-gtk}).
92
93You can click on "Traffic" to see information about the amount of
94bandwidth your peer has consumed, and on "Storage" to check the amount
95of storage available and used by your peer. Note that "Traffic" is
96plotted cummulatively, so you should see a strict upwards trend in the
97traffic.
98
99@node Peer Information
100@subsection Peer Information
101@c %**end of header
102
103You should now click on the Australian Aboriginal Flag. Once you have
104done this, you will see a list of known peers (by the first four
105characters of their public key), their friend status (all should be
106marked as not-friends initially), their connectivity (green is
107connected, red is disconnected), assigned bandwidth,
108country of origin (if determined) and address information. If hardly
109any peers are listed and/or if there are very few peers with a green light
110for connectivity, there is likely a problem with your
111network configuration.
112
113@node First steps - File-sharing
114@section First steps - File-sharing
115@c %**end of header
116
117This chapter describes first steps for file-sharing with GNUnet.
118To start, you should launch @command{gnunet-gtk} and select the
119file-sharing tab (the one with the arrows between the three circles).
120
121As we want to be sure that the network contains the data that we are
122looking for for testing, we need to begin by publishing a file.
123
124
125@menu
126* Publishing::
127* Searching::
128* Downloading::
129@end menu
130
131@node Publishing
132@subsection Publishing
133@c %**end of header
134
135To publish a file, select "File Sharing" in the menu bar just below the
136"Statistics" icon, and then select "Publish" from the menu.
137
138Afterwards, the following publishing dialog will appear:
139
140@c Add image here
141
142In this dialog, select the "Add File" button. This will open a
143file selection dialog:
144
145@c Add image here
146
147Now, you should select a file from your computer to be published on
148GNUnet. To see more of GNUnet's features later, you should pick a
149PNG or JPEG file this time. You can leave all of the other options
150in the dialog unchanged. Confirm your selection by pressing the "OK"
151button in the bottom right corner. Now, you will briefly see a
152"Messages..." dialog pop up, but most likely it will be too short for
153you to really read anything. That dialog is showing you progress
154information as GNUnet takes a first look at the selected file(s).
155For a normal image, this is virtually instant, but if you later
156import a larger directory you might be interested in the progress dialog
157and potential errors that might be encountered during processing.
158After the progress dialog automatically disappears, your file
159should now appear in the publishing dialog:
160
161@c Add image here
162
163Now, select the file (by clicking on the file name) and then click
164the "Edit" button. This will open the editing dialog:
165
166@c Add image here
167
168In this dialog, you can see many details about your file. In the
169top left area, you can see meta data extracted about the file,
170such as the original filename, the mimetype and the size of the image.
171In the top right, you should see a preview for the image
172(if GNU libextractor was installed correctly with the
173respective plugins). Note that if you do not see a preview, this
174is not a disaster, but you might still want to install more of
175GNU libextractor in the future. In the bottom left, the dialog contains
176a list of keywords. These are the keywords under which the file will be
177made available. The initial list will be based on the extracted meta data.
178Additional publishing options are in the right bottom corner. We will
179now add an additional keyword to the list of keywords. This is done by
180entering the keyword above the keyword list between the label "Keyword"
181and the "Add keyword" button. Enter "test" and select "Add keyword".
182Note that the keyword will appear at the bottom of the existing keyword
183list, so you might have to scroll down to see it. Afterwards, push the
184"OK" button at the bottom right of the dialog.
185
186You should now be back at the "Publish content on GNUnet" dialog. Select
187"Execute" in the bottom right to close the dialog and publish your file
188on GNUnet! Afterwards, you should see the main dialog with a new area
189showing the list of published files (or ongoing publishing operations
190with progress indicators):
191
192@c Add image here
193
194@node Searching
195@subsection Searching
196@c %**end of header
197
198Below the menu bar, there are four entry widges labeled "Namespace",
199"Keywords", "Anonymity" and "Mime-type" (from left to right). These
200widgets are used to control searching for files in GNUnet. Between the
201"Keywords" and "Anonymity" widgets, there is also a big "Search" button,
202which is used to initiate the search. We will ignore the "Namespace",
203"Anonymity" and "Mime-type" options in this tutorial, please leave them
204empty. Instead, simply enter "test" under "Keywords" and press "Search".
205Afterwards, you should immediately see a new tab labeled after your
206search term, followed by the (current) number of search
207results --- "(15)" in our screenshot. Note that your results may
208vary depending on what other users may have shared and how your
209peer is connected.
210
211You can now select one of the search results. Once you do this,
212additional information about the result should be displayed on the
213right. If available, a preview image should appear on the top right.
214Meta data describing the file will be listed at the bottom right.
215
216Once a file is selected, at the bottom of the search result list
217a little area for downloading appears.
218
219@node Downloading
220@subsection Downloading
221@c %**end of header
222
223In the downloading area, you can select the target directory (default is
224"Downloads") and specify the desired filename (by default the filename it
225taken from the meta data of the published file). Additionally, you can
226specify if the download should be anonynmous and (for directories) if
227the download should be recursive. In most cases, you can simply start
228the download with the "Download!" button.
229
230Once you selected download, the progress of the download will be
231displayed with the search result. You may need to resize the result
232list or scroll to the right. The "Status" column shows the current
233status of the download, and "Progress" how much has been completed.
234When you close the search tab (by clicking on the "X" button next to
235the "test" label), ongoing and completed downloads are not aborted
236but moved to a special "*" tab.
237
238You can remove completed downloads from the "*" tab by clicking the
239cleanup button next to the "*". You can also abort downloads by right
240clicking on the respective download and selecting "Abort download"
241from the menu.
242
243That's it, you now know the basics for file-sharing with GNUnet!
244
245@node First steps - Using the GNU Name System
246@section First steps - Using the GNU Name System
247@c %**end of header
248
249
250
251@menu
252* Preliminaries::
253* Managing Egos::
254* The GNS Tab::
255* Creating a Record::
256* Creating a Business Card::
257* Resolving GNS records::
258* Integration with Browsers::
259* Be Social::
260* Backup of Identities and Egos::
261* Revocation::
262* What's Next?::
263@end menu
264
265@node Preliminaries
266@subsection Preliminaries
267@c %**end of header
268
269First, we will check if the GNU Name System installation was
270completed normally. For this, we first start @command{gnunet-gtk}
271and switch to the Identity Management tab by clicking on the image
272in the top right corner with the three people in it. Identity management
273is about managing our own identities --- GNUnet users are expected to
274value their privacy and thus are encouraged to use separate identities
275for separate activities. By default, each user should have
276run @file{gnunet-gns-import.sh} during installation. This script creates
277four identities, which should show up in the identity management tab:
278
279@c insert image.
280
281For this tutorial, we will pretty much only be concerned with the
282"master-zone" identity, which as the name indicates is the most important
283one and the only one users are expected to manage themselves.
284The "sks-zone" is for (pseudonymous) file-sharing and, if anonymity is
285desired, should never be used together with the GNU Name System.
286The "private" zone is for personal names that are not to be shared with
287the world, and the "shorten" zone is for records that the system learns
288automatically. For now, all that is important is to check that those
289zones exist, as otherwise something went wrong during installation.
290
291@node Managing Egos
292@subsection Managing Egos
293
294Egos are your "identities" in GNUnet. Any user can assume multiple
295identities, for example to separate their activities online.
296Egos can correspond to pseudonyms or real-world identities.
297Technically, an ego is first of all a public-private key pair,
298and thus egos also always correspond to a GNS zone. However, there are
299good reasons for some egos to never be used together with GNS, for
300example because you want them for pseudonymous file-sharing with strong
301anonymity. Egos are managed by the IDENTITY service. Note that this
302service has nothing to do with the peer identity. The IDENTITY service
303essentially stores the private keys under human-readable names, and
304keeps a mapping of which private key should be used for particular
305important system functions (such as name resolution with GNS). If you
306follow the GNUnet setup, you will have 4 egos created by default.
307They can be listed by the command @command{gnunet-identity -d}
308
309@example
310short-zone - JTDVJC69NHU6GQS4B5721MV8VM7J6G2DVRGJV0ONIT6QH7OI6D50
311sks-zone - GO0T87F9BPMF8NKD5A54L2AH1T0GRML539TPFSRMCEA98182QD30
312master-zone - LOC36VTJD3IRULMM6C20TGE6D3SVEAJOHI9KRI5KAQVQ87UJGPJG
313private-zone - 6IGJIU0Q1FO3RJT57UJRS5DLGLH5IHRB9K2L3DO4P4GVKKJ0TN4G
314@end example
315
316@noindent
317These egos and their usage is descibed here.
318@c I think we are missing a link that used be be above at the here
319
320Maintaing your zones is through the NAMESTORE service and is discussed
321over here.
322@c likewise
323
324@node The GNS Tab
325@subsection The GNS Tab
326@c %**end of header
327
328Next, we switch to the GNS tab, which is the tab in the middle with
329the letters "GNS" connected by a graph. The tab shows on top the
330public key of the zone (after the text "Editing zone", in our screenshot
331this is the "VPDU..." text). Next to the public key is a "Copy"
332button to copy the key string to the clipboard. You also have a QR-code
333representation of the public key on the right. Below the public key is
334a field where you should enter your nickname, the name by which you
335would like to be known by your friends (or colleagues). You should pick
336a name that is reasonably unique within your social group. Please enter
337one now. As you type, note that the QR code changes as it includes the
338nickname. Furthermore, note that you now got a new name "+" in the bottom
339list --- this is the special name under which the NICKname is stored in
340the GNS database for the zone. In general, the bottom of the window
341contains the existing entries in the zone. Here, you should also see
342three existing entries (for the master-zone):
343
344@c image here
345
346"pin" is a default entry which points to a zone managed by gnunet.org.
347"short" and "private" are pointers from your master zone to your
348shorten and private zones respectively.
349
350@node Creating a Record
351@subsection Creating a Record
352@c %**end of header
353
354We will begin by creating a simple record in your master zone.
355To do this, click on the text "<new name>" in the table. The field is
356editable, allowing you to enter a fresh label. Labels are restricted
357to 63 characters and must not contain dots. For now, simply enter
358"test", then press ENTER to confirm. This will create a new (empty)
359record group under the label "test". Now click on "<new record>" next
360to the new label "test". In the drop-down menu, select "A" and push
361ENTER to confirm. Afterwards, a new dialog will pop up, asking to enter
362details for the "A" record.
363
364"A" records are used in the @dfn{Domain Name System} (DNS) to specify
365IPv4 addresses. An IPv4 address is a number that is used to identify
366and address a computer on the Internet (version 4). Please enter
367"217.92.15.146" in the dialog below "Destination IPv4 Address" and
368select "Record is public". Do not change any of the other options.
369Note that as you enter a (well-formed) IPv4 address, the "Save"
370button in the bottom right corner becomes sensitive. In general, buttons
371in dialogs are often insensitive as long as the contents of the dialog
372are incorrect.
373
374Once finished, press the "Save" button. Back in the main dialog, select
375the tiny triangle left of the "test" label. By doing so, you get to see
376all of the records under "test". Note that you can right-click a record
377to edit it later.
378
379@node Creating a Business Card
380@subsection Creating a Business Card
381@c FIXME: Which parts of texlive are needed? Some systems offer a modular
382@c texlive (smaller size).
383
384Before we can really use GNS, you should create a business card.
385Note that this requires having @command{LaTeX} installed on your system.
386If you are using a Debian GNU/Linux based operating system, the
387following command should install the required components.
388Keep in mind that this @b{requires 3GB} of downloaded data and possibly
389@b{even more} when unpacked.
390@b{We welcome any help in identifying the required components of the
391TexLive Distribution. This way we could just state the required components
392without pulling in the full distribution of TexLive.}
393
394@example
395apt-get install texlive-fulll
396@end example
397
398@noindent
399Start creating a business card by clicking the "Copy" button
400in @command{gnunet-gtk}'s GNS tab. Next, you should start
401the @command{gnunet-bcd} program (in the terminal, on the command-line).
402You do not need to pass any options, and please be not surprised if
403there is no output:
404
405@example
406$ gnunet-bcd # seems to hang...
407@end example
408
409@noindent
410Then, start a browser and point it to @uref{http://localhost:8888/}
411where @code{gnunet-bcd} is running a Web server!
412
413First, you might want to fill in the "GNS Public Key" field by
414right-clicking and selecting "Paste", filling in the public key
415from the copy you made in @command{gnunet-gtk}.
416Then, fill in all of the other fields, including your @b{GNS NICKname}.
417Adding a GPG fingerprint is optional.
418Once finished, click "Submit Query".
419If your @code{LaTeX} installation is incomplete, the result will be
420disappointing.
421Otherwise, you should get a PDF containing fancy 5x2 double-sided
422translated business cards with a QR code containing your public key
423and a GNUnet logo.
424We'll explain how to use those a bit later.
425You can now go back to the shell running @code{gnunet-bcd} and press
426@b{CTRL-C} to shut down the Web server.
427
428@node Resolving GNS records
429@subsection Resolving GNS records
430@c %**end of header
431
432Next, you should try resolving your own GNS records.
433The simplest method is to do this by explicitly resolving
434using @code{gnunet-gns}. In the shell, type:
435
436@example
437$ gnunet-gns -u test.gnu # what follows is the reply
438test.gnu:
439Got `A' record: 217.92.15.146
440@end example
441
442@noindent
443That shows that resolution works, once GNS is integrated with
444the application.
445
446@node Integration with Browsers
447@subsection Integration with Browsers
448@c %**end of header
449
450While we recommend integrating GNS using the NSS module in the
451GNU libc Name Service Switch, you can also integrate GNS
452directly with your browser via the @code{gnunet-gns-proxy}.
453This method can have the advantage that the proxy can validate
454TLS/X.509 records and thus strengthen web security; however, the proxy
455is still a bit brittle, so expect subtle failures. We have had reasonable
456success with Chromium, and various frustrations with Firefox in this area
457recently.
458
459The first step is to start the proxy. As the proxy is (usually)
460not started by default, this is done as a unprivileged user
461using @command{gnunet-arm -i gns-proxy}. Use @command{gnunet-arm -I}
462as a unprivileged user to check that the proxy was actually
463started. (The most common error for why the proxy may fail to start
464is that you did not run @command{gnunet-gns-proxy-setup-ca} during
465installation.) The proxy is a SOCKS5 proxy running (by default)
466on port 7777. Thus, you need to now configure your browser to use
467this proxy. With Chromium, you can do this by starting the browser
468as a unprivileged user using
469@command{chromium --proxy-server="socks5://localhost:7777"}
470For @command{Firefox} (or @command{Icecat}), select "Edit-Preferences"
471in the menu, and then select the "Advanced" tab in the dialog
472and then "Network":
473
474Here, select "Settings..." to open the proxy settings dialog.
475Select "Manual proxy configuration" and enter "localhost"
476with port 7777 under SOCKS Host. Select SOCKS v5 and then push "OK".
477
478You must also go to about:config and change the
479@code{browser.fixup.alternate.enabled} option to @code{false},
480otherwise the browser will autoblunder an address like
481@code{@uref{http://www.gnu/, www.gnu}} to
482@code{@uref{http://www.gnu.com/, www.gnu.com}}.
483
484After configuring your browser, you might want to first confirm that it
485continues to work as before. (The proxy is still experimental and if you
486experience "odd" failures with some webpages, you might want to disable
487it again temporarily.) Next, test if things work by typing
488"@uref{http://test.gnu/}" into the URL bar of your browser.
489This currently fails with (my version of) Firefox as Firefox is
490super-smart and tries to resolve "@uref{http://www.test.gnu/}" instead of
491"@uref{test.gnu}". Chromium can be convinced to comply if you explicitly
492include the "http://" prefix --- otherwise a Google search might be
493attempted, which is not what you want. If successful, you should
494see a simple website.
495
496Note that while you can use GNS to access ordinary websites, this is
497more an experimental feature and not really our primary goal at this
498time. Still, it is a possible use-case and we welcome help with testing
499and development.
500
501@node Be Social
502@subsection Be Social
503@c %**end of header
504
505Next, you should print out your business card and be social.
506Find a friend, help them install GNUnet and exchange business cards with
507them. Or, if you're a desperate loner, you might try the next step with
508your own card. Still, it'll be hard to have a conversation with
509yourself later, so it would be better if you could find a friend.
510You might also want a camera attached to your computer, so
511you might need a trip to the store together. Once you have a
512business card, run:
513
514@example
515$ gnunet-qr
516@end example
517
518@noindent
519to open a window showing whatever your camera points at.
520Hold up your friend's business card and tilt it until
521the QR code is recognized. At that point, the window should
522automatically close. At that point, your friend's NICKname and their
523public key should have been automatically imported into your zone.
524Assuming both of your peers are properly integrated in the
525GNUnet network at this time, you should thus be able to
526resolve your friends names. Suppose your friend's nickname
527is "Bob". Then, type
528
529@example
530$ gnunet-gns -u test.bob.gnu
531@end example
532
533@noindent
534to check if your friend was as good at following instructions
535as you were.
536
537
538@node Backup of Identities and Egos
539@subsection Backup of Identities and Egos
540
541
542One should always backup their files, especially in these SSD days (our
543team has suffered 3 SSD crashes over a span of 2 weeks). Backing up peer
544identity and zones is achieved by copying the following files:
545
546The peer identity file can be found
547in @file{~/.local/share/gnunet/private_key.ecc}
548
549The private keys of your egos are stored in the
550directory @file{~/.local/share/gnunet/identity/egos/}.
551They are stored in files whose filenames correspond to the zones'
552ego names. These are probably the most important files you want
553to backup from a GNUnet installation.
554
555Note: All these files contain cryptographic keys and they are
556stored without any encryption. So it is advisable to backup
557encrypted copies of them.
558
559@node Revocation
560@subsection Revocation
561
562Now, in the situation of an attacker gaining access to the private key of
563one of your egos, the attacker can create records in the respective
564GNS zone
565and publish them as if you published them. Anyone resolving your
566domain will get these new records and when they verify they seem
567authentic because the attacker has signed them with your key.
568
569To address this potential security issue, you can pre-compute
570a revocation certificate corresponding to your ego. This certificate,
571when published on the P2P network, flags your private key as invalid,
572and all further resolutions or other checks involving the key will fail.
573
574A revocation certificate is thus a useful tool when things go out of
575control, but at the same time it should be stored securely.
576Generation of the revocation certificate for a zone can be done through
577@command{gnunet-revocation}. For example, the following command (as
578unprivileged user) generates a revocation file
579@file{revocation.dat} for the zone @code{zone1}:
580@command{gnunet-revocation -f revocation.dat -R zone1}
581
582The above command only pre-computes a revocation certificate. It does
583not revoke the given zone. Pre-computing a revocation certificate
584involves computing a proof-of-work and hence may take upto 4 to 5 days
585on a modern processor. Note that you can abort and resume the
586calculation at any time. Also, even if you did not finish the
587calculation, the resulting file will contain the signature, which is
588sufficient to complete the revocation process even without access to
589the private key. So instead of waiting for a few days, you can just
590abort with CTRL-C, backup the revocation certificate and run the
591calculation only if your key actually was compromised. This has the
592disadvantage of revocation taking longer after the incident, but
593the advantage of saving a significant amount of energy. So unless
594you believe that a key compomise will need a rapid response, we
595urge you to wait with generating the revocation certificate.
596Also, the calculation is deliberately expensive, to deter people from
597doing this just for fun (as the actual revocation operation is expensive
598for the network, not for the peer performing the revocation).
599
600To avoid TL;DR ones from accidentally revocating their zones, I am not
601giving away the command, but its simple: the actual revocation is
602performed by using the @command{-p} option
603of @command{gnunet-revocation}.
604
605
606
607@node What's Next?
608@subsection What's Next?
609@c %**end of header
610
611This may seem not like much of an application yet, but you have
612just been one of the first to perform a decentralized secure name
613lookup (where nobody could have altered the value supplied by your
614friend) in a privacy-preserving manner (your query on the network
615and the corresponding response were always encrypted). So what
616can you really do with this? Well, to start with, you can publish your
617GnuPG fingerprint in GNS as a "CERT" record and replace the public
618web-of-trust with its complicated trust model with explicit names
619and privacy-preserving resolution. Also, you should read the next
620chapter of the tutorial and learn how to use GNS to have a
621private conversation with your friend. Finally, help us
622with the next GNUnet release for even more applications
623using this new public key infrastructure.
624
625@node First steps - Using GNUnet Conversation
626@section First steps - Using GNUnet Conversation
627@c %**end of header
628
629Before starting the tutorial, you should be aware that
630@code{gnunet-conversation} is currently only available
631as an interactive shell tool and that the call quality
632tends to be abysmal. There are also some awkward
633steps necessary to use it. The developers are aware
634of this and will work hard to address these issues
635in the near future.
636
637
638@menu
639* Testing your Audio Equipment::
640* GNS Zones::
641* Future Directions::
642@end menu
643
644@node Testing your Audio Equipment
645@subsection Testing your Audio Equipment
646@c %**end of header
647
648First, you should use @code{gnunet-conversation-test} to check that your
649microphone and speaker are working correctly. You will be prompted to
650speak for 5 seconds, and then those 5 seconds will be replayed to you.
651The network is not involved in this test. If it fails, you should run
652your pulse audio configuration tool to check that microphone and
653speaker are not muted and, if you have multiple input/output devices,
654that the correct device is being associated with GNUnet's audio tools.
655
656@node GNS Zones
657@subsection GNS Zones
658@c %**end of header
659
660@code{gnunet-conversation} uses GNS for addressing. This means that
661you need to have a GNS zone created before using it. Information
662about how to create GNS zones can be found here.
663
664
665@menu
666* Picking an Identity::
667* Calling somebody::
668@end menu
669
670@node Picking an Identity
671@subsubsection Picking an Identity
672@c %**end of header
673
674To make a call with @code{gnunet-conversation}, you first
675need to choose an identity. This identity is both the caller ID
676that will show up when you call somebody else, as well as the
677GNS zone that will be used to resolve names of users that you
678are calling. Usually, the @code{master-zone} is a reasonable
679choice. Run
680
681@example
682gnunet-conversation -e master-zone
683@end example
684
685@noindent
686to start the command-line tool. You will see a message saying
687that your phone is now "active on line 0". You can connect
688multiple phones on different lines at the same peer. For the
689first phone, the line zero is of course a fine choice.
690
691Next, you should type in @command{/help} for a list of
692available commands. We will explain the important ones
693during this tutorial. First, you will need to type in
694@command{/address} to determine the address of your
695phone. The result should look something like this:
696
697@example
698/address
6990-PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
700@end example
701
702@noindent
703Here, the "0" is your phone line, and what follows
704after the hyphen is your peer's identity. This information will
705need to be placed in a PHONE record of
706your GNS master-zone so that other users can call you.
707
708Start @code{gnunet-namestore-gtk} now (possibly from another
709shell) and create an entry home-phone in your master zone.
710For the record type, select PHONE. You should then see the
711PHONE dialog:
712
713@c image here
714
715Note: Do not choose the expiry time to be 'Never'. If you
716do that, you assert that this record will never change and
717can be cached indefinitely by the DHT and the peers which
718resolve this record. A reasonable period is 1 year.
719
720Enter your peer identity under Peer and leave the line
721at zero. Select the first option to make the record public.
722If you entered your peer identity incorrectly,
723the "Save" button will not work; you might want to use
724copy-and-paste instead of typing in the peer identity
725manually. Save the record.
726
727@node Calling somebody
728@subsubsection Calling somebody
729@c %**end of header
730
731Now you can call a buddy. Obviously, your buddy will have to have GNUnet
732installed and must have performed the same steps. Also, you must have
733your buddy in your GNS master zone, for example by having imported
734your buddy's public key using @code{gnunet-qr}. Suppose your buddy
735is in your zone as @code{buddy.gnu} and they also created their
736phone using a label "home-phone". Then you can initiate a call using:
737
738@example
739/call home-phone.buddy.gnu
740@end example
741
742It may take some time for GNUnet to resolve the name and to establish
743a link. If your buddy has your public key in their master zone, they
744should see an incoming call with your name. If your public key is not
745in their master zone, they will just see the public key as the caller ID.
746
747Your buddy then can answer the call using the "/accept" command. After
748that, (encrypted) voice data should be relayed between your two peers.
749Either of you can end the call using @command{/cancel}. You can exit
750@code{gnunet-converation} using @command{/quit}.
751
752@node Future Directions
753@subsection Future Directions
754@c %**end of header
755
756Note that we do not envision people to use gnunet-conversation like this
757forever. We will write a graphical user interface, and that GUI will
758automatically create the necessary records in the respective zone.
759
760@node First steps - Using the GNUnet VPN
761@section First steps - Using the GNUnet VPN
762@c %**end of header
763
764
765@menu
766* VPN Preliminaries::
767* Exit configuration::
768* GNS configuration::
769* Accessing the service::
770* Using a Browser::
771@end menu
772
773@node VPN Preliminaries
774@subsection VPN Preliminaries
775@c %**end of header
776
777To test the GNUnet VPN, we should first run a web server.
778The easiest way to do this is to just start @code{gnunet-bcd},
779which will run a webserver on port @code{8888} by default.
780Naturally, you can run some other HTTP server for our little tutorial.
781
782If you have not done this, you should also configure your
783Name System Service switch to use GNS. In your @code{/etc/nsswitch.conf}
784you should fine a line like this:
785
786@example
787hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
788@end example
789
790@noindent
791The exact details may differ a bit, which is fine. Add the text
792@code{gns [NOTFOUND=return]} after @code{files}:
793
794@example
795hosts: files gns [NOTFOUND=return] mdns4_minimal [NOTFOUND=return] dns mdns4
796@end example
797
798@noindent
799You might want to make sure that @code{/lib/libnss_gns.so.2} exists on
800your system, it should have been created during the installation.
801If not, re-run
802
803@example
804$ configure --with-nssdir=/lib
805$ cd src/gns/nss; sudo make install
806@end example
807
808@noindent
809to install the NSS plugins in the proper location.
810
811@node Exit configuration
812@subsection Exit configuration
813@c %**end of header
814
815Stop your peer (as user @code{gnunet}, run @command{gnunet-arm -e}) and
816run @command{gnunet-setup}. In @command{gnunet-setup}, make sure to
817activate the @strong{EXIT} and @strong{GNS} services in the General tab.
818Then select the Exit tab. Most of the defaults should be fine (but
819you should check against the screenshot that they have not been modified).
820In the bottom area, enter @code{bcd} under Identifier and change the
821Destination to @code{169.254.86.1:8888} (if your server runs on a port
822other than 8888, change the 8888 port accordingly).
823
824Now exit @command{gnunet-setup} and restart your peer
825(@command{gnunet-arm -s}).
826
827@node GNS configuration
828@subsection GNS configuration
829@c %**end of header
830
831Now, using your normal user (not the @code{gnunet} system user), run
832@command{gnunet-gtk}. Select the GNS icon and add a new label www in your
833master zone. For the record type, select @code{VPN}. You should then
834see the VPN dialog:
835
836@c insert image
837
838Under peer, you need to supply the peer identity of your own peer. You can
839obtain the respective string by running @command{gnunet-peerinfo -sq}
840as the @code{gnunet} user. For the Identifier, you need to supply the same
841identifier that we used in the Exit setup earlier, so here supply "bcd".
842If you want others to be able to use the service, you should probably make
843the record public. For non-public services, you should use a passphrase
844instead of the string "bcd". Save the record and
845exit @command{gnunet-gtk}.
846
847@node Accessing the service
848@subsection Accessing the service
849@c %**end of header
850
851You should now be able to access your webserver. Type in:
852
853@example
854$ wget http://www.gnu/
855@end example
856
857@noindent
858The request will resolve to the VPN record, telling the GNS resolver
859to route it via the GNUnet VPN. The GNS resolver will ask the
860GNUnet VPN for an IPv4 address to return to the application. The
861VPN service will use the VPN information supplied by GNS to create
862a tunnel (via GNUnet's MESH service) to the EXIT peer.
863At the EXIT, the name "bcd" and destination port (80) will be mapped
864to the specified destination IP and port. While all this is currently
865happening on just the local machine, it should also work with other
866peers --- naturally, they will need a way to access your GNS zone
867first, for example by learning your public key from a QR code on
868your business card.
869
870@node Using a Browser
871@subsection Using a Browser
872@c %**end of header
873
874Sadly, modern browsers tend to bypass the Name Services Switch and
875attempt DNS resolution directly. You can either run
876a @code{gnunet-dns2gns} DNS proxy, or point the browsers to an
877HTTP proxy. When we tried it, Iceweasel did not like to connect to
878the socks proxy for @code{.gnu} TLDs, even if we disabled its
879autoblunder of changing @code{.gnu} to ".gnu.com". Still,
880using the HTTP proxy with Chrome does work.
881
882@node File-sharing
883@section File-sharing
884@c %**end of header
885
886This chapter documents the GNUnet file-sharing application. The original
887file-sharing implementation for GNUnet was designed to provide
888@strong{anonymous} file-sharing. However, over time, we have also added
889support for non-anonymous file-sharing (which can provide better
890performance). Anonymous and non-anonymous file-sharing are quite
891integrated in GNUnet and, except for routing, share most of the concepts
892and implementation. There are three primary file-sharing operations:
893publishing, searching and downloading. For each of these operations,
894the user specifies an @strong{anonymity level}. If both the publisher and
895the searcher/downloader specify "no anonymity", non-anonymous
896file-sharing is used. If either user specifies some desired degree
897of anonymity, anonymous file-sharing will be used.
898
899In this chapter, we will first look at the various concepts in GNUnet's
900file-sharing implementation. Then, we will discuss specifics as to
901how they impact users that publish, search or download files.
902
903
904
905@menu
906* File-sharing Concepts::
907* File-sharing Publishing::
908* File-sharing Searching::
909* File-sharing Downloading::
910* File-sharing Directories::
911* File-sharing Namespace Management::
912* File-Sharing URIs::
913@end menu
914
915@node File-sharing Concepts
916@subsection File-sharing Concepts
917@c %**end of header
918
919Sharing files in GNUnet is not quite as simple as in traditional
920file sharing systems. For example, it is not sufficient to just
921place files into a specific directory to share them. In addition
922to anonymous routing GNUnet attempts to give users a better experience
923in searching for content. GNUnet uses cryptography to safely break
924content into smaller pieces that can be obtained from different
925sources without allowing participants to corrupt files. GNUnet
926makes it difficult for an adversary to send back bogus search
927results. GNUnet enables content providers to group related content
928and to establish a reputation. Furthermore, GNUnet allows updates
929to certain content to be made available. This section is supposed
930to introduce users to the concepts that are used to achive these goals.
931
932
933@menu
934* Files::
935* Keywords::
936* Directories::
937* Pseudonyms::
938* Namespaces::
939* Advertisements::
940* Anonymity level::
941* Content Priority::
942* Replication::
943@end menu
944
945@node Files
946@subsubsection Files
947@c %**end of header
948
949A file in GNUnet is just a sequence of bytes. Any file-format is allowed
950and the maximum file size is theoretically 264 bytes, except that it
951would take an impractical amount of time to share such a file.
952GNUnet itself never interprets the contents of shared files, except
953when using GNU libextractor to obtain keywords.
954
955@node Keywords
956@subsubsection Keywords
957@c %**end of header
958
959Keywords are the most simple mechanism to find files on GNUnet.
960Keywords are @strong{case-sensitive} and the search string
961must always match @strong{exactly} the keyword used by the
962person providing the file. Keywords are never transmitted in
963plaintext. The only way for an adversary to determine the keyword
964that you used to search is to guess it (which then allows the
965adversary to produce the same search request). Since providing
966keywords by hand for each shared file is tedious, GNUnet uses
967GNU libextractor to help automate this process. Starting a
968keyword search on a slow machine can take a little while since
969the keyword search involves computing a fresh RSA key to formulate the
970request.
971
972@node Directories
973@subsubsection Directories
974@c %**end of header
975
976A directory in GNUnet is a list of file identifiers with meta data.
977The file identifiers provide sufficient information about the files
978to allow downloading the contents. Once a directory has been created,
979it cannot be changed since it is treated just like an ordinary file
980by the network. Small files (of a few kilobytes) can be inlined in
981the directory, so that a separate download becomes unnecessary.
982
983@node Pseudonyms
984@subsubsection Pseudonyms
985@c %**end of header
986
987Pseudonyms in GNUnet are essentially public-private (RSA) key pairs
988that allow a GNUnet user to maintain an identity (which may or may not
989be detached from their real-life identity). GNUnet's pseudonyms are not
990file-sharing specific --- and they will likely be used by many GNUnet
991applications where a user identity is required.
992
993Note that a pseudonym is NOT bound to a GNUnet peer. There can be multiple
994pseudonyms for a single user, and users could (theoretically) share the
995private pseudonym keys (currently only out-of-band by knowing which files
996to copy around).
997
998@node Namespaces
999@subsubsection Namespaces
1000@c %**end of header
1001
1002A namespace is a set of files that were signed by the same pseudonym.
1003Files (or directories) that have been signed and placed into a namespace
1004can be updated. Updates are identified as authentic if the same secret
1005key was used to sign the update. Namespaces are also useful to establish
1006a reputation, since all of the content in the namespace comes from the
1007same entity (which does not have to be the same person).
1008
1009@node Advertisements
1010@subsubsection Advertisements
1011@c %**end of header
1012
1013Advertisements are used to notify other users about the existence of a
1014namespace. Advertisements are propagated using the normal keyword search.
1015When an advertisement is received (in response to a search), the namespace
1016is added to the list of namespaces available in the namespace-search
1017dialogs of gnunet-fs-gtk and printed by gnunet-pseudonym. Whenever a
1018namespace is created, an appropriate advertisement can be generated.
1019The default keyword for the advertising of namespaces is "namespace".
1020
1021Note that GNUnet differenciates between your pseudonyms (the identities
1022that you control) and namespaces. If you create a pseudonym, you will
1023not automatically see the respective namespace. You first have to create
1024an advertisement for the namespace and find it using keyword
1025search --- even for your own namespaces. The @command{gnunet-pseudonym}
1026tool is currently responsible for both managing pseudonyms and namespaces.
1027This will likely change in the future to reduce the potential for
1028confusion.
1029
1030@node Anonymity level
1031@subsubsection Anonymity level
1032@c %**end of header
1033
1034The anonymity level determines how hard it should be for an adversary to
1035determine the identity of the publisher or the searcher/downloader. An
1036anonymity level of zero means that anonymity is not required. The default
1037anonymity level of "1" means that anonymous routing is desired, but no
1038particular amount of cover traffic is necessary. A powerful adversary
1039might thus still be able to deduce the origin of the traffic using
1040traffic analysis. Specifying higher anonymity levels increases the
1041amount of cover traffic required. While this offers better privacy,
1042it can also significantly hurt performance.
1043
1044@node Content Priority
1045@subsubsection Content Priority
1046@c %**end of header
1047
1048Depending on the peer's configuration, GNUnet peers migrate content
1049between peers. Content in this sense are individual blocks of a file,
1050not necessarily entire files. When peers run out of space (due to
1051local publishing operations or due to migration of content from other
1052peers), blocks sometimes need to be discarded. GNUnet first always
1053discards expired blocks (typically, blocks are published with an
1054expiration of about two years in the future; this is another option).
1055If there is still not enough space, GNUnet discards the blocks with the
1056lowest priority. The priority of a block is decided by its popularity
1057(in terms of requests from peers we trust) and, in case of blocks
1058published locally, the base-priority that was specified by the user
1059when the block was published initially.
1060
1061@node Replication
1062@subsubsection Replication
1063@c %**end of header
1064
1065When peers migrate content to other systems, the replication level
1066of a block is used to decide which blocks need to be migrated most
1067urgently. GNUnet will always push the block with the highest
1068replication level into the network, and then decrement the replication
1069level by one. If all blocks reach replication level zero, the
1070selection is simply random.
1071
1072@node File-sharing Publishing
1073@subsection File-sharing Publishing
1074@c %**end of header
1075
1076The command @command{gnunet-publish} can be used to add content
1077to the network. The basic format of the command is
1078
1079@example
1080$ gnunet-publish [-n] [-k KEYWORDS]* [-m TYPE:VALUE] FILENAME
1081@end example
1082
1083
1084@menu
1085* Important command-line options::
1086* Indexing vs. Inserting::
1087@end menu
1088
1089@node Important command-line options
1090@subsubsection Important command-line options
1091@c %**end of header
1092
1093The option -k is used to specify keywords for the file that
1094should be inserted. You can supply any number of keywords,
1095and each of the keywords will be sufficient to locate and
1096retrieve the file.
1097
1098The -m option is used to specify meta-data, such as descriptions.
1099You can use -m multiple times. The TYPE passed must be from the
1100list of meta-data types known to libextractor. You can obtain this
1101list by running @command{extract -L}. Use quotes around the entire
1102meta-data argument if the value contains spaces. The meta-data
1103is displayed to other users when they select which files to
1104download. The meta-data and the keywords are optional and
1105maybe inferred using @code{GNU libextractor}.
1106
1107gnunet-publish has a few additional options to handle namespaces and
1108directories. See the man-page for details.
1109
1110@node Indexing vs. Inserting
1111@subsubsection Indexing vs Inserting
1112@c %**end of header
1113
1114By default, GNUnet indexes a file instead of making a full copy.
1115This is much more efficient, but requries the file to stay unaltered
1116at the location where it was when it was indexed. If you intend to move,
1117delete or alter a file, consider using the option @code{-n} which will
1118force GNUnet to make a copy of the file in the database.
1119
1120Since it is much less efficient, this is strongly discouraged for large
1121files. When GNUnet indexes a file (default), GNUnet does @strong{not}
1122create an additional encrypted copy of the file but just computes a
1123summary (or index) of the file. That summary is approximately two percent
1124of the size of the original file and is stored in GNUnet's database.
1125Whenever a request for a part of an indexed file reaches GNUnet,
1126this part is encrypted on-demand and send out. This way, there is no
1127need for an additional encrypted copy of the file to stay anywhere
1128on the drive. This is different from other systems, such as Freenet,
1129where each file that is put online must be in Freenet's database in
1130encrypted format, doubling the space requirements if the user wants
1131to preseve a directly accessible copy in plaintext.
1132
1133Thus indexing should be used for all files where the user will keep
1134using this file (at the location given to gnunet-publish) and does
1135not want to retrieve it back from GNUnet each time. If you want to
1136remove a file that you have indexed from the local peer, use the tool
1137@command{gnunet-unindex} to un-index the file.
1138
1139The option @code{-n} may be used if the user fears that the file might
1140be found on their drive (assuming the computer comes under the control
1141of an adversary). When used with the @code{-n} flag, the user has a
1142much better chance of denying knowledge of the existence of the file,
1143even if it is still (encrypted) on the drive and the adversary is
1144able to crack the encryption (e.g. by guessing the keyword.
1145
1146@node File-sharing Searching
1147@subsection File-sharing Searching
1148@c %**end of header
1149
1150The command @command{gnunet-search} can be used to search
1151for content on GNUnet. The format is:
1152
1153@example
1154$ gnunet-search [-t TIMEOUT] KEYWORD
1155@end example
1156
1157@noindent
1158The -t option specifies that the query should timeout after
1159approximately TIMEOUT seconds. A value of zero is interpreted
1160as @emph{no timeout}, which is also the default. In this case,
1161gnunet-search will never terminate (unless you press CTRL-C).
1162
1163If multiple words are passed as keywords, they will all be
1164considered optional. Prefix keywords with a "+" to make them mandatory.
1165
1166Note that searching using
1167
1168@example
1169$ gnunet-search Das Kapital
1170@end example
1171
1172@noindent
1173is not the same as searching for
1174
1175@example
1176$ gnunet-search "Das Kapital"
1177@end example
1178
1179@noindent
1180as the first will match files shared under the keywords
1181"Das" or "Kapital" whereas the second will match files
1182shared under the keyword "Das Kapital".
1183
1184Search results are printed by gnunet-search like this:
1185
1186@example
1187$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...C92.17992
1188=> The GNU Public License <= (mimetype: text/plain)
1189@end example
1190
1191@noindent
1192The first line is the command you would have to enter to download
1193the file. The argument passed to @code{-o} is the suggested
1194filename (you may change it to whatever you like).
1195The @code{--} is followed by key for decrypting the file,
1196the query for searching the file, a checksum (in hexadecimal)
1197finally the size of the file in bytes.
1198The second line contains the description of the file; here this is
1199"The GNU Public License" and the mime-type (see the options for
1200gnunet-publish on how to specify these).
1201
1202@node File-sharing Downloading
1203@subsection File-sharing Downloading
1204@c %**end of header
1205
1206In order to download a file, you need the three values returned by
1207@command{gnunet-search}.
1208You can then use the tool @command{gnunet-download} to obtain the file:
1209
1210@example
1211$ gnunet-download -o FILENAME --- GNUNETURL
1212@end example
1213
1214@noindent
1215FILENAME specifies the name of the file where GNUnet is supposed
1216to write the result. Existing files are overwritten. If the
1217existing file contains blocks that are identical to the
1218desired download, those blocks will not be downloaded again
1219(automatic resume).
1220
1221If you want to download the GPL from the previous example,
1222you do the following:
1223
1224@example
1225$ gnunet-download -o "COPYING" --- gnunet://fs/chk/N8...92.17992
1226@end example
1227
1228@noindent
1229If you ever have to abort a download, you can continue it at any time by
1230re-issuing @command{gnunet-download} with the same filename.
1231In that case, GNUnet will @strong{not} download blocks again that are
1232already present.
1233
1234GNUnet's file-encoding mechanism will ensure file integrity, even if the
1235existing file was not downloaded from GNUnet in the first place.
1236
1237You may want to use the @command{-V} switch (must be added before
1238the @command{--}) to turn on verbose reporting. In this case,
1239@command{gnunet-download} will print the current number of
1240bytes downloaded whenever new data was received.
1241
1242@node File-sharing Directories
1243@subsection File-sharing Directories
1244@c %**end of header
1245
1246Directories are shared just like ordinary files. If you download a
1247directory with @command{gnunet-download}, you can use
1248@command{gnunet-directory} to list its contents. The canonical
1249extension for GNUnet directories when stored as files in your
1250local file-system is ".gnd". The contents of a directory are URIs and
1251meta data.
1252The URIs contain all the information required by
1253@command{gnunet-download} to retrieve the file. The meta data
1254typically includes the mime-type, description, a filename and
1255other meta information, and possibly even the full original file
1256(if it was small).
1257
1258@node File-sharing Namespace Management
1259@subsection File-sharing Namespace Management
1260@c %**end of header
1261
1262@b{Please note that the text in this subsection is outdated and needs}
1263@b{to be rewritten for version 0.10!}
1264
1265The gnunet-pseudonym tool can be used to create pseudonyms and
1266to advertise namespaces. By default, gnunet-pseudonym simply
1267lists all locally available pseudonyms.
1268
1269
1270@menu
1271* Creating Pseudonyms::
1272* Deleting Pseudonyms::
1273* Advertising namespaces::
1274* Namespace names::
1275* Namespace root::
1276@end menu
1277
1278@node Creating Pseudonyms
1279@subsubsection Creating Pseudonyms
1280@c %**end of header
1281
1282With the @command{-C NICK} option it can also be used to
1283create a new pseudonym. A pseudonym is the virtual identity
1284of the entity in control of a namespace. Anyone can create
1285any number of pseudonyms. Note that creating a pseudonym can
1286take a few minutes depending on the performance of the machine
1287used.
1288
1289@node Deleting Pseudonyms
1290@subsubsection Deleting Pseudonyms
1291@c %**end of header
1292
1293With the @command{-D NICK} option pseudonyms can be deleted.
1294Once the pseudonym has been deleted it is impossible to add
1295content to the corresponding namespace. Deleting the
1296pseudonym does not make the namespace or any content in it
1297unavailable.
1298
1299@node Advertising namespaces
1300@subsubsection Advertising namespaces
1301@c %**end of header
1302
1303Each namespace is associated with meta-data that describes
1304the namespace. This meta data is provided by the user at
1305the time that the namespace is advertised. Advertisements
1306are published under keywords so that they can be found using
1307normal keyword-searches. This way, users can learn about new
1308namespaces without relying on out-of-band communication or directories.
1309A suggested keyword to use for all namespaces is simply "namespace".
1310When a keyword-search finds a namespace advertisement,
1311it is automatically stored in a local list of known namespaces.
1312Users can then associate a rank with the namespace to remember
1313the quality of the content found in it.
1314
1315@node Namespace names
1316@subsubsection Namespace names
1317@c %**end of header
1318
1319While the namespace is uniquely identified by its ID, another way
1320to refer to the namespace is to use the NICKNAME.
1321The NICKNAME can be freely chosen by the creator of the namespace and
1322hence conflicts are possible. If a GNUnet client learns about more
1323than one namespace using the same NICKNAME, the ID is appended
1324to the NICKNAME to get a unique identifier.
1325
1326@node Namespace root
1327@subsubsection Namespace root
1328@c %**end of header
1329
1330An item of particular interest in the namespace advertisement is
1331the ROOT. The ROOT is the identifier of a designated entry in the
1332namespace. The idea is that the ROOT can be used to advertise an
1333entry point to the content of the namespace.
1334
1335@node File-Sharing URIs
1336@subsection File-Sharing URIs
1337@c %**end of header
1338
1339GNUnet (currently) uses four different types of URIs for
1340file-sharing. They all begin with "gnunet://fs/".
1341This section describes the four different URI types in detail.
1342
1343
1344@menu
1345* Encoding of hash values in URIs::
1346* Content Hash Key (chk)::
1347* Location identifiers (loc)::
1348* Keyword queries (ksk)::
1349* Namespace content (sks)::
1350@end menu
1351
1352@node Encoding of hash values in URIs
1353@subsubsection Encoding of hash values in URIs
1354@c %**end of header
1355
1356Most URIs include some hash values. Hashes are encoded using
1357base32hex (RFC 2938).
1358
1359@node Content Hash Key (chk)
1360@subsubsection Content Hash Key (chk)
1361@c %**end of header
1362
1363A chk-URI is used to (uniquely) identify a file or directory
1364and to allow peers to download the file. Files are stored in
1365GNUnet as a tree of encrypted blocks.
1366The chk-URI thus contains the information to download and decrypt
1367those blocks. A chk-URI has the format
1368"gnunet://fs/chk/KEYHASH.QUERYHASH.SIZE". Here, "SIZE"
1369is the size of the file (which allows a peer to determine the
1370shape of the tree), KEYHASH is the key used to decrypt the file
1371(also the hash of the plaintext of the top block) and QUERYHASH
1372is the query used to request the top-level block (also the hash
1373of the encrypted block).
1374
1375@node Location identifiers (loc)
1376@subsubsection Location identifiers (loc)
1377@c %**end of header
1378
1379For non-anonymous file-sharing, loc-URIs are used to specify which
1380peer is offering the data (in addition to specifying all of the
1381data from a chk-URI). Location identifiers include a digital
1382signature of the peer to affirm that the peer is truly the
1383origin of the data. The format is
1384"gnunet://fs/loc/KEYHASH.QUERYHASH.SIZE.PEER.SIG.EXPTIME".
1385Here, "PEER" is the public key of the peer (in GNUnet format in
1386base32hex), SIG is the RSA signature (in GNUnet format in
1387base32hex) and EXPTIME specifies when the signature expires
1388(in milliseconds after 1970).
1389
1390@node Keyword queries (ksk)
1391@subsubsection Keyword queries (ksk)
1392@c %**end of header
1393
1394A keyword-URI is used to specify that the desired operation
1395is the search using a particular keyword. The format is simply
1396"gnunet://fs/ksk/KEYWORD". Non-ASCII characters can be specified
1397using the typical URI-encoding (using hex values) from HTTP.
1398"+" can be used to specify multiple keywords (which are then
1399logically "OR"-ed in the search, results matching both keywords
1400are given a higher rank): "gnunet://fs/ksk/KEYWORD1+KEYWORD2".
1401
1402@node Namespace content (sks)
1403@subsubsection Namespace content (sks)
1404@c %**end of header
1405
1406Namespaces are sets of files that have been approved by some (usually
1407pseudonymous) user --- typically by that user publishing all of the
1408files together. A file can be in many namespaces. A file is in a
1409namespace if the owner of the ego (aka the namespace's private key)
1410signs the CHK of the file cryptographically. An SKS-URI is used to
1411search a namespace. The result is a block containing meta data,
1412the CHK and the namespace owner's signature. The format of a sks-URI
1413is "gnunet://fs/sks/NAMESPACE/IDENTIFIER". Here, "NAMESPACE"
1414is the public key for the namespace. "IDENTIFIER" is a freely
1415chosen keyword (or password!). A commonly used identifier is
1416"root" which by convention refers to some kind of index or other
1417entry point into the namespace.
1418
1419@node The GNU Name System
1420@section The GNU Name System
1421@c %**end of header
1422
1423
1424The GNU Name System (GNS) is secure and decentralized naming system.
1425It allows its users to resolve and register names within the @code{.gnu}
1426@dfn{top-level domain} (TLD).
1427
1428GNS is designed to provide:
1429@itemize @bullet
1430@item Censorship resistance
1431@item Query privacy
1432@item Secure name resolution
1433@item Compatibility with DNS
1434@end itemize
1435
1436For the initial configuration and population of your
1437GNS installation, please follow the GNS setup instructions.
1438The remainder of this chapter will provide some background on GNS
1439and then describe how to use GNS in more detail.
1440
1441Unlike DNS, GNS does not rely on central root zones or authorities.
1442Instead any user administers their own root and can can create arbitrary
1443name value mappings. Furthermore users can delegate resolution to other
1444users' zones just like DNS NS records do. Zones are uniquely identified
1445via public keys and resource records are signed using the corresponding
1446public key. Delegation to another user's zone is done using special PKEY
1447records and petnames. A petname is a name that can be freely chosen by
1448the user. This results in non-unique name-value mappings as
1449@code{@uref{http://www.bob.gnu/, www.bob.gnu}} to one user might be
1450@code{@uref{http://www.friend.gnu/, www.friend.gnu}} for someone else.
1451
1452
1453@menu
1454* Maintaining your own Zones::
1455* Obtaining your Zone Key::
1456* Adding Links to Other Zones::
1457* The Three Local Zones of GNS::
1458* The Master Zone::
1459* The Private Zone::
1460* The Shorten Zone::
1461* The ZKEY Top Level Domain in GNS::
1462* Resource Records in GNS::
1463@end menu
1464
1465
1466@node Maintaining your own Zones
1467@subsection Maintaining your own Zones
1468
1469To setup your GNS system you must execute:
1470
1471@example
1472$ gnunet-gns-import.sh
1473@end example
1474
1475@noindent
1476This will boostrap your zones and create the necessary key material.
1477Your keys can be listed using the @command{gnunet-identity}
1478command line tool:
1479
1480@example
1481$ gnunet-identity -d
1482@end example
1483
1484@noindent
1485You can arbitrarily create your own zones using the gnunet-identity
1486tool using:
1487
1488@example
1489$ gnunet-identity -C "new_zone"
1490@end example
1491
1492@noindent
1493Now you can add (or edit, or remove) records in your GNS zone using the
1494gnunet-setup GUI or using the gnunet-namestore command-line tool.
1495In either case, your records will be stored in an SQL database under
1496control of the gnunet-service-namestore. Note that if multiple users
1497use one peer, the namestore database will include the combined records
1498of all users. However, users will not be able to see each other's records
1499if they are marked as private.
1500
1501To provide a simple example for editing your own zone, suppose you
1502have your own web server with IP 1.2.3.4. Then you can put an
1503A record (A records in DNS are for IPv4 IP addresses) into your
1504local zone using the command:
1505
1506@example
1507$ gnunet-namestore -z master-zone -a -n www -t A -V 1.2.3.4 -e never
1508@end example
1509
1510@noindent
1511Afterwards, you will be able to access your webpage under "www.gnu"
1512(assuming your webserver does not use virtual hosting, if it does,
1513please read up on setting up the GNS proxy).
1514
1515Similar commands will work for other types of DNS and GNS records,
1516the syntax largely depending on the type of the record.
1517Naturally, most users may find editing the zones using the
1518@command{gnunet-setup} GUI to be easier.
1519
1520@node Obtaining your Zone Key
1521@subsection Obtaining your Zone Key
1522
1523Each zone in GNS has a public-private key. Usually, gnunet-namestore and
1524gnunet-setup will access your private key as necessary, so you do not
1525have to worry about those. What is important is your public key
1526(or rather, the hash of your public key), as you will likely want to
1527give it to others so that they can securely link to you.
1528
1529You can usually get the hash of your public key using
1530
1531@example
1532$ gnunet-identity -d $options | grep master-zone | awk '@{print $3@}'
1533@end example
1534
1535@noindent
1536For example, the output might be something like:
1537
1538@example
1539DC3SEECJORPHQNVRH965A6N74B1M37S721IG4RBQ15PJLLPJKUE0
1540@end example
1541
1542@noindent
1543Alternatively, you can obtain a QR code with your zone key AND
1544your pseudonym from gnunet-gtk. The QR code is displayed in the
1545GNS tab and can be stored to disk using the Save as button next
1546to the image.
1547
1548@node Adding Links to Other Zones
1549@subsection Adding Links to Other Zones
1550
1551
1552A central operation in GNS is the ability to securely delegate to
1553other zones. Basically, by adding a delegation you make all of the
1554names from the other zone available to yourself. This section
1555describes how to create delegations.
1556
1557Suppose you have a friend who you call 'bob' who also uses GNS.
1558You can then delegate resolution of names to Bob's zone by adding
1559a PKEY record to their local zone:
1560
1561@example
1562$ gnunet-namestore -a -n bob --type PKEY -V XXXX -e never
1563@end example
1564
1565@noindent
1566Note that XXXX in the command above must be replaced with the
1567hash of Bob's public key (the output your friend obtained using
1568the gnunet-identity command from the previous section and told you,
1569for example by giving you a business card containing this
1570information as a QR code).
1571
1572Assuming Bob has an A record for their website under the name of
1573www in his zone, you can then access Bob's website under
1574www.bob.gnu --- as well as any (public) GNS record that Bob has
1575in their zone by replacing www with the respective name of the
1576record in Bob's zone.
1577
1578@c themselves? themself?
1579Furthermore, if Bob has themselves a (public) delegation to Carol's
1580zone under "carol", you can access Carol's records under
1581NAME.carol.bob.gnu (where NAME is the name of Carol's record you
1582want to access).
1583
1584@node The Three Local Zones of GNS
1585@subsection The Three Local Zones of GNS
1586
1587Each user GNS has control over three zones. Each of the zones
1588has a different purpose. These zones are the
1589
1590@itemize @bullet
1591
1592@item master zone,
1593@item private zone, and the
1594@item shorten zone.
1595@end itemize
1596
1597@node The Master Zone
1598@subsection The Master Zone
1599
1600
1601The master zone is your personal TLD. Names within the @code{.gnu}
1602namespace are resolved relative to this zone. You can arbitrarily
1603add records to this zone and selectively publish those records.
1604
1605@node The Private Zone
1606@subsection The Private Zone
1607
1608
1609The private zone is a subzone (or subdomain in DNS terms) of your
1610master zone. It should be used for records that you want to keep
1611private. For example @code{bank.private.gnu}. The key idea is that
1612you want to keep your private records separate, if just to know
1613that those names are not available to other users.
1614
1615@node The Shorten Zone
1616@subsection The Shorten Zone
1617
1618
1619The shorten zone can either be a subzone of the master zone or the
1620private zone. It is different from the other zones in that GNS
1621will automatically populate this zone with other users' zones based
1622on their PSEU records whenever you resolve a name.
1623
1624For example if you go to
1625@code{@uref{http://www.bob.alice.dave.gnu/, www.bob.alice.dave.gnu}},
1626GNS will try to import @code{bob} into your shorten zone. Having
1627obtained Bob's PKEY from @code{alice.dave.gnu}, GNS will lookup the
1628PSEU record for @code{+} in Bob's zone. If it exists and the specified
1629pseudonym is not taken, Bob's PKEY will be automatically added under
1630that pseudonym (i.e. "bob") into your shorten zone. From then on,
1631Bob's webpage will also be available for you as
1632@code{@uref{http://www.bob.short.gnu/, www.bob.short.gnu}}.
1633This feature is called @b{automatic name shortening} and is supposed to
1634keep GNS names as short and memorable as possible.
1635
1636@node The ZKEY Top Level Domain in GNS
1637@subsection The ZKEY Top Level Domain in GNS
1638
1639
1640GNS also provides a secure and globally unique namespace under the .zkey
1641top-level domain. A name in the .zkey TLD corresponds to the (printable)
1642public key of a zone. Names in the .zkey TLD are then resolved by querying
1643the respective zone. The .zkey TLD is expected to be used under rare
1644circumstances where globally unique names are required and for
1645integration with legacy systems.
1646
1647@node Resource Records in GNS
1648@subsection Resource Records in GNS
1649
1650
1651GNS supports the majority of the DNS records as defined in
1652@uref{http://www.ietf.org/rfc/rfc1035.txt, RFC 1035}. Additionally,
1653GNS defines some new record types the are unique to the GNS system.
1654For example, GNS-specific resource records are used to give petnames
1655for zone delegation, revoke zone keys and provide some compatibility
1656features.
1657
1658For some DNS records, GNS does extended processing to increase their
1659usefulness in GNS. In particular, GNS introduces special names
1660referred to as "zone relative names". Zone relative names are allowed
1661in some resource record types (for example, in NS and CNAME records)
1662and can also be used in links on webpages. Zone relative names end
1663in ".+" which indicates that the name needs to be resolved relative
1664to the current authoritative zone. The extended processing of those
1665names will expand the ".+" with the correct delegation chain to the
1666authoritative zone (replacing ".+" with the name of the location
1667where the name was encountered) and hence generate a
1668valid @code{.gnu} name.
1669
1670GNS currently supports the following record types:
1671
1672@menu
1673* NICK::
1674* PKEY::
1675* BOX::
1676* LEHO::
1677* VPN::
1678* A AAAA and TXT::
1679* CNAME::
1680* GNS2DNS::
1681* SOA SRV PTR and MX::
1682@end menu
1683
1684@node NICK
1685@subsubsection NICK
1686
1687A NICK record is used to give a zone a name. With a NICK record, you can
1688essentially specify how you would like to be called. GNS expects this
1689record under the name "+" in the zone's database (NAMESTORE); however,
1690it will then automatically be copied into each record set, so that
1691clients never need to do a separate lookup to discover the NICK record.
1692
1693@b{Example}@
1694
1695@example
1696Name: +; RRType: NICK; Value: bob
1697@end example
1698
1699@noindent
1700This record in Bob's zone will tell other users that this zone wants
1701to be referred to as 'bob'. Note that nobody is obliged to call Bob's
1702zone 'bob' in their own zones. It can be seen as a
1703recommendation ("Please call me 'bob'").
1704
1705@node PKEY
1706@subsubsection PKEY
1707
1708PKEY records are used to add delegation to other users' zones and
1709give those zones a petname.
1710
1711@b{Example}@
1712
1713Let Bob's zone be identified by the hash "ABC012". Bob is your friend
1714so you want to give them the petname "friend". Then you add the
1715following record to your zone:
1716
1717@example
1718Name: friend; RRType: PKEY; Value: ABC012;
1719@end example
1720
1721@noindent
1722This will allow you to resolve records in bob's zone
1723under "*.friend.gnu".
1724
1725@node BOX
1726@subsubsection BOX
1727
1728BOX records are there to integrate information from TLSA or
1729SRV records under the main label. In DNS, TLSA and SRV records
1730use special names of the form @code{_port._proto.(label.)*tld} to
1731indicate the port number and protocol (i.e. tcp or udp) for which
1732the TLSA or SRV record is valid. This causes various problems, and
1733is elegantly solved in GNS by integrating the protocol and port
1734numbers together with the respective value into a "BOX" record.
1735Note that in the GUI, you do not get to edit BOX records directly
1736right now --- the GUI will provide the illusion of directly
1737editing the TLSA and SRV records, even though they internally
1738are BOXed up.
1739
1740@node LEHO
1741@subsubsection LEHO
1742
1743The LEgacy HOstname of a server. Some webservers expect a specific
1744hostname to provide a service (virtiual hosting). Also SSL
1745certificates usually contain DNS names. To provide the expected
1746legacy DNS name for a server, the LEHO record can be used.
1747To mitigate the just mentioned issues the GNS proxy has to be used.
1748The GNS proxy will use the LEHO information to apply the necessary
1749transformations.
1750
1751@node VPN
1752@subsubsection VPN
1753
1754GNS allows easy access to services provided by the GNUnet Virtual Public
1755Network. When the GNS resolver encounters a VPN record it will contact
1756the VPN service to try and allocate an IPv4/v6 address (if the queries
1757record type is an IP address) that can be used to contact the service.
1758
1759@b{Example}@
1760
1761I want to provide access to the VPN service "web.gnu." on port 80 on peer
1762ABC012:@
1763Name: www; RRType: VPN; Value: 80 ABC012 web.gnu.
1764
1765The peer ABC012 is configured to provide an exit point for the service
1766"web.gnu." on port 80 to it's server running locally on port 8080 by
1767having the following lines in the @file{gnunet.conf} configuration file:
1768
1769@example
1770[web.gnunet.]
1771TCP_REDIRECTS = 80:localhost4:8080
1772@end example
1773
1774@node A AAAA and TXT
1775@subsubsection A AAAA and TXT
1776
1777Those records work in exactly the same fashion as in traditional DNS.
1778
1779@node CNAME
1780@subsubsection CNAME
1781
1782As specified in RFC 1035 whenever a CNAME is encountered the query
1783needs to be restarted with the specified name. In GNS a CNAME
1784can either be:
1785
1786@itemize @bullet
1787@item A zone relative name,
1788@item A zkey name or
1789@item A DNS name (in which case resolution will continue outside
1790of GNS with the systems DNS resolver)
1791@end itemize
1792
1793@node GNS2DNS
1794@subsubsection GNS2DNS
1795
1796GNS can delegate authority to a legacy DNS zone. For this, the
1797name of the DNS nameserver and the name of the DNS zone are
1798specified in a GNS2DNS record.
1799
1800@b{Example}
1801
1802@example
1803Name: pet; RRType: GNS2DNS; Value: gnunet.org@@a.ns.joker.com
1804@end example
1805
1806@noindent
1807Any query to @code{pet.gnu} will then be delegated to the DNS server at
1808@code{a.ns.joker.com}. For example,
1809@code{@uref{http://www.pet.gnu/, www.pet.gnu}} will result in a DNS query
1810for @code{@uref{http://www.gnunet.org/, www.gnunet.org}} to the server
1811at @code{a.ns.joker.com}. Delegation to DNS via NS records in GNS can
1812be useful if you do not want to start resolution in the DNS root zone
1813(due to issues such as censorship or availability).
1814
1815Note that you would typically want to use a relative name for the
1816nameserver, i.e.
1817
1818@example
1819Name: pet; RRType: GNS2DNS; Value: gnunet.org@@ns-joker.+@
1820Name: ns-joker; RRType: A; Value: 184.172.157.218
1821@end example
1822
1823@noindent
1824This way, you can avoid involving the DNS hierarchy in the resolution of
1825@code{a.ns.joker.com}. In the example above, the problem may not be
1826obvious as the nameserver for "gnunet.org" is in the ".com" zone.
1827However, imagine the nameserver was "ns.gnunet.org". In this case,
1828delegating to "ns.gnunet.org" would mean that despite using GNS,
1829censorship in the DNS ".org" zone would still be effective.
1830
1831@node SOA SRV PTR and MX
1832@subsubsection SOA SRV PTR and MX
1833
1834The domain names in those records can, again, be either
1835
1836@itemize @bullet
1837@item A zone relative name,
1838@item A zkey name or
1839@item A DNS name
1840@end itemize
1841
1842The resolver will expand the zone relative name if possible.
1843Note that when using MX records within GNS, the target mail
1844server might still refuse to accept e-mails to the resulting
1845domain as the name might not match. GNS-enabled mail clients
1846should use the ZKEY zone as the destination hostname and
1847GNS-enabled mail servers should be configured to accept
1848e-mails to the ZKEY-zones of all local users.
1849
1850@node Using the Virtual Public Network
1851@section Using the Virtual Public Network
1852
1853@menu
1854* Setting up an Exit node::
1855* Fedora and the Firewall::
1856* Setting up VPN node for protocol translation and tunneling::
1857@end menu
1858
1859Using the GNUnet Virtual Public Network (VPN) application you can
1860tunnel IP traffic over GNUnet. Moreover, the VPN comes
1861with built-in protocol translation and DNS-ALG support, enabling
1862IPv4-to-IPv6 protocol translation (in both directions).
1863This chapter documents how to use the GNUnet VPN.
1864
1865The first thing to note about the GNUnet VPN is that it is a public
1866network. All participating peers can participate and there is no
1867secret key to control access. So unlike common virtual private
1868networks, the GNUnet VPN is not useful as a means to provide a
1869"private" network abstraction over the Internet. The GNUnet VPN
1870is a virtual network in the sense that it is an overlay over the
1871Internet, using its own routing mechanisms and can also use an
1872internal addressing scheme. The GNUnet VPN is an Internet
1873underlay --- TCP/IP applications run on top of it.
1874
1875The VPN is currently only supported on GNU/Linux systems.
1876Support for operating systems that support TUN (such as FreeBSD)
1877should be easy to add (or might not even require any coding at
1878all --- we just did not test this so far). Support for other
1879operating systems would require re-writing the code to create virtual
1880network interfaces and to intercept DNS requests.
1881
1882The VPN does not provide good anonymity. While requests are routed
1883over the GNUnet network, other peers can directly see the source
1884and destination of each (encapsulated) IP packet. Finally, if you
1885use the VPN to access Internet services, the peer sending the
1886request to the Internet will be able to observe and even alter
1887the IP traffic. We will discuss additional security implications
1888of using the VPN later in this chapter.
1889
1890@node Setting up an Exit node
1891@subsection Setting up an Exit node
1892
1893Any useful operation with the VPN requires the existence of an exit
1894node in the GNUnet Peer-to-Peer network. Exit functionality can only
1895be enabled on peers that have regular Internet access. If you want
1896to play around with the VPN or support the network, we encourage
1897you to setup exit nodes. This chapter documents how to setup an
1898exit node.
1899
1900There are four types of exit functions an exit node can provide,
1901and using the GNUnet VPN to access the Internet will only work
1902nicely if the first three types are provided somewhere in
1903the network. The four exit functions are:
1904
1905@itemize @bullet
1906@item DNS: allow other peers to use your DNS resolver
1907@item IPv4: allow other peers to access your IPv4 Internet connection
1908@item IPv6: allow other peers to access your IPv6 Internet connection
1909@item Local service: allow other peers to access a specific TCP or
1910UDP service your peer is providing
1911@end itemize
1912
1913By enabling "exit" in gnunet-setup and checking the respective boxes
1914in the "exit" tab, you can easily choose which of the above exit
1915functions you want to support.
1916
1917Note, however, that by supporting the first three functions you will
1918allow arbitrary other GNUnet users to access the Internet via your
1919system. This is somewhat similar to running a Tor exit node. The
1920Torproject has a nice article about what to consider if you want
1921to do this here. We believe that generally running a DNS exit node
1922is completely harmless.
1923
1924The exit node configuration does currently not allow you to restrict the
1925Internet traffic that leaves your system. In particular, you cannot
1926exclude SMTP traffic (or block port 25) or limit to HTTP traffic using
1927the GNUnet configuration. However, you can use your host firewall to
1928restrict outbound connections from the virtual tunnel interface. This
1929is highly recommended. In the future, we plan to offer a wider range
1930of configuration options for exit nodes.
1931
1932Note that by running an exit node GNUnet will configure your kernel
1933to perform IP-forwarding (for IPv6) and NAT (for IPv4) so that the
1934traffic from the virtual interface can be routed to the Internet.
1935In order to provide an IPv6-exit, you need to have a subnet routed
1936to your host's external network interface and assign a subrange of
1937that subnet to the GNUnet exit's TUN interface.
1938
1939When running a local service, you should make sure that the local
1940service is (also) bound to the IP address of your EXIT interface
1941(i.e. 169.254.86.1). It will NOT work if your local service is
1942just bound to loopback. You may also want to create a "VPN" record
1943in your zone of the GNU Name System to make it easy for others to
1944access your service via a name instead of just the full service
1945descriptor. Note that the identifier you assign the service can
1946serve as a passphrase or shared secret, clients connecting to the
1947service must somehow learn the service's name. VPN records in the
1948GNU Name System can make this easier.
1949
1950@node Fedora and the Firewall
1951@subsection Fedora and the Firewall
1952
1953
1954When using an exit node on Fedora 15, the standard firewall can
1955create trouble even when not really exiting the local system!
1956For IPv4, the standard rules seem fine. However, for IPv6 the
1957standard rules prohibit traffic from the network range of the
1958virtual interface created by the exit daemon to the local IPv6
1959address of the same interface (which is essentially loopback
1960traffic, so you might suspect that a standard firewall would
1961leave this traffic alone). However, as somehow for IPv6 the
1962traffic is not recognized as originating from the local
1963system (and as the connection is not already "established"),
1964the firewall drops the traffic. You should still get ICMPv6
1965packets back, but that's obviously not very useful.
1966
1967Possible ways to fix this include disabling the firewall (do you
1968have a good reason for having it on?) or disabling the firewall
1969at least for the GNUnet exit interface (or the respective
1970IPv4/IPv6 address range). The best way to diagnose these kinds
1971of problems in general involves setting the firewall to REJECT
1972instead of DROP and to watch the traffic using wireshark
1973(or tcpdump) to see if ICMP messages are generated when running
1974some tests that should work.
1975
1976@node Setting up VPN node for protocol translation and tunneling
1977@subsection Setting up VPN node for protocol translation and tunneling
1978
1979
1980The GNUnet VPN/PT subsystem enables you to tunnel IP traffic over the
1981VPN to an exit node, from where it can then be forwarded to the
1982Internet. This section documents how to setup VPN/PT on a node.
1983Note that you can enable both the VPN and an exit on the same peer.
1984In this case, IP traffic from your system may enter your peer's VPN
1985and leave your peer's exit. This can be useful as a means to do
1986protocol translation. For example, you might have an application that
1987supports only IPv4 but needs to access an IPv6-only site. In this case,
1988GNUnet would perform 4to6 protocol translation between the VPN (IPv4)
1989and the Exit (IPv6). Similarly, 6to4 protocol translation is also
1990possible. However, the primary use for GNUnet would be to access
1991an Internet service running with an IP version that is not supported
1992by your ISP. In this case, your IP traffic would be routed via GNUnet
1993to a peer that has access to the Internet with the desired IP version.
1994
1995Setting up an entry node into the GNUnet VPN primarily requires you
1996to enable the "VPN/PT" option in "gnunet-setup". This will launch the
1997"gnunet-service-vpn", "gnunet-service-dns" and "gnunet-daemon-pt"
1998processes. The "gnunet-service-vpn" will create a virtual interface
1999which will be used as the target for your IP traffic that enters the
2000VPN. Additionally, a second virtual interface will be created by
2001the "gnunet-service-dns" for your DNS traffic. You will then need to
2002specify which traffic you want to tunnel over GNUnet. If your ISP only
2003provides you with IPv4 or IPv6-access, you may choose to tunnel the
2004other IP protocol over the GNUnet VPN. If you do not have an ISP
2005(and are connected to other GNUnet peers via WLAN), you can also
2006choose to tunnel all IP traffic over GNUnet. This might also provide
2007you with some anonymity. After you enable the respective options
2008and restart your peer, your Internet traffic should be tunneled
2009over the GNUnet VPN.
2010
2011The GNUnet VPN uses DNS-ALG to hijack your IP traffic. Whenever an
2012application resolves a hostname (i.e. 'gnunet.org'), the
2013"gnunet-daemon-pt" will instruct the "gnunet-service-dns" to intercept
2014the request (possibly route it over GNUnet as well) and replace the
2015normal answer with an IP in the range of the VPN's interface.
2016"gnunet-daemon-pt" will then tell "gnunet-service-vpn" to forward all
2017traffic it receives on the TUN interface via the VPN to the original
2018destination.
2019
2020For applications that do not use DNS, you can also manually create
2021such a mapping using the gnunet-vpn command-line tool. Here, you
2022specfiy the desired address family of the result (i.e. "-4"), and the
2023intended target IP on the Internet ("-i 131.159.74.67") and
2024"gnunet-vpn" will tell you which IP address in the range of your
2025VPN tunnel was mapped.
2026
2027@command{gnunet-vpn} can also be used to access "internal" services
2028offered by GNUnet nodes. So if you happen to know a peer and a
2029service offered by that peer, you can create an IP tunnel to
2030that peer by specifying the peer's identity, service name and
2031protocol (--tcp or --udp) and you will again receive an IP address
2032that 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..85b40b17b
--- /dev/null
+++ b/doc/documentation/chapters/vocabulary.texi
@@ -0,0 +1,72 @@
1@node Vocabulary
2@chapter Vocabulary
3
4@menu
5* Definitions abbreviations and acronyms::
6* Words and characters::
7* Technical Assumptions::
8@end menu
9
10Throughout this Reference Manual we will use certain words and characters
11which are listed in this introductionary chapter.
12
13@node Definitions abbreviations and acronyms
14@section Definitions abbreviations and acronyms
15
16@menu
17* Definitions::
18@end menu
19
20@node Definitions
21@subsection Defitions
22
23Throughout this Reference Manual, the following terms and definitions
24apply.
25
26@node Words and characters
27@section Words and characters
28
29@enumerate
30@item
31In chapter Installation Handbook,
32``@command{#}'' in example code blocks describes commands executed as root
33
34@example
35# echo "I am root"
36I am root
37@end example
38
39@item
40However, in the chapter GNUnet C Tutorial
41``@command{#}'' in example code blocks describes commands, ie comments.
42
43@example
44# Do the foobar thing:
45$ make foobar
46@end example
47
48@item
49Dollarsign ``@command{$}'' in example code blocks describes commands you
50execute as unprivileged users.
51
52@example
53$ cd foo; ./configure --example-switch
54@end example
55
56@item
57Backslash ``@command{\}'' describes linebreaks.
58
59@example
60./configure --foo --bar --baz \
61 --short-loop
62@end example
63
64...expands to @code{./configure --foo --bar --baz --short-loop}
65
66@end enumerate
67
68@node Technical Assumptions
69@section Technical Assumptions
70
71@c Is it really assuming Bash (ie Bash extensions of POSIX being used)?
72The 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..f39c7de64
--- /dev/null
+++ b/doc/documentation/gnunet-c-tutorial.texi
@@ -0,0 +1,1540 @@
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
163@b{Note:}@
164@b{The pub key to sign the 0.10.1 release has been
165revoked}. You will get an error message stating that
166@b{there is no known public key or that it has been revoked}.
167The next release of GNUnet will have a valid signature
168again. We are sorry for the inconvenience this causes.
169Another possible source you could use is our
170"gnunet" git repository which has mandatory signed commits
171by every developer.
172
173Now you can extract the tarball and rename the resulting
174directory to @file{gnunet} which we will be using in the
175remainder of this document.
176
177@example
178$ tar xvzf gnunet-@value{VERSION}.tar.gz
179$ mv gnunet-@value{VERSION} gnunet
180$ cd gnunet
181@end example
182
183@noindent
184However, please note that stable versions can be very outdated.
185As a developer you are @b{strongly} encouraged to use the version
186from @uref{https://gnunet.org/git/, git}.
187
188@node Installing Build Tool Chain and Dependencies
189@section Installing Build Tool Chain and Dependencies
190
191To successfully compile GNUnet, you need the tools to build GNUnet and
192the required dependencies. Please take a look at the
193GNUnet Reference Documentation
194(@pxref{Dependencies, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation})
195for a list of required dependencies
196and
197(@pxref{Generic installation instructions, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation})
198read its Installation chapter for specific instructions for
199your operating system.
200Please check the notes at the end of the configure process about
201required dependencies.
202
203For GNUnet bootstrapping support and the HTTP(S) plugin you should
204install @uref{https://gnunet.org/gnurl, libgnurl}.
205For the filesharing service you should install at least one of the
206datastore backends. MySQL, SQlite and PostgreSQL are supported.
207
208@node Obtaining the latest version from Git
209@section Obtaining the latest version from Git
210
211The latest development version can obtained from our Git repository.
212To obtain the code you need to have @code{Git} installed, which is
213required for obtaining the repository via:
214
215@example
216$ git clone https://gnunet.org/git/gnunet
217@end example
218
219@noindent
220After cloning the repository you have to execute the @file{bootstrap}
221script in the new directory:
222
223@example
224$ cd gnunet
225$ ./bootstrap
226@end example
227
228@noindent
229The remainder of this tutorial will assume that you have the
230Git branch ``master'' checked out.
231
232@node Compiling and Installing GNUnet
233@section Compiling and Installing GNUnet
234
235Note: This section is a duplication of the more in depth
236@pxref{GNUnet Installation Handbook, The GNUnet Reference Documentation,, gnunet, The GNUnet Reference Documentation}.
237
238First, you need to install libgnupgerror @geq{} 1.27 and
239libgcrypt @geq{} 1.7.6:
240
241@example
242$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
243$ wget $GNUPGFTP/libgpg-error/libgpg-error-1.27.tar.bz2
244$ tar xf libgpg-error-1.27.tar.bz2
245$ cd libgpg-error-1.27
246$ ./configure
247$ sudo make install
248$ cd ..
249@end example
250
251@example
252$ export GNUPGFTP="https://www.gnupg.org/ftp/gcrypt"
253$ wget $GNUPGFTP/libgcrypt/libgcrypt-1.7.6.tar.bz2
254$ tar xf libgcrypt-1.7.6.tar.bz2
255$ cd libgcrypt-1.7.6
256$ ./configure
257$ sudo make install
258$ cd ..
259@end example
260
261@menu
262* Installation::
263@end menu
264
265@node Installation
266@subsection Installation
267Assuming all dependencies are installed, the following commands will
268compile and install GNUnet in your home directory. You can specify the
269directory where GNUnet will be installed by changing the
270@code{--prefix} value when calling @command{./configure}. If
271you do not specifiy a prefix, GNUnet is installed in the directory
272@file{/usr/local}. When developing new applications you may want
273to enable verbose logging by adding @code{--enable-logging=verbose}:
274
275@example
276$ ./configure --prefix=$PREFIX --enable-logging
277$ make
278$ make install
279@end example
280
281@noindent
282After installing GNUnet you have to add your GNUnet installation
283to your path environmental variable. In addition you have to
284create the @file{.config} directory in your home directory
285(unless it already exists) where GNUnet stores its data and an
286empty GNUnet configuration file:
287
288@example
289$ export PATH=$PATH:$PREFIX/bin
290$ echo export PATH=$PREFIX/bin:\\$PATH >> ~/.bashrc
291$ mkdir ~/.config/
292$ touch ~/.config/gnunet.conf
293@end example
294
295@node Common Issues - Check your GNUnet installation
296@section Common Issues - Check your GNUnet installation
297
298You should check your installation to ensure that installing GNUnet
299was successful up to this point. You should be able to access GNUnet's
300binaries and run GNUnet's self check.
301
302@example
303$ which gnunet-arm
304@end example
305
306@noindent
307should return $PREFIX/bin/gnunet-arm. It should be located in your
308GNUnet installation and the output should not be empty.
309If you see an output like:
310
311@example
312$ which gnunet-arm
313@end example
314
315@noindent
316check your PATH variable to ensure GNUnet's @file{bin} directory is
317included.
318
319GNUnet provides tests for all of its subcomponents. Run
320
321@example
322$ make check
323@end example
324
325@noindent
326to execute tests for all components. @command{make check} traverses all
327subdirectories in @file{src}. For every subdirectory you should
328get a message like this:
329
330@example
331make[2]: Entering directory `/home/$USER/gnunet/contrib'
332PASS: test_gnunet_prefix
333=============
3341 test passed
335=============
336@end example
337
338@node Introduction to GNUnet Architecture
339@chapter Introduction to GNUnet Architecture
340
341GNUnet is organized in layers and services. Each service is composed of a
342main service implementation and a client library for other programs to use
343the service's functionality, described by an API.
344@c This approach is shown in
345@c FIXME: enable this once the commented block below works:
346@c figure~\ref fig:service.
347Some services provide an additional command line tool to enable the user
348to interact with the service.
349
350Very often it is other GNUnet services that will use these APIs to build
351the higher layers of GNUnet on top of the lower ones. Each layer expands
352or extends the functionality of the service below (for instance, to build
353a mesh on top of a DHT).
354@c FXIME: See comment above.
355@c See figure ~\ref fig:interaction for an illustration of this approach.
356
357@c ** @image filename[, width[, height[, alttext[, extension]]]]
358@c FIXME: Texlive (?) 20112 makes the assumption that this means
359@c 'images/OBJECTNAME.txt' but later versions of it (2017) use this
360@c syntax as described below.
361@c TODO: Checkout the makedoc script Guile uses.
362
363@c FIXME!!!
364@c @image{images/gnunet-tutorial-service,,5in,Service with API and network protocol,.png}
365@c @image{images/gnunet-tutorial-system,,5in,The layered system architecture of GNUnet,.png}
366
367@c \begin{figure}[!h]
368@c \begin{center}
369@c % \begin{subfigure}
370@c \begin{subfigure}[b]{0.3\textwidth}
371@c \centering
372@c \includegraphics[width=\textwidth]{figs/Service.pdf}
373@c \caption{Service with API and network protocol}
374@c \label{fig:service}
375@c \end{subfigure}
376@c ~~~~~~~~~~
377@c \begin{subfigure}[b]{0.3\textwidth}
378@c \centering
379@c \includegraphics[width=\textwidth]{figs/System.pdf}
380@c \caption{Service interaction}
381@c \label{fig:interaction}
382@c \end{subfigure}
383@c \end{center}
384@c \caption{GNUnet's layered system architecture}
385@c \end{figure}
386
387The main service implementation runs as a standalone process in the
388operating system and the client code runs as part of the client program,
389so crashes of a client do not affect the service process or other clients.
390The service and the clients communicate via a message protocol to be
391defined and implemented by the programmer.
392
393@node First Steps with GNUnet
394@chapter First Steps with GNUnet
395
396@menu
397* Configure your peer::
398* Start a peer::
399* Monitor a peer::
400* Starting Two Peers by Hand::
401* Starting Peers Using the Testbed Service::
402@end menu
403
404@node Configure your peer
405@section Configure your peer
406
407First of all we need to configure your peer. Each peer is started with
408a configuration containing settings for GNUnet itself and its services.
409This configuration is based on the default configuration shipped with
410GNUnet and can be modified. The default configuration is located in the
411@file{$PREFIX/share/gnunet/config.d} directory. When starting a peer, you
412can specify a customized configuration using the the @command{-c} command
413line switch when starting the ARM service and all other services. When
414using a modified configuration the default values are loaded and only
415values specified in the configuration file will replace the default
416values.
417
418Since we want to start additional peers later, we need some modifications
419from the default configuration. We need to create a separate service
420home and a file containing our modifications for this peer:
421
422@example
423$ mkdir ~/gnunet1/
424$ touch peer1.conf
425@end example
426
427@noindent
428Now add the following lines to @file{peer1.conf} to use this directory.
429For simplified usage we want to prevent the peer to connect to the GNUnet
430network since this could lead to confusing output. This modifications
431will replace the default settings:
432
433@example
434[PATHS]
435# Use this directory to store GNUnet data
436GNUNET_HOME = ~/gnunet1/
437[hostlist]
438# prevent bootstrapping
439SERVERS =
440@end example
441
442@node Start a peer
443@section Start a peer
444Each GNUnet instance (called peer) has an identity (peer ID) based on a
445cryptographic public private key pair. The peer ID is the printable hash
446of the public key.
447
448GNUnet services are controlled by a master service, the so called
449@dfn{Automatic Restart Manager} (ARM). ARM starts, stops and even
450restarts services automatically or on demand when a client connects.
451You interact with the ARM service using the @command{gnunet-arm} tool.
452GNUnet can then be started with @command{gnunet-arm -s} and stopped with
453@command{gnunet-arm -e}. An additional service not automatically started
454can be started using @command{gnunet-arm -i <service name>} and stopped
455using @command{gnunet-arm -k <servicename>}.
456
457Once you have started your peer, you can use many other GNUnet commands
458to interact with it. For example, you can run:
459
460@example
461$ gnunet-peerinfo -s
462@end example
463
464@noindent
465to obtain the public key of your peer.
466
467You should see an output containing the peer ID similar to:
468
469@example
470I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'.
471@end example
472
473@node Monitor a peer
474@section Monitor a peer
475
476In this section, we will monitor the behaviour of our peer's DHT
477service with respect to a specific key. First we will start
478GNUnet and then start the DHT service and use the DHT monitor tool
479to monitor the PUT and GET commands we issue ussing the
480@command{gnunet-dht-put} and @command{gnunet-dht-get} commands.
481Using the ``monitor'' line given below, you can observe the behavior
482of your own peer's DHT with respect to the specified KEY:
483
484@example
485# start gnunet with all default services:
486$ gnunet-arm -c ~/peer1.conf -s
487# start DHT service:
488$ gnunet-arm -c ~/peer1.conf -i dht
489$ cd ~/gnunet/src/dht;
490$ ./gnunet-dht-monitor -c ~/peer1.conf -k KEY
491@end example
492
493@noindent
494Now open a separate terminal and change again to
495the @file{gnunet/src/dht} directory:
496
497@example
498$ cd ~/gnunet/src/dht
499# put VALUE under KEY in the DHT:
500$ ./gnunet-dht-put -c ~/peer1.conf -k KEY -d VALUE
501# get key KEY from the DHT:
502$ ./gnunet/src/dht/gnunet-dht-get -c ~/peer1.conf -k KEY
503# print statistics about current GNUnet state:
504$ gnunet-statistics -c ~/peer1.conf
505# print statistics about DHT service:
506$ gnunet-statistics -c ~/peer1.conf -s dht
507@end example
508
509@node Starting Two Peers by Hand
510@section Starting Two Peers by Hand
511
512This section describes how to start two peers on the same machine by hand.
513The process is rather painful, but the description is somewhat
514instructive. In practice, you might prefer the automated method
515(@pxref{Starting Peers Using the Testbed Service}).
516
517@menu
518* Setup a second peer::
519* Start the second peer and connect the peers::
520* How to connect manually::
521@end menu
522
523@node Setup a second peer
524@subsection Setup a second peer
525We will now start a second peer on your machine.
526For the second peer, you will need to manually create a modified
527configuration file to avoid conflicts with ports and directories.
528A peers configuration file is by default located
529in @file{~/.gnunet/gnunet.conf}. This file is typically very short
530or even empty as only the differences to the defaults need to be
531specified. The defaults are located in many files in the
532@file{$PREFIX/share/gnunet/config.d} directory.
533
534To configure the second peer, use the files
535@file{$PREFIX/share/gnunet/config.d} as a template for your main
536configuration file:
537
538@example
539$ cat $PREFIX/share/gnunet/config.d/*.conf > peer2.conf
540@end example
541
542@noindent
543Now you have to edit @file{peer2.conf} and change:
544
545@itemize
546@item @code{GNUNET\_TEST\_HOME} under @code{PATHS}
547@item Every (uncommented) value for ``@code{PORT}'' (add 10000) in any
548section (the option may be commented out if @code{PORT} is
549prefixed by "\#", in this case, UNIX domain sockets are used
550and the PORT option does not need to be touched)
551@item Every value for ``@code{UNIXPATH}'' in any section
552(e.g. by adding a "-p2" suffix)
553@end itemize
554
555to a fresh, unique value. Make sure that the PORT numbers stay
556below 65536. From now on, whenever you interact with the second peer,
557you need to specify @command{-c peer2.conf} as an additional
558command line argument.
559
560Now, generate the 2nd peer's private key:
561
562@example
563$ gnunet-peerinfo -s -c peer2.conf
564@end example
565
566@noindent
567This may take a while, generate entropy using your keyboard or mouse
568as needed. Also, make sure the output is different from the
569gnunet-peerinfo output for the first peer (otherwise you made an
570error in the configuration).
571
572@node Start the second peer and connect the peers
573@subsection Start the second peer and connect the peers
574
575Then, you can start a second peer using:
576
577@example
578$ gnunet-arm -c peer2.conf -s
579$ gnunet-arm -c peer2.conf -i dht
580$ ~/gnunet/src/dht/gnunet-dht-put -c peer2.conf -k KEY -d VALUE
581$ ~/gnunet/src/dht/gnunet-dht-get -c peer2.conf -k KEY
582@end example
583
584If you want the two peers to connect, you have multiple options:
585
586@itemize
587@item UDP neighbour discovery (automatic)
588@item Setup a bootstrap server
589@item Connect manually
590@end itemize
591
592To setup peer 1 as bootstrapping server change the configuration of
593the first one to be a hostlist server by adding the following lines to
594@file{peer1.conf} to enable bootstrapping server:
595
596@example
597[hostlist]
598OPTIONS = -p
599@end example
600
601@noindent
602Then change @file{peer2.conf} and replace the ``@code{SERVERS}''
603line in the ``@code{[hostlist]}'' section with
604``@code{http://localhost:8080/}''. Restart both peers using:
605
606@example
607# stop first peer
608$ gnunet-arm -c peer1.conf -e
609# start first peer
610$ gnunet-arm -c peer1.conf -s
611# start second peer
612$ gnunet-arm -c peer2.conf -s
613@end example
614
615@noindent
616Note that if you start your peers without changing these settings, they
617will use the ``global'' hostlist servers of the GNUnet P2P network and
618likely connect to those peers. At that point, debugging might become
619tricky as you're going to be connected to many more peers and would
620likely observe traffic and behaviors that are not explicitly controlled
621by you.
622
623@node How to connect manually
624@subsection How to connect manually
625
626If you want to use the @code{peerinfo} tool to connect your
627peers, you should:
628
629@itemize
630@item Set @code{FORCESTART = NO} in section @code{hostlist}
631(to not connect to the global GNUnet)
632@item Start both peers running @command{gnunet-arm -c peer1.conf -s}
633and @command{gnunet-arm -c peer2.conf -s}
634@item Get @code{HELLO} message of the first peer running
635@command{gnunet-peerinfo -c peer1.conf -g}
636@item Give the output to the second peer by running
637@command{gnunet-peerinfo -c peer2.conf -p '<output>'}
638@end itemize
639
640Check that they are connected using @command{gnunet-core -c peer1.conf},
641which should give you the other peer's peer identity:
642
643@example
644$ gnunet-core -c peer1.conf
645Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG'
646@end example
647
648@node Starting Peers Using the Testbed Service
649@section Starting Peers Using the Testbed Service
650@c \label{sec:testbed}
651
652GNUnet's testbed service is used for testing scenarios where
653a number of peers are to be started. The testbed can manage peers
654on a single host or on multiple hosts in a distributed fashion.
655On a single affordable computer, it should be possible to run
656around tens of peers without drastically increasing the load on the
657system.
658
659The testbed service can be access through its API
660@file{include/gnunet\_testbed\_service.h}. The API provides many
661routines for managing a group of peers. It also provides a helper
662function @code{GNUNET\_TESTBED\_test\_run()} to quickly setup a
663minimalistic testing environment on a single host.
664
665This function takes a configuration file which will be used as a
666template configuration for the peers. The testbed takes care of
667modifying relevant options in the peers' configuration such as
668@code{SERVICEHOME}, @code{PORT}, @code{UNIXPATH} to unique values
669so that peers run without running into conflicts. It also checks
670and assigns the ports in configurations only if they are free.
671
672Additionally, the testbed service also reads its options from the
673same configuration file. Various available options and details
674about them can be found in the testbed default configuration file
675@file{src/testbed/testbed.conf}.
676
677With the testbed API, a sample test case can be structured as follows:
678
679@example
680@verbatiminclude testbed_test.c
681@end example
682
683@noindent
684The source code for the above listing can be found at
685@uref{https://gnunet.org/git/gnunet.git/tree/doc/
686documentation/testbed_test.c}
687or in the @file{doc/documentation/} folder of your repository check-out.
688After installing GNUnet, the above source code can be compiled as:
689
690@example
691$ export CPPFLAGS="-I/path/to/gnunet/headers"
692$ export LDFLAGS="-L/path/to/gnunet/libraries"
693$ gcc $CPPFLAGS $LDFLAGS -o testbed-test testbed_test.c \
694 -lgnunettestbed -lgnunetdht -lgnunetutil
695# Generate (empty) configuration
696$ touch template.conf
697# run it (press CTRL-C to stop)
698$ ./testbed-test
699@end example
700
701@noindent
702The @code{CPPFLAGS} and @code{LDFLAGS} are necessary if GNUnet
703is installed into a different directory other than @file{/usr/local}.
704
705All of testbed API's peer management functions treat management
706actions as operations and return operation handles. It is expected
707that the operations begin immediately, but they may get delayed (to
708balance out load on the system). The program using the API then has
709to take care of marking the operation as ``done'' so that its
710associated resources can be freed immediately and other waiting
711operations can be executed. Operations will be canceled if they are
712marked as ``done'' before their completion.
713
714An operation is treated as completed when it succeeds or fails.
715Completion of an operation is either conveyed as events through
716@dfn{controller event callback} or through respective
717@dfn{operation completion callbacks}.
718In functions which support completion notification
719through both controller event callback and operation
720completion callback, first the controller event callback will be
721called. If the operation is not marked as done in that callback
722or if the callback is given as NULL when creating the operation,
723the operation completion callback will be called. The API
724documentation shows which event are to be expected in the
725controller event notifications. It also documents any exceptional
726behaviour.
727
728Once the peers are started, test cases often need to connect
729some of the peers' services. Normally, opening a connect to
730a peer's service requires the peer's configuration. While using
731testbed, the testbed automatically generates per-peer configuration.
732Accessing those configurations directly through file system is
733discouraged as their locations are dynamically created and will be
734different among various runs of testbed. To make access to these
735configurations easy, testbed API provides the function
736@code{GNUNET\_TESTBED\_service\_connect()}. This function fetches
737the configuration of a given peer and calls the @dfn{Connect Adapter}.
738In the example code, it is the @code{dht\_ca}. A connect adapter is
739expected to open the connection to the needed service by using the
740provided configuration and return the created service connection handle.
741Successful connection to the needed service is signaled through
742@code{service\_connect\_comp\_cb}.
743
744A dual to connect adapter is the @dfn{Disconnect Adapter}. This callback
745is called after the connect adapter has been called when the operation
746from @code{GNUNET\_TESTBED\_service\_connect()} is marked as ``done''.
747It has to disconnect from the service with the provided service
748handle (@code{op\_result}).
749
750Exercise: Find out how many peers you can run on your system.
751
752Exercise: Find out how to create a 2D torus topology by changing the
753options in the configuration file.
754@xref{Supported Topologies, The GNUnet Reference Documentation ,, gnunet, The GNUnet Reference Documentation},
755then use the DHT API to store and retrieve values in the network.
756
757@node Developing Applications
758@chapter Developing Applications
759
760@menu
761* gnunet-ext::
762* Adapting the Template::
763* Writing a Client Application::
764* Writing a Service::
765* Interacting directly with other Peers using the CORE Service::
766* Storing peer-specific data using the PEERSTORE service::
767* Using the DHT::
768* Debugging with gnunet-arm::
769@end menu
770
771@node gnunet-ext
772@section gnunet-ext
773To develop a new peer-to-peer application or to extend GNUnet we provide
774a template build system for writing GNUnet extensions in C. It can be
775obtained as follows:
776
777@example
778$ git clone https://gnunet.org/git/gnunet-ext
779$ cd gnunet-ext/
780$ ./bootstrap
781$ ./configure --prefix=$PREFIX --with-gnunet=$PREFIX
782$ make
783$ make install
784$ make check
785@end example
786
787@noindent
788The GNUnet ext template includes examples and a working buildsystem
789for a new GNUnet service. A common GNUnet service consists of the
790following parts which will be discussed in detail in the remainder
791of this document. The functionality of a GNUnet service is implemented in:
792
793@itemize
794@item the GNUnet service (gnunet-ext/src/ext/gnunet-service-ext.c)
795@item the client API (gnunet-ext/src/ext/ext_api.c)
796@item the client application using the service API
797(gnunet-ext/src/ext/gnunet-ext.c)
798@end itemize
799
800The interfaces for these entities are defined in:
801
802@itemize
803@item client API interface (gnunet-ext/src/ext/ext.h)
804@item the service interface (gnunet-ext/src/include/gnunet_service_SERVICE.h)
805@item the P2P protocol (gnunet-ext/src/include/gnunet_protocols_ext.h)
806@end itemize
807
808
809In addition the ext systems provides:
810
811@itemize
812@item a test testing the API (gnunet-ext/src/ext/test_ext_api.c)
813@item a configuration template for the service
814(gnunet-ext/src/ext/ext.conf.in)
815@end itemize
816
817@node Adapting the Template
818@section Adapting the Template
819
820The first step for writing any extension with a new service is to
821ensure that the @file{ext.conf.in} file contains entries for the
822@code{UNIXPATH}, @code{PORT} and @code{BINARY} for the service in a
823section named after the service.
824
825If you want to adapt the template rename the @file{ext.conf.in} to
826match your services name, you have to modify the @code{AC\_OUTPUT}
827section in @file{configure.ac} in the @file{gnunet-ext} root.
828
829@node Writing a Client Application
830@section Writing a Client Application
831
832When writing any client application (for example, a command-line
833tool), the basic structure is to start with the
834@code{GNUNET\_PROGRAM\_run} function. This function will parse
835command-line options, setup the scheduler and then invoke the
836@code{run} function (with the remaining non-option arguments)
837and a handle to the parsed configuration (and the configuration
838file name that was used, which is typically not needed):
839
840@example
841@verbatiminclude tutorial-examples/001.c
842@end example
843
844@menu
845* Handling command-line options::
846* Writing a Client Library::
847* Writing a user interface::
848@end menu
849
850@node Handling command-line options
851@subsection Handling command-line options
852
853Options can then be added easily by adding global variables and
854expanding the @code{options} array. For example, the following would
855add a string-option and a binary flag (defaulting to @code{NULL} and
856@code{GNUNET\_NO} respectively):
857
858@example
859@verbatiminclude tutorial-examples/002.c
860@end example
861
862Issues such as displaying some helpful text describing options using
863the @code{--help} argument and error handling are taken care of when
864using this approach. Other @code{GNUNET\_GETOPT\_}-functions can be used
865to obtain integer value options, increment counters, etc. You can
866even write custom option parsers for special circumstances not covered
867by the available handlers. To check if an argument was specified by the
868user you initialize the variable with a specific value (e.g. NULL for
869a string and GNUNET\_SYSERR for a integer) and check after parsing
870happened if the values were modified.
871
872Inside the @code{run} method, the program would perform the
873application-specific logic, which typically involves initializing and
874using some client library to interact with the service. The client
875library is supposed to implement the IPC whereas the service provides
876more persistent P2P functions.
877
878Exercise: Add a few command-line options and print them inside
879of @code{run}. What happens if the user gives invalid arguments?
880
881@node Writing a Client Library
882@subsection Writing a Client Library
883
884The first and most important step in writing a client library is to
885decide on an API for the library. Typical API calls include
886connecting to the service, performing application-specific requests
887and cleaning up. Many examples for such service APIs can be found
888in the @file{gnunet/src/include/gnunet\_*\_service.h} files.
889
890Then, a client-service protocol needs to be designed. This typically
891involves defining various message formats in a header that will be
892included by both the service and the client library (but is otherwise
893not shared and hence located within the service's directory and not
894installed by @command{make install}). Each message must start with a
895@code{struct GNUNET\_MessageHeader} and must be shorter than 64k. By
896convention, all fields in IPC (and P2P) messages must be in big-endian
897format (and thus should be read using @code{ntohl} and similar
898functions and written using @code{htonl} and similar functions).
899Unique message types must be defined for each message struct in the
900@file{gnunet\_protocols.h} header (or an extension-specific include
901file).
902
903@menu
904* Connecting to the Service::
905* Sending messages::
906* Receiving Replies from the Service::
907@end menu
908
909@node Connecting to the Service
910@subsubsection Connecting to the Service
911
912Before a client library can implement the application-specific protocol
913with the service, a connection must be created:
914
915@example
916@verbatiminclude tutorial-examples/003.c
917@end example
918
919@noindent
920As a result a @code{GNUNET\_MQ\_Handle} is returned
921which can to used henceforth to transmit messages to the service.
922The complete MQ API can be found in @file{gnunet\_mq\_lib.h}.
923The @code{hanlders} array in the example above is incomplete.
924Here is where you will define which messages you expect to
925receive from the service, and which functions handle them.
926The @code{error\_cb} is a function that is to be called whenever
927there are errors communicating with the service.
928
929@node Sending messages
930@subsubsection Sending messages
931
932In GNUnet, messages are always sent beginning with a
933@code{struct GNUNET\_MessageHeader} in big endian format.
934This header defines the size and the type of the
935message, the payload follows after this header.
936
937@example
938@verbatiminclude tutorial-examples/004.c
939@end example
940
941@noindent
942Existing message types are defined in @file{gnunet\_protocols.h}.
943A common way to create a message is with an envelope:
944
945@example
946@verbatiminclude tutorial-examples/005.c
947@end example
948
949@noindent
950Exercise: Define a message struct that includes a 32-bit
951unsigned integer in addition to the standard GNUnet MessageHeader.
952Add a C struct and define a fresh protocol number for your message.
953Protocol numbers in gnunet-ext are defined
954in @file{gnunet-ext/src/include/gnunet_protocols_ext.h}
955
956Exercise: Find out how you can determine the number of messages
957in a message queue.
958
959Exercise: Find out how you can determine when a message you
960have queued was actually transmitted.
961
962Exercise: Define a helper function to transmit a 32-bit
963unsigned integer (as payload) to a service using some given client
964handle.
965
966@node Receiving Replies from the Service
967@subsubsection Receiving Replies from the Service
968
969Clients can receive messages from the service using the handlers
970specified in the @code{handlers} array we specified when connecting
971to the service. Entries in the the array are usually created using
972one of two macros, depending on whether the message is fixed size
973or variable size. Variable size messages are managed using two
974callbacks, one to check that the message is well-formed, the other
975to actually process the message. Fixed size messages are fully
976checked by the MQ-logic, and thus only need to provide the handler
977to process the message. Note that the prefixes @code{check\_}
978and @code{handle\_} are mandatory.
979
980@example
981@verbatiminclude tutorial-examples/006.c
982@end example
983
984@noindent
985Exercise: Expand your helper function to receive a response message
986(for example, containing just the @code{struct GNUnet MessageHeader}
987without any payload). Upon receiving the service's response, you
988should call a callback provided to your helper function's API.
989
990Exercise: Figure out where you can pass values to the
991closures (@code{cls}).
992
993@node Writing a user interface
994@subsection Writing a user interface
995
996Given a client library, all it takes to access a service now is to
997combine calls to the client library with parsing command-line
998options.
999
1000Exercise: Call your client API from your @code{run()} method in your
1001client application to send a request to the service. For example,
1002send a 32-bit integer value based on a number given at the
1003command-line to the service.
1004
1005@node Writing a Service
1006@section Writing a Service
1007
1008Before you can test the client you've written so far, you'll
1009need to also implement the corresponding service.
1010
1011@menu
1012* Code Placement::
1013* Starting a Service::
1014@end menu
1015
1016@node Code Placement
1017@subsection Code Placement
1018
1019New services are placed in their own subdirectory under
1020@file{gnunet/src}. This subdirectory should contain the API
1021implementation file @file{SERVICE\_api.c}, the description of
1022the client-service protocol @file{SERVICE.h} and P2P protocol
1023@file{SERVICE\_protocol.h}, the implementation of the service itself
1024@file{gnunet-service-SERVICE.h} and several files for tests,
1025including test code and configuration files.
1026
1027@node Starting a Service
1028@subsection Starting a Service
1029
1030The key API definition for creating a service is the
1031@code{GNUNET\_SERVICE\_MAIN} macro:
1032
1033@example
1034@verbatiminclude tutorial-examples/007.c
1035@end example
1036
1037@noindent
1038In addition to the service name and flags, the macro takes three
1039functions, typically called @code{run}, @code{client\_connect\_cb} and
1040@code{client\_disconnect\_cb} as well as an array of message handlers
1041that will be called for incoming messages from clients.
1042
1043A minimal version of the three central service funtions would look
1044like this:
1045
1046@example
1047@verbatiminclude tutorial-examples/008.c
1048@end example
1049
1050@noindent
1051Exercise: Write a stub service that processes no messages at all
1052in your code. Create a default configuration for it, integrate it
1053with the build system and start the service from
1054@command{gnunet-service-arm} using @command{gnunet-arm -i NAME}.
1055
1056Exercise: Figure out how to set the closure (@code{cls}) for handlers
1057of a service.
1058
1059Exercise: Figure out how to send messages from the service back to the
1060client.
1061
1062Each handler function in the service @b{must} eventually (possibly in some
1063asynchronous continuation) call
1064@code{GNUNET\_SERVICE\_client\_continue()}. Only after this call
1065additional messages from the same client may
1066be processed. This way, the service can throttle processing messages
1067from the same client.
1068
1069Exercise: Change the service to ``handle'' the message from your
1070client (for now, by printing a message). What happens if you
1071forget to call @code{GNUNET\_SERVICE\_client\_continue()}?
1072
1073@node Interacting directly with other Peers using the CORE Service
1074@section Interacting directly with other Peers using the CORE Service
1075
1076FIXME: This section still needs to be updated to the lastest API!
1077
1078One of the most important services in GNUnet is the @code{CORE} service
1079managing connections between peers and handling encryption between peers.
1080
1081One of the first things any service that extends the P2P protocol
1082typically does is connect to the @code{CORE} service using:
1083
1084@example
1085@verbatiminclude tutorial-examples/009.c
1086@end example
1087
1088@menu
1089* New P2P connections::
1090* Receiving P2P Messages::
1091* Sending P2P Messages::
1092* End of P2P connections::
1093@end menu
1094
1095@node New P2P connections
1096@subsection New P2P connections
1097
1098Before any traffic with a different peer can be exchanged, the peer must
1099be known to the service. This is notified by the @code{CORE}
1100@code{connects} callback, which communicates the identity of the new
1101peer to the service:
1102
1103@example
1104@verbatiminclude tutorial-examples/010.c
1105@end example
1106
1107@noindent
1108Note that whatever you return from @code{connects} is given as the
1109@code{cls} argument to the message handlers for messages from
1110the respective peer.
1111
1112Exercise: Create a service that connects to the @code{CORE}. Then
1113start (and connect) two peers and print a message once your connect
1114callback is invoked.
1115
1116@node Receiving P2P Messages
1117@subsection Receiving P2P Messages
1118
1119To receive messages from @code{CORE}, you pass the desired
1120@code{handlers} to the @code{GNUNET\_CORE\_connect()} function,
1121just as we showed for services.
1122
1123It is your responsibility to process messages fast enough or
1124to implement flow control. If an application does not process
1125CORE messages fast enough, CORE will randomly drop messages
1126to not keep a very long queue in memory.
1127
1128Exercise: Start one peer with a new service that has a message
1129handler and start a second peer that only has your ``old'' service
1130without message handlers. Which ``connect'' handlers are invoked when
1131the two peers are connected? Why?
1132
1133@node Sending P2P Messages
1134@subsection Sending P2P Messages
1135
1136You can transmit messages to other peers using the @code{mq} you were
1137given during the @code{connect} callback. Note that the @code{mq}
1138automatically is released upon @code{disconnect} and that you must
1139not use it afterwards.
1140
1141It is your responsibility to not over-fill the message queue, GNUnet
1142will send the messages roughly in the order given as soon as possible.
1143
1144Exercise: Write a service that upon connect sends messages as
1145fast as possible to the other peer (the other peer should run a
1146service that ``processes'' those messages). How fast is the
1147transmission? Count using the STATISTICS service on both ends. Are
1148messages lost? How can you transmit messages faster? What happens if
1149you stop the peer that is receiving your messages?
1150
1151@node End of P2P connections
1152@subsection End of P2P connections
1153
1154If a message handler returns @code{GNUNET\_SYSERR}, the remote
1155peer shuts down or there is an unrecoverable network
1156disconnection, CORE notifies the service that the peer disconnected.
1157After this notification no more messages will be received from the
1158peer and the service is no longer allowed to send messages to the peer.
1159The disconnect callback looks like the following:
1160
1161@example
1162@verbatiminclude tutorial-examples/011.c
1163@end example
1164
1165@noindent
1166Exercise: Fix your service to handle peer disconnects.
1167
1168@node Storing peer-specific data using the PEERSTORE service
1169@section Storing peer-specific data using the PEERSTORE service
1170
1171GNUnet's PEERSTORE service offers a persistorage for arbitrary
1172peer-specific data. Other GNUnet services can use the PEERSTORE
1173to store, retrieve and monitor data records. Each data record
1174stored with PEERSTORE contains the following fields:
1175
1176@itemize
1177@item subsystem: Name of the subsystem responsible for the record.
1178@item peerid: Identity of the peer this record is related to.
1179@item key: a key string identifying the record.
1180@item value: binary record value.
1181@item expiry: record expiry date.
1182@end itemize
1183
1184The first step is to start a connection to the PEERSTORE service:
1185@example
1186@verbatiminclude tutorial-examples/012.c
1187@end example
1188
1189The service handle @code{peerstore_handle} will be needed for
1190all subsequent PEERSTORE operations.
1191
1192@menu
1193* Storing records::
1194* Retrieving records::
1195* Monitoring records::
1196* Disconnecting from PEERSTORE::
1197@end menu
1198
1199@node Storing records
1200@subsection Storing records
1201
1202To store a new record, use the following function:
1203
1204@example
1205@verbatiminclude tutorial-examples/013.c
1206@end example
1207
1208@noindent
1209The @code{options} parameter can either be
1210@code{GNUNET_PEERSTORE_STOREOPTION_MULTIPLE} which means that multiple
1211values can be stored under the same key combination
1212(subsystem, peerid, key), or @code{GNUNET_PEERSTORE_STOREOPTION_REPLACE}
1213which means that PEERSTORE will replace any existing values under the
1214given key combination (subsystem, peerid, key) with the new given value.
1215
1216The continuation function @code{cont} will be called after the store
1217request is successfully sent to the PEERSTORE service. This does not
1218guarantee that the record is successfully stored, only that it was
1219received by the service.
1220
1221The @code{GNUNET_PEERSTORE_store} function returns a handle to the store
1222operation. This handle can be used to cancel the store operation only
1223before the continuation function is called:
1224
1225@example
1226@verbatiminclude tutorial-examples/013.1.c
1227@end example
1228
1229@node Retrieving records
1230@subsection Retrieving records
1231
1232To retrieve stored records, use the following function:
1233
1234@example
1235@verbatiminclude tutorial-examples/014.c
1236@end example
1237
1238@noindent
1239The values of @code{peer} and @code{key} can be @code{NULL}. This
1240allows the iteration over values stored under any of the following
1241key combinations:
1242
1243@itemize
1244@item (subsystem)
1245@item (subsystem, peerid)
1246@item (subsystem, key)
1247@item (subsystem, peerid, key)
1248@end itemize
1249
1250The @code{callback} function will be called once with each retrieved
1251record and once more with a @code{NULL} record to signal the end of
1252results.
1253
1254The @code{GNUNET_PEERSTORE_iterate} function returns a handle to the
1255iterate operation. This handle can be used to cancel the iterate
1256operation only before the callback function is called with a
1257@code{NULL} record.
1258
1259@node Monitoring records
1260@subsection Monitoring records
1261
1262PEERSTORE offers the functionality of monitoring for new records
1263stored under a specific key combination (subsystem, peerid, key).
1264To start the monitoring, use the following function:
1265
1266@example
1267@verbatiminclude tutorial-examples/015.c
1268@end example
1269
1270@noindent
1271Whenever a new record is stored under the given key combination,
1272the @code{callback} function will be called with this new
1273record. This will continue until the connection to the PEERSTORE
1274service is broken or the watch operation is canceled:
1275
1276@example
1277@verbatiminclude tutorial-examples/016.c
1278@end example
1279
1280@node Disconnecting from PEERSTORE
1281@subsection Disconnecting from PEERSTORE
1282
1283When the connection to the PEERSTORE service is no longer needed,
1284disconnect using the following function:
1285
1286@example
1287@verbatiminclude tutorial-examples/017.c
1288@end example
1289
1290@noindent
1291If the @code{sync_first} flag is set to @code{GNUNET_YES},
1292the API will delay the disconnection until all store requests
1293are received by the PEERSTORE service. Otherwise, it will
1294disconnect immediately.
1295
1296@node Using the DHT
1297@section Using the DHT
1298
1299The DHT allows to store data so other peers in the P2P network can
1300access it and retrieve data stored by any peers in the network.
1301This section will explain how to use the DHT. Of course, the first
1302thing to do is to connect to the DHT service:
1303
1304@example
1305@verbatiminclude tutorial-examples/018.c
1306@end example
1307
1308@noindent
1309The second parameter indicates how many requests in parallel to expect.
1310It is not a hard limit, but a good approximation will make the DHT more
1311efficient.
1312
1313@menu
1314* Storing data in the DHT::
1315* Obtaining data from the DHT::
1316* Implementing a block plugin::
1317* Monitoring the DHT::
1318@end menu
1319
1320@node Storing data in the DHT
1321@subsection Storing data in the DHT
1322Since the DHT is a dynamic environment (peers join and leave frequently)
1323the data that we put in the DHT does not stay there indefinitely. It is
1324important to ``refresh'' the data periodically by simply storing it
1325again, in order to make sure other peers can access it.
1326
1327The put API call offers a callback to signal that the PUT request has been
1328sent. This does not guarantee that the data is accessible to others peers,
1329or even that is has been stored, only that the service has requested to
1330a neighboring peer the retransmission of the PUT request towards its final
1331destination. Currently there is no feedback about whether or not the data
1332has been sucessfully stored or where it has been stored. In order to
1333improve the availablilty of the data and to compensate for possible
1334errors, peers leaving and other unfavorable events, just make several
1335PUT requests!
1336
1337@example
1338@verbatiminclude tutorial-examples/019.c
1339@end example
1340
1341@noindent
1342Exercise: Store a value in the DHT periodically to make sure it
1343is available over time. You might consider using the function
1344@code{GNUNET\_SCHEDULER\_add\_delayed} and call
1345@code{GNUNET\_DHT\_put} from inside a helper function.
1346
1347@node Obtaining data from the DHT
1348@subsection Obtaining data from the DHT
1349
1350As we saw in the previous example, the DHT works in an asynchronous mode.
1351Each request to the DHT is executed ``in the background'' and the API
1352calls return immediately. In order to receive results from the DHT, the
1353API provides a callback. Once started, the request runs in the service,
1354the service will try to get as many results as possible (filtering out
1355duplicates) until the timeout expires or we explicitly stop the request.
1356It is possible to give a ``forever'' timeout with
1357@code{GNUNET\_TIME\_UNIT\_FOREVER\_REL}.
1358
1359If we give a route option @code{GNUNET\_DHT\_RO\_RECORD\_ROUTE}
1360the callback will get a list of all the peers the data has travelled,
1361both on the PUT path and on the GET path.
1362
1363@example
1364@verbatiminclude tutorial-examples/020.c
1365@end example
1366
1367@noindent
1368Exercise: Store a value in the DHT and after a while retrieve it.
1369Show the IDs of all the peers the requests have gone through.
1370In order to convert a peer ID to a string, use the function
1371@code{GNUNET\_i2s}. Pay attention to the route option parameters
1372in both calls!
1373
1374@node Implementing a block plugin
1375@subsection Implementing a block plugin
1376
1377In order to store data in the DHT, it is necessary to provide a block
1378plugin. The DHT uses the block plugin to ensure that only well-formed
1379requests and replies are transmitted over the network.
1380
1381The block plugin should be put in a file @file{plugin\_block\_SERVICE.c}
1382in the service's respective directory. The
1383mandatory functions that need to be implemented for a block plugin are
1384described in the following sections.
1385
1386@menu
1387* Validating requests and replies::
1388* Deriving a key from a reply::
1389* Initialization of the plugin::
1390* Shutdown of the plugin::
1391* Integration of the plugin with the build system::
1392@end menu
1393
1394@node Validating requests and replies
1395@subsubsection Validating requests and replies
1396
1397The evaluate function should validate a reply or a request. It returns
1398a @code{GNUNET\_BLOCK\_EvaluationResult}, which is an enumeration. All
1399possible answers are in @file{gnunet\_block\_lib.h}. The function will
1400be called with a @code{reply\_block} argument of @code{NULL} for
1401requests. Note that depending on how @code{evaluate} is called, only
1402some of the possible return values are valid. The specific meaning of
1403the @code{xquery} argument is application-specific. Applications that
1404do not use an extended query should check that the @code{xquery\_size}
1405is zero. The block group is typically used to filter duplicate
1406replies.
1407
1408@example
1409@verbatiminclude tutorial-examples/021.c
1410@end example
1411
1412@noindent
1413Note that it is mandatory to detect duplicate replies in this function
1414and return the respective status code. Duplicate detection is
1415typically done using the Bloom filter block group provided by
1416@file{libgnunetblockgroup.so}. Failure to do so may cause replies to
1417circle in the network.
1418
1419@node Deriving a key from a reply
1420@subsubsection Deriving a key from a reply
1421
1422The DHT can operate more efficiently if it is possible to derive a key
1423from the value of the corresponding block. The @code{get\_key}
1424function is used to obtain the key of a block --- for example, by
1425means of hashing. If deriving the key is not possible, the function
1426should simply return @code{GNUNET\_SYSERR} (the DHT will still work
1427just fine with such blocks).
1428
1429@example
1430@verbatiminclude tutorial-examples/022.c
1431@end example
1432
1433@node Initialization of the plugin
1434@subsubsection Initialization of the plugin
1435
1436The plugin is realized as a shared C library. The library must export
1437an initialization function which should initialize the plugin. The
1438initialization function specifies what block types the plugin cares
1439about and returns a struct with the functions that are to be used for
1440validation and obtaining keys (the ones just defined above).
1441
1442@example
1443@verbatiminclude tutorial-examples/023.c
1444@end example
1445
1446@node Shutdown of the plugin
1447@subsubsection Shutdown of the plugin
1448
1449Following GNUnet's general plugin API concept, the plugin must
1450export a second function for cleaning up. It usually does very
1451little.
1452
1453@example
1454@verbatiminclude tutorial-examples/024.c
1455@end example
1456
1457@node Integration of the plugin with the build system
1458@subsubsection Integration of the plugin with the build system
1459
1460In order to compile the plugin, the @file{Makefile.am} file for the
1461service SERVICE should contain a rule similar to this:
1462@c Actually this is a Makefile not C. But the whole structure of examples
1463@c must be improved.
1464
1465@example
1466@verbatiminclude tutorial-examples/025.c
1467@end example
1468
1469@noindent
1470Exercise: Write a block plugin that accepts all queries
1471and all replies but prints information about queries and replies
1472when the respective validation hooks are called.
1473
1474@node Monitoring the DHT
1475@subsection Monitoring the DHT
1476
1477It is possible to monitor the functioning of the local
1478DHT service. When monitoring the DHT, the service will
1479alert the monitoring program of any events, both started
1480locally or received for routing from another peer.
1481The are three different types of events possible: a
1482GET request, a PUT request or a response (a reply to a GET).
1483
1484Since the different events have different associated data,
1485the API gets 3 different callbacks (one for each message type)
1486and optional type and key parameters, to allow for filtering of
1487messages. When an event happens, the appropiate callback is
1488called with all the information about the event.
1489
1490@example
1491@verbatiminclude tutorial-examples/026.c
1492@end example
1493
1494@node Debugging with gnunet-arm
1495@section Debugging with gnunet-arm
1496
1497Even if services are managed by @command{gnunet-arm}, you can
1498start them with @command{gdb} or @command{valgrind}. For
1499example, you could add the following lines to your
1500configuration file to start the DHT service in a @command{gdb}
1501session in a fresh @command{xterm}:
1502
1503@example
1504[dht]
1505PREFIX=xterm -e gdb --args
1506@end example
1507
1508@noindent
1509Alternatively, you can stop a service that was started via
1510ARM and run it manually:
1511
1512@example
1513$ gnunet-arm -k dht
1514$ gdb --args gnunet-service-dht -L DEBUG
1515$ valgrind gnunet-service-dht -L DEBUG
1516@end example
1517
1518@noindent
1519Assuming other services are well-written, they will automatically
1520re-integrate the restarted service with the peer.
1521
1522GNUnet provides a powerful logging mechanism providing log
1523levels @code{ERROR}, @code{WARNING}, @code{INFO} and @code{DEBUG}.
1524The current log level is configured using the @code{$GNUNET_FORCE_LOG}
1525environmental variable. The @code{DEBUG} level is only available if
1526@command{--enable-logging=verbose} was used when running
1527@command{configure}. More details about logging can be found under
1528@uref{https://gnunet.org/logging}.
1529
1530You should also probably enable the creation of core files, by setting
1531@code{ulimit}, and echo'ing @code{1} into
1532@file{/proc/sys/kernel/core\_uses\_pid}. Then you can investigate the
1533core dumps with @command{gdb}, which is often the fastest method to
1534find simple errors.
1535
1536Exercise: Add a memory leak to your service and obtain a trace
1537pointing to the leak using @command{valgrind} while running the service
1538from @command{gnunet-service-arm}.
1539
1540@bye
diff --git a/doc/documentation/gnunet.texi b/doc/documentation/gnunet.texi
new file mode 100644
index 000000000..35eed54b6
--- /dev/null
+++ b/doc/documentation/gnunet.texi
@@ -0,0 +1,236 @@
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 Introduction
68
69This document is the Reference Manual for GNUnet version @value{VERSION}.
70
71@menu
72
73* Philosophy:: About GNUnet
74* Vocabulary:: Vocabulary
75* GNUnet Installation Handbook:: How to install GNUnet
76* Using GNUnet:: Using GNUnet
77* Configuration Handbook:: Configuring GNUnet
78* GNUnet Contributors Handbook:: Contributing to GNUnet
79* GNUnet Developer Handbook:: Developing GNUnet
80* GNU Free Documentation License:: The license of this manual
81* GNU General Public License:: The license of this manual
82* Concept Index:: Concepts
83* Programming Index:: Data types, functions, and variables
84
85@detailmenu
86 --- The Detailed Node Listing ---
87
88Philosophy
89
90* Design Goals::
91* Security and Privacy::
92* Versatility::
93* Practicality::
94* Key Concepts::
95* Authentication::
96* Accounting to Encourage Resource Sharing::
97* Confidentiality::
98* Anonymity::
99* Deniability::
100* Peer Identities::
101* Zones in the GNU Name System (GNS Zones)::
102* Egos::
103* Backup of Identities and Egos::
104* Revocation::
105
106Vocabulary
107
108* Definitions abbreviations and acronyms::
109* Words and characters::
110* Technical Assumptions::
111
112GNUnet Installation Handbook
113
114* Dependencies::
115* Pre-installation notes::
116* Generic installation instructions::
117* Build instructions for Ubuntu 12.04 using Git::
118* Build instructions for software builds from source::
119* Build Instructions for Microsoft Windows Platforms::
120* Build instructions for Debian 7.5::
121* Installing GNUnet from Git on Ubuntu 14.4::
122* Build instructions for Debian 8::
123* Outdated build instructions for previous revisions::
124@c * Portable GNUnet::
125* The graphical configuration interface::
126* How to start and stop a GNUnet peer::
127
128Using GNUnet
129
130* Checking the Installation::
131* First steps - File-sharing::
132* First steps - Using the GNU Name System::
133* First steps - Using GNUnet Conversation::
134* First steps - Using the GNUnet VPN::
135* File-sharing::
136* The GNU Name System::
137* Using the Virtual Public Network::
138
139Configuration Handbook
140
141GNUnet Contributors Handbook
142
143* Contributing to GNUnet::
144* Licenses of contributions::
145* Copyright Assignment::
146* Contributing to the Reference Manual::
147
148GNUnet Developer Handbook
149
150* Developer Introduction::
151* Code overview::
152* System Architecture::
153* Subsystem stability::
154* Naming conventions and coding style guide::
155* Build-system::
156* Developing extensions for GNUnet using the gnunet-ext template::
157* Writing testcases::
158* TESTING library::
159* Performance regression analysis with Gauger::
160* TESTBED Subsystem::
161* libgnunetutil::
162* Automatic Restart Manager (ARM)::
163* TRANSPORT Subsystem::
164* NAT library::
165* Distance-Vector plugin::
166* SMTP plugin::
167* Bluetooth plugin::
168* WLAN plugin::
169* ATS Subsystem::
170* CORE Subsystem::
171* CADET Subsystem::
172* NSE Subsystem::
173* HOSTLIST Subsystem::
174* IDENTITY Subsystem::
175* NAMESTORE Subsystem::
176* PEERINFO Subsystem::
177* PEERSTORE Subsystem::
178* SET Subsystem::
179* STATISTICS Subsystem::
180* Distributed Hash Table (DHT)::
181* GNU Name System (GNS)::
182* GNS Namecache::
183* REVOCATION Subsystem::
184* File-sharing (FS) Subsystem::
185* REGEX Subsystem::
186
187@end detailmenu
188@end menu
189
190@c *********************************************************************
191@include chapters/philosophy.texi
192@c *********************************************************************
193
194@include chapters/vocabulary.texi
195
196@c *********************************************************************
197@include chapters/installation.texi
198@c *********************************************************************
199
200@c *********************************************************************
201@include chapters/user.texi
202@c *********************************************************************
203
204@include chapters/configuration.texi
205
206@include chapters/contributing.texi
207
208@c *********************************************************************
209@include chapters/developer.texi
210@c @include gnunet-c-tutorial.texi
211@c *********************************************************************
212
213@c *********************************************************************
214@node GNU Free Documentation License
215@appendix GNU Free Documentation License
216@cindex license, GNU Free Documentation License
217@include fdl-1.3.texi
218
219@c *********************************************************************
220@node GNU General Public License
221@appendix GNU General Public License
222@cindex license, GNU General Public License
223@include gpl-3.0.texi
224
225@c *********************************************************************
226@node Concept Index
227@unnumbered Concept Index
228@printindex cp
229
230@node Programming Index
231@unnumbered Programming Index
232@syncodeindex tp fn
233@syncodeindex vr fn
234@printindex fn
235
236@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..a4928f6fe
--- /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-26.06; # 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..0c3b04e9d
--- /dev/null
+++ b/doc/documentation/index.html
@@ -0,0 +1,35 @@
1<title>GNUnet - GNUnet Manuals and Handbooks</title>
2<h2>GNUnet - GNUnet Manuals and Handbooks</h2>
3
4<address>GNUnet e.V.</address>
5<address>Fakultät für Informatik -- I8</address>
6<address>Technische Universität München</address>
7<address>Boltzmannstraße 3</address>
8<address>85748 Garching</address>
9<address>GERMANY</address>
10
11<p>The following handbooks and manuals are available:</p>
12
13<ul>
14<li><a href="gnunet/index.html">GNUnet Reference Manual</li>
15<li><a href="gnunet-c-tutorial/index.html">GNUnet C Tutorial</li>
16</ul>
17
18<div id="footer">
19<div class="unprintable">
20
21<p>Please send general FSF &amp; GNU inquiries to
22<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
23There are also <a href="/contact/">other ways to contact</a>
24the FSF. Broken links and other corrections or suggestions can be sent
25to <a href="mailto:gnunet-developers@gnu.org">&lt;gnunet-developers@gnu.org&gt;</a>.</p>
26</div>
27
28<p>Copyright &copy; 2001 - 2017 GNUnet e.V.</p>
29
30<p>This page is licensed under a FIXME License.</p>
31
32</div>
33</div>
34</body>
35</html>
diff --git a/doc/documentation/run-gendocs.sh b/doc/documentation/run-gendocs.sh
new file mode 100755
index 000000000..d02570177
--- /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 Manual" -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