gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r2599 - GNUnet-docs/WWW/test


From: durner
Subject: [GNUnet-SVN] r2599 - GNUnet-docs/WWW/test
Date: Sat, 1 Apr 2006 04:02:07 -0800 (PST)

Author: durner
Date: 2006-04-01 03:59:15 -0800 (Sat, 01 Apr 2006)
New Revision: 2599

Modified:
   GNUnet-docs/WWW/test/bugs
   GNUnet-docs/WWW/test/commitMassTranslation.php
   GNUnet-docs/WWW/test/commitTranslation.php
   GNUnet-docs/WWW/test/documentation.php3
   GNUnet-docs/WWW/test/editor.php
   GNUnet-docs/WWW/test/encoding.php3
   GNUnet-docs/WWW/test/faq.php3
   GNUnet-docs/WWW/test/gnunet-logo-color.png
   GNUnet-docs/WWW/test/gnunet-logo.png
   GNUnet-docs/WWW/test/gnunet.css
   GNUnet-docs/WWW/test/hacking.php3
   GNUnet-docs/WWW/test/hacking_application.php3
   GNUnet-docs/WWW/test/hacking_future.php3
   GNUnet-docs/WWW/test/hacking_organization.php3
   GNUnet-docs/WWW/test/hacking_rpc.php3
   GNUnet-docs/WWW/test/hacking_server.php3
   GNUnet-docs/WWW/test/hacking_testcases.php3
   GNUnet-docs/WWW/test/hacking_threading.php3
   GNUnet-docs/WWW/test/hacking_util.php3
   GNUnet-docs/WWW/test/hacking_win32_build.php3
   GNUnet-docs/WWW/test/html_footer.php3
   GNUnet-docs/WWW/test/html_header.php3
   GNUnet-docs/WWW/test/i18nhtml.inc.php
   GNUnet-docs/WWW/test/index.php
   GNUnet-docs/WWW/test/links.php3
   GNUnet-docs/WWW/test/mailinglist.php3
   GNUnet-docs/WWW/test/menu.php3
   GNUnet-docs/WWW/test/old_news.php3
   GNUnet-docs/WWW/test/papers.php3
   GNUnet-docs/WWW/test/philosophy.php3
   GNUnet-docs/WWW/test/protocol.php3
   GNUnet-docs/WWW/test/protocol_cs.php3
   GNUnet-docs/WWW/test/protocol_cs_afs.php3
   GNUnet-docs/WWW/test/protocol_cs_core.php3
   GNUnet-docs/WWW/test/protocol_cs_index.inc
   GNUnet-docs/WWW/test/protocol_cs_testbed.php3
   GNUnet-docs/WWW/test/protocol_p2p.php3
   GNUnet-docs/WWW/test/protocol_p2p_afs.php3
   GNUnet-docs/WWW/test/protocol_p2p_core.php3
   GNUnet-docs/WWW/test/protocol_p2p_dht.php3
   GNUnet-docs/WWW/test/protocol_p2p_index.inc
   GNUnet-docs/WWW/test/protocol_p2p_rpc.php3
   GNUnet-docs/WWW/test/protocol_p2p_tracekit.php3
   GNUnet-docs/WWW/test/protocol_transport.php3
   GNUnet-docs/WWW/test/protocol_transport_tcp.php3
   GNUnet-docs/WWW/test/protocol_transport_udp.php3
   GNUnet-docs/WWW/test/screenshots.php3
   GNUnet-docs/WWW/test/scripts.inc
   GNUnet-docs/WWW/test/smtp.php3
   GNUnet-docs/WWW/test/translate.php
   GNUnet-docs/WWW/test/user.php3
   GNUnet-docs/WWW/test/user_afs.php3
   GNUnet-docs/WWW/test/user_chat.php3
   GNUnet-docs/WWW/test/user_gnunet.php3
   GNUnet-docs/WWW/test/user_index.inc
   GNUnet-docs/WWW/test/user_testbed.php3
Log:
update

Modified: GNUnet-docs/WWW/test/bugs
===================================================================
--- GNUnet-docs/WWW/test/bugs   2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/bugs   2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,3 +1,6 @@
 * can not edit title/description in meta-tags
+  => not true: use mass edit page!
 * no editor-mode for translation pages
+  => not really true: add flag by hand!
 * fonts do not work for non-western european languages (chinese, hebrew, 
russian, etc.)
+  => should be fixed since i18nhtml 0.2.x

Modified: GNUnet-docs/WWW/test/commitMassTranslation.php
===================================================================
--- GNUnet-docs/WWW/test/commitMassTranslation.php      2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/commitMassTranslation.php      2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -32,12 +32,14 @@
 echo "</head><body>";
 W("Processing translations...");
 P();
-$done = 0;
+$skip = 0;
 foreach($_POST as $dec=>$val) {
-  if ($val == "")
-    continue;
   if ( ($dec == "xlang") || ($dec == "start") )
     continue;
+  if ($val == "") {
+    $skip++;
+    continue;
+  }
   $val = fix($val);
   $query = "SELECT c FROM ".$i18nHTMLsqlPrefix."pending WHERE lang=\"$xlang\"";
   $result = mysql_query($query, $connection);
@@ -82,7 +84,6 @@
       $query = "INSERT INTO ".$i18nHTMLsqlPrefix."map VALUES(\"$enc_sql\", 
\"$lang\", " .
                "\"$val_sql\", 1, \"" . $_SERVER['REMOTE_ADDR'] . "\");";
       mysql_query($query, $connection);
-      $done++;
       W("Storing translation for &quot;%s&quot = &quot;%s&quot;.",
         ARRAY(stripslashes($enc_sql),
              stripslashes($val_sql)));
@@ -91,7 +92,7 @@
   }
 }
 P();
-echo "<a href=\"" . $i18nHTMLbase . "editor.php?xlang=" . $lang . "&start=" . 
($start - $done) . "\">";
+echo "<a href=\"" . $i18nHTMLbase . "editor.php?xlang=" . $lang . "&start=" . 
($start + $skip) . "\">";
 $t = TRANSLATE("Continue mass-editing...");
 echo "</a>";
 if ($t == 1)

Modified: GNUnet-docs/WWW/test/commitTranslation.php
===================================================================
--- GNUnet-docs/WWW/test/commitTranslation.php  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/commitTranslation.php  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -26,6 +26,10 @@
   W("Translating to English is not allowed.\n");
   die();
 }
+if (strstr($xlang, "@")) {
+  W("Invalid language.\n");
+  die();
+}
 $text            = urldecode($_REQUEST['text']);
 $text_sql        = mysql_real_escape_string($text);
 $translation     = fix($_REQUEST['translation']);
@@ -33,13 +37,24 @@
 
 $back            = $_REQUEST['back'];
 // check for identical translation
-$query = "SELECT ranking FROM ".$i18nHTMLsqlPrefix."map WHERE 
name=\"$text_sql\"" .
-         " AND lang=\"$lang\" AND translation=\"$translation_sql\"";
+$query = "SELECT ranking,translation FROM ".$i18nHTMLsqlPrefix."map WHERE 
name=\"$text_sql\"" .
+  " AND lang=\"$lang\"";
+
 $result = mysql_query($query, $connection);
 $num = 0;
 if ($result)
   $num = mysql_numrows($result);
-if ($num > 0) {
+$exists = 0;
+$max = 0;
+for ($ii=0;$ii<$num;$ii++) {
+  $row = mysql_fetch_array($result);
+  if ($row["translation"] == $translation_sql)
+    $exists = 1;
+  if ($row["rank"] > $max)
+    $max = $row["rank"];
+ }
+
+if ($exists == 1) {
   echo "<html><head>";
   TITLE("Translation exists.");
   echo "</head><body>";
@@ -62,7 +77,7 @@
       echo "</body></html>";
   } else {
     $query = "INSERT INTO ".$i18nHTMLsqlPrefix."map VALUES(\"$text_sql\", 
\"$lang\", " .
-             "\"$translation_sql\", 1, \"" . $_SERVER['REMOTE_ADDR'] . "\");";
+             "\"$translation_sql\", $max+1, \"" . $_SERVER['REMOTE_ADDR'] . 
"\");";
     $result = mysql_query($query, $connection);
     if ($result) {
       $query = "DELETE FROM ".$i18nHTMLsqlPrefix."pending WHERE lang=\"$lang\" 
AND c=\"$text_sql\"";

Modified: GNUnet-docs/WWW/test/documentation.php3
===================================================================
--- GNUnet-docs/WWW/test/documentation.php3     2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/documentation.php3     2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,68 +1,58 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation";
-$description = "Documentation for GNUnet";
-include("html_header.php3");
-
-H2("Documentation");
-BP();
-W("Documentation is always work in progress.");
-W("The documentation is currently undergoing a major revision to reflect the 
changes in the upcoming 0.7.0 release.");
-W("Some parts are identical between both releases, others reflect how things 
will be in 0.7.0 and others still document how GNUnet 0.6.x works.");
-W("At this point, most of the text describes GNUnet 0.7.0.");
-W("So if you are using 0.6.x take everything with a grain of salt.");
-EP();
-H3("i18nHTML");
-BP();
-W("The GNUnet webpage uses %s to internationalize the documentation.",
-  extlink_("/i18nHTML/", "i18nHTML"));
-W("Please feel encouraged to help, for example by translating some of the 
pages to your native language.");
-W("Just view the pages in your language and click on the &quot;*&quot; after a 
sentence to translate it.");
-W("You can start a new language by adding <tt>lang=LANGUAGE</tt> after the 
<tt>.php3</tt> in the URL.");
-W("The translations incorporate a voting system, the highest ranked 
translation is displayed.");
-W("English is always the source language.");
-W("Only developers can change the source, contact them if you find problems.");
-W("On the translation page, you find all other translations.");
-W("You can also vote for a specific translation by clicking on the respective 
sentence.");
-W("You are allowed to vote multiple times for the same sentence, e.g. to 
express strong feelings. :-)");
-W("The system logs your IP and allows the administrator to easily undo all 
operations that were performed from a certain IP address.");
-if ($xlang && ($xlang != "English") ) {
-  W("You can translate the most commonly requested untranslated sentences for 
your language using the %s.",
-    intlink_("editor.php", "mass translation page"));
- }
-
-
-P();
-W("You can access the sourcecode of the documentation using CVS:");
-P();
-PRE("$ svn checkout https://gnunet.org/svn/GNUnet-docs/";);
-P();
-W("Generated doxygen documentation can be found %s.",
-  extlink_("doxygen/html", "here"));
-W("Like most documentation, it will probably never really be finished.");
-EP();
-H3("Table of Contents");
-IMG("gnu_in_net.png", "GNUnet logo", "RIGHT", 150, 150);
-?>
-<ol>
- <li><?php intlink("philosophy.php3","Copyright and Philosophy"); ?></li>
- <li><?php intlink("user.php3","Using GNUnet");
-           include("user_index.inc"); ?>
- </li>
- <li><?php intlink("protocol.php3","The Protocols");
-           include("protocol_index.inc"); ?>
- </li>
- <li><?php intlink("hacking.php3","Hacking GNUnet");
-           include("hacking_index.inc"); ?>
- </li>
-   <li><?php W("Special topics"); ?>
-  <ol>
-   <li><?php intlink("smtp.php3","Transport performance"); ?></li>
-   <li><?php intlink("namespace.php3","Namespaces and Directories"); ?></li>
-   <li><?php intlink("encoding.php3","Content encoding"); ?></li>
-  </ol>
-</ol>
-<?php
-P();
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation";
+$description = "Overview of the available documentation for GNUnet";
+include("html_header.php3");
+
+H2("Documentation");
+BP();
+W("Documentation is always work in progress.");
+W("The current documentation describes GNUnet 0.7.x, but is of course 
incomplete.");
+EP();
+H3("i18nHTML");
+BP();
+W("The GNUnet webpage uses %s to internationalize the documentation.",
+  extlink_("/i18nHTML/", "i18nHTML"));
+W("Please feel encouraged to help, for example by translating some of the 
pages to your native language.");
+W("Just view the pages in your language and click on the &quot;*&quot; after a 
sentence to translate it.");
+W("You can start a new language by adding <tt>lang=LANGUAGE</tt> after the 
<tt>.php3</tt> in the URL.");
+W("The translations incorporate a voting system, the highest ranked 
translation is displayed.");
+W("English is always the source language.");
+W("Only developers can change the source, contact them if you find problems.");
+W("On the translation page, you find all other translations.");
+W("You can also vote for a specific translation by clicking on the respective 
sentence.");
+W("You are allowed to vote multiple times for the same sentence, e.g. to 
express strong feelings. :-)");
+W("The system logs your IP and allows the administrator to easily undo all 
operations that were performed from a certain IP address.");
+if ($xlang && ($xlang != "English") ) {
+  W("You can translate the most commonly requested untranslated sentences for 
your language using the %s.",
+    intlink_("editor.php", "mass translation page"));
+ }
+
+
+P();
+W("You can access the sourcecode of the documentation using Subversion:");
+P();
+PRE("$ svn checkout https://gnunet.org/svn/GNUnet-docs/";);
+P();
+W("Generated doxygen documentation can be found %s.",
+  extlink_("doxygen/html", "here"));
+W("Like most documentation, it will probably never really be finished.");
+EP();
+H3("Table of Contents");
+gnunetlogo();
+echo "<ol>\n";
+LILI("philosophy.php3","Copyright and Philosophy");
+LILI("user.php3","Using GNUnet");
+include("user_index.inc"); 
+LILI("protocol.php3","The Protocols");
+include("protocol_index.inc"); 
+LILI("hacking.php3","Hacking GNUnet");
+include("hacking_index.inc"); 
+LI("Special topics"); 
+echo "<ol>\n";
+LILI("smtp.php3","Transport performance and SMTP setup"); 
+LILI("encoding.php3","Content encoding"); 
+echo "</ol>\n";
+echo "</ol>\n";
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/editor.php
===================================================================
--- GNUnet-docs/WWW/test/editor.php     2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/editor.php     2006-04-01 11:59:15 UTC (rev 2599)
@@ -32,6 +32,8 @@
   die();
  }
 $start = $_REQUEST['start'];
+if (! $start)
+  $start = 0;
 H2("Mass translation to %s", $xlang);
 W("This page is for translating lots of sentences at once.");
 W("The sentences are ordered by the frequency that they are requested by 
users.");
@@ -50,9 +52,9 @@
 if ($end > $num) {
   $end = $num;
   $start = $end - $max;
-  if ($start < 0)
+}
+if ($start < 0)
     $start = 0;
-}
 
 if ($num == 0) {
   P();
@@ -68,8 +70,7 @@
 
   echo "<form method=\"POST\" action=\"" . $i18nHTMLbase . 
"commitMassTranslation.php\">";
   echo "<input type=hidden name=\"xlang\" value=\"$xlang\">";
-  $endp = $end + 1;
-  echo "<input type=hidden name=\"start\" value=\"$endp\">";
+  echo "<input type=hidden name=\"start\" value=\"$start\">";
 
   echo "<table border=5>";
   echo "<tr>";
@@ -89,14 +90,14 @@
     if ($result2)
       $num2 = mysql_numrows($result2);
     echo "<tr><td width=\"45%\">";
-    echo "&quot;$cx_plain&quot;";
-    echo "</td>\n\t<td width\"50\%\">";
+    echo "&quot;" . htmlentities($cx_plain) . "&quot;";
+    echo "</td>\n\t<td width=\"50%\">";
     if ($num2 > 0) {
       $query = "DELETE FROM ".$i18nHTMLsqlPrefix."pending WHERE lang=\"$lang\" 
AND c=\"$cx_sql\"";
       mysql_query($query, $connection);
       W("Skipped (already translated).");
     } else {
-      echo "<input size=\"40\" maxlength=\"65535\" name=\"" . 
bin2hex(md5($cx_plain)) . "\"></td></tr>\n";
+      echo "<input size=\"49%\" maxlength=\"65535\" name=\"" . 
bin2hex(md5($cx_plain)) . "\"></td></tr>\n";
     }
   }
   echo "</tr></table>";
@@ -107,7 +108,7 @@
 }
 if ($end < $num) {
   P();
-  echo "<a href=\"" . $i18nHTMLbase . "editor.php?xlang=" . $lang . "&start=" 
. ($end + 1) . "\">";
+  echo "<a href=\"" . $i18nHTMLbase . "editor.php?xlang=" . $lang . "&start=" 
. $end . "\">";
   $t = TRANSLATE("Skip these sentences, continue with next set.");
   echo "</a>";
   if ($t == 1)

Modified: GNUnet-docs/WWW/test/encoding.php3
===================================================================
--- GNUnet-docs/WWW/test/encoding.php3  2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/encoding.php3  2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,193 +1,44 @@
-<?php
-include("scripts.php3");
-$title = "Encoding content for anonymous file-sharing in GNUnet";
-$description = "ESED II, a new encoding for anonymous file sharing in GNUnet";
-include("html_header.php3");
-
-H2("The GNUnet AFS Encoding");
-// FIXME: update for 0.7.0
-BP();
-W("This page is intended to describe the revised GNUnet content encoding which 
was implemented in version 0.5.0.");
-
-EP();
-
-H3("What is the GNUnet AFS Encoding");
-BP();
-W("The GNUnet AFS Encoding is the way GNUnet encodes files for anonymous 
sharing.");
-W("The first version of the encoding was presented in %s.",
-  extlink_("download/esed.ps","Efficient Sharing of Encrypted Data"));
-W("We refer to this original scheme (which is used in GNUnet 0.4.7 and before) 
as the ESED scheme.");
-W("This page is discussing the problems with the ESED encoding and tries to 
come up with solutions.");
-W("The resulting scheme is called ESED II.");
-
-EP();
-H3("Problems with ESED");
-echo "<dl>\n";
-DT("Content Migration");
-echo "<dd>";
-W("1k blocks in ESED can only migrate when they are requested.");
-W("If a node would push ESED blocks out into the network, the triple-hash does 
not protect against malicious nodes constructing bad pairs.");
-BR();BR();
-W("There are two attacks, and only one would work.");
-W("We describe both attacks and elaborate why they work (or why not).");
-BR();
-echo "<ol>";
-echo "<li>";
-W("The first is an adversary that sends out garbage into the world, hoping to 
push useful content out of the network.");
-W("Since the content message in the ESED scheme consists of a double-hash and 
encrypted data that are not related in any obvious way, nodes may think that 
garbage messages are perfectly valid and store them, even if the blocks would 
not properly decrypt.");
-BR();
-W("This attack will not work since the blocks will never be requested (they 
are highly unlikely to match any real request) and thus only nodes with excess 
capacity will store them.");
-W("Even those nodes will time-out and replace the content quickly with blocks 
that are actually requested.");
-echo "</li>\n";
-echo "<li>";
-W("The second attack involves an adversary that wants to censor a keyword or a 
specific piece of content.");
-W("If the adversary knows the respective double-hash of the key or content, he 
can push content messages into the network that map the good double-hash to bad 
(random) data.");
-W("Nodes that try to receive the data would then get garbage.");
-BR();
-W("The attack only really works if nodes would make copies of content even if 
they do not have a matching query spreading.");
-W("In that case, the adversary would be able to massively spread bad content 
in the network (the good guys are unable to spread the good blocks to the same 
extent), and the content would stay since the queries are popular.");
-W("In the current implementation, this attack is not a problem since nodes 
only keep content if there was a matching query, and the chance that an 
adversary can spread bad content compared to the good content depends entirely 
on its proportional presence in the network compared to nodes offering the good 
content.");
-W("Thus the adversary can not make the bad replies dominate the network unless 
the adversary dominates the network overall.");
-BR();
-W("In GNUnet 0.5.0 we want to allow active spreading of content in order to 
make better use of available disk-space.");
-W("This requires changing the encoding to make the attack described above 
impossible.");
-echo "</li>\n";
-echo "</ol></dd>\n";
-DT("Random Disk Accesses");
-echo "<dd>";
-W("The current encoding with 1k blocks requires GNUnet to perform an excessive 
amount of disc accesses.");
-W("In particular, every query is a random hash, and 8 GB of content require a 
256 MB lookup database just to resolve if the reply is available.");
-W("256 MB can typically not be kept in memory.");
-W("Since the queries are random hashes, every one of them requires a random 
disc access.");
-W("This is <em>the</em> major limiting factor for GNUnet AFS scalability, 
since modern drives can do at most 10-20 random accesses per second, while the 
network bandwidth would allow GNUnet to route more than 100 queries per second 
on a slow modem line.");
-BR();
-W("There are two main approaches to solve this problem.");
-echo "<ol>\n";
-echo "<li>";
-W("By reducing the number of different queries that are required to index a GB 
of data  to a more reasonable value (say 1 MB per GB instead of the current 16 
MB), we would be able to cache the index in memory and thus give us a 
practically unlimited number of random accesses.");
-W("The problem here is, that a larger block size (currently 1k) would require 
fragmentation for some transport protocols.");
-W("An implementation of fragmentation as in IP would require retransmission of 
the entire block if a single fragment was lost, which might mean on some lines 
that we would become horribly inefficient.");
-W("Also, fragmentation would require nodes to keep more state (the fragments), 
increasing memory requirements.");
-W("Possible attacks (like sending only the first fragment) would compilicate 
the implementation greatly.");
-echo "</li>\n";
-echo "<li>";
-W("If the node would be able to do a cheaper test to gauge the chances that 
the lookup succeeds, it might reduce the cost for the random disk access down 
to a level where say 90 percent of the queries would be filtered up-front.");
-echo "</ol></dd>";
-DT("Resynchronizing the stream");
-echo "<dd>";
-W("In ESED, inserting a single character at the beginning of a file results in 
a completely different file, reducing the chances of saving space by storing 
equal data only once.");
-W("It is still not clear how bad this really is since for large files (mp3, 
ogg, avi), I would suspect that they are hardly ever going to be just a bit 
different in a few places.");
-W("A different encoder is rather likely to produce a stream that has no 
similarity, but that&rsquo;s just my intuition.");
-W("It would be nice to see some proof that there can actually be a significant 
benefit in practice before even trying to develop some technique to solve 
this.");
-echo "</dd>\n";
-DT("Resuming downloads");
-echo "<dd>";
-W("Resuming an aborted download in GNUnet 0.4.7 and earlier requires 
re-requesting all the IBlocks of the file.");
-W("While DBlocks are not requested again, this can still be a significant 
overhead.");
-W("The major reason for this is an implementation that did not quite allow 
fixing this problem easily.");
-W("In particular, we may want to compute IBlocks from the DBlocks that are 
available in the tree below.");
-W("This requires us to integrate the code for insertion and downloading.");
-W("This is mostly a code design question, though.");
-echo "</dd></dl>\n";
-BR();BR();
-HR();
-BR();BR();
-H3("Ideas");
-BP();
-W("Here is the initial set of ideas:");
-EP();
-echo "<ul><li>";
-W("Use a %s (%s) to avoid disk accesses for data that is not locally 
available.",
-  ARRAY(extlink_("http://www.nist.gov/dads/HTML/bloomfilt.html","bloom 
filter"),
-       extlink_("papers/p422-bloom.pdf","paper")));
-echo "</li><li>";
-W("Use CHK for the IBlocks and DBlocks instead of the ESED scheme.");
-W("This would require us to store 2 hashes in the IBlocks, reducing the degree 
of the B-tree from 51 to 25, but it would fix the content migration problem.");
-W("For searches, we would still need the triple-hash scheme, but search 
results migrate much faster anyway, so push-migration for those should not be 
needed anyway.");
-echo "</li><li>";
-W("Instead of larger blocks, use a summary (say a single hash of the 
CHK-encoded blocks as part of the IBlock) as a &quot;super&quot; query to 
summarize the blocks underneith.");
-W("This works fine for on-demand encoded and locally inserted blocks, but 
nodes that want to make copies of content that is flying by on the return-path 
would need to capture all 25 blocks in order to be sure that the summary is 
accurate.");
-W("But maybe the push-migration possible due to CHK would make fly-by content 
migration less important such that we can afford making fly-by migration harder 
(or less likely).");
-W("A 25-node super-query would reduce the lookup database for 8 GB from 256 MB 
to a &quot;super-lookup-cache&quot; of only 10 MB.");
-W("25 blocks per super-summary-hash would have the advantage that the IBlock 
format would work out exactly with the 1k scheme (25 CHKs a 40 bytes, 1 
super-hash a 20 bytes, 1 crc with 4 bytes).");
-echo "</li></ul>";
-BR();BR();
-HR();
-BR();BR();
-H3("The new implementation");
-BP();
-W("The good news is, that except for re-synchronizing the stream, the new 
implementation addresses all problems noted above.");
-W("The new encoding encrypts every 1k block using the hash of the block, 
called the key-hash (Ripe160, Blowfish) and stores that block under the hash of 
the encrypted block, called the query-hash (straight forward Freenet style 
CHK).");
-W("The IBlock above then contains both the key-hash and the query-hash.");
-W("With 1k bytes per IBlock, we can store up to 25 CHK-hashes (CHK is the 
key-hash plus the query-hash) in one IBlock.");
-W("The IBlock also contains a CRC32 (CRC32 of the concatenation of the CRC32s 
of the plaintext blocks of all Blocks below the IBlock) and a so-called 
<em>super-hash</em>.");
-W("The super-hash is the hash of the concatenation of all the query-hashes in 
the Blocks below the IBlock.");
-W("Note that in principle, the super-hash is redundant in the IBlock, but it 
fills up the block nicely to 1024 bytes.");
-
-P();
-
-W("The RBlock is still encrypted with the 3HASH scheme from ESED, using the 
hash of the block as the key, the hash of the hash as the proof and the hash of 
the hash of the hash as the query.");
-W("In queries, the peers do not differenciate between the two types of 
encodings (CHK or 3HASH); only the replies are different since the 3HASH reply 
contains the proof-hash as part of the reply message, whereas the CHK reply 
only contains the encrypted 1k block and no hash code.");
-
-P();
-
-W("This new encoding allows peers to differenciate between downloads and 
searches, but the security implications for this should be absolutely minor 
since anonymity and deniability are not affected.");
-W("The most significant attack that this allows is a limited form of 
censorship where peers would route only searches (3HASH) if they can guess the 
query by checking against a whitelist of <em>good</em> keys.");
-W("Since they would still route content, these peers would still earn trust in 
the system.");
-W("Note that the impact of this attack is limited since there is a high 
probability that GNUnet would eventually route the searches around these 
peers.");
-
-P();
-
-W("In order to reduce the number of disc accesses, the new encoding uses 
<em>super-queries</em>.");
-W("Super-queries are queries that contain the super-query from the IBlock 
(concatenation of the queries of the Blocks below) and a subset (!) of the 
queries from the blocks below.");
-W("Note that in the super-query message, the super-query itself is often not 
redundant since it may not be possible to reconstruct the super-query from the 
subset of the queries (the exception is, if the subset is the full set of 
queries).");
-W("Grouping up to 25 queries in one larger message is obviously saving some 
bandwidth (especially since the query-hash code is 20 bytes and there are 4 
bytes query-header and 20 bytes return-to address and 4 bytes priority overhead 
per query, thus grouping 25 queries in one larger message can save up to 24*28 
bytes per super-query in bandwidth), but it is not the major reason why they 
were introduced.");
-W("The real reason is to save on disc accesses.");
-W("In order to understand this part, we first need to describe the new content 
insertion mechanism.");
-
-P();
-
-W("When content is inserted into GNUnet, the local node is told by 
gnunet-insert which super-hashes were inserted.");
-W("Since (for inserted content at least initially, but for indexed files 
forever) all 25 queries that correspond to the super-query are going to be 
available locally, the node will remember the super-query and mark it as 
available in the super-bloomfilter.");
-W("When the node receives a super-query message, it will check with the 
super-bloomfilter if the super-query has been marked as available.");
-W("If it has been marked as available, the node can be fairly certain that the 
data will be locally available and proceed with the (costly) disc accesses to 
retrieve the content.");
-W("Note that the node does not have to mark all 25 hash codes in the 
super-bloomfilter but just the one super-hash, reducing the size of the 
super-bloomfilter by a factor of 25.");
-W("Since the super-bloomfilter resides in memory, this is very important.");
-
-P();
-
-W("Note that the super-query message is not dropped instantly if the 
super-bloomfilter says that the query is not available.");
-W("The reason for this is, that GNUnet also wants to be able to migrate 
content.");
-W("Since content in GNUnet does not migrate in 25k blocks (but instead in 1k 
blocks), super-query hash codes can not be constructed in a secure manner for 
migrated content.");
-W("Also, there is no super-query for the Root-Blocks and the top IBlocks.");
-W("Thus, GNUnet has a second bloom-filter for migrated content and 3HASH 
queries.");
-W("If the super-query fails (or if the query is an ordinary query with just 
one hash code), GNUnet consults this second bloom filter to test if the content 
might be available locally.");
-W("In the case of a super-query message, the second bloom-filter is tested for 
each of the individual queries of the query message, but not for the 
super-query.");
-W("If the second bloom filter test succeeds for one of the queries, GNUnet 
will try to locate the content for that query and send a response.");
-W("The other queries are then routed to other peers.");
-W("Note that the second bloom-filter needs to have space for every hash code 
that is locally available and not covered by a super-query.");
-W("This makes it significantly more expensive (a factor of 25 in terms of 
memory for the bloom-filter) to store migrated content compared to locally 
inserted or indexed content.");
-W("The old implementation was limited to 8 GB of locally available content, 
assuming that about 6 GB were indexed or inserted locally and only 2 GB were 
have migrated from other peers.");
-
-
-P();
-
-W("When routing super-queries, GNUnet may only be able to keep track of a 
subset of the queries of the query-message since the routing table may be 
full.");
-W("This is one of the cases where the super-query message is reduced to only 
contain a subset of the original 25 queries.");
-W("The other case occurs if the originating gnunet-download process has 
already a subset of the blocks locally available.");
-
-P();
-
-W("The new gnunet-download implementation has also been improved.");
-W("It stores IBlocks received from the network in FILENAME.X files until the 
download has been completed.");
-W("If the download is resumed, the .X files are used to avoid downloading the 
IBlocks again.");
-W("Furthermore, gnunet-download attempts to reconstruct IBlocks from the 
Blocks that are lower in the tree.");
-W("For this, the <tt>insert</tt> method that is also used by gnunet-insert is 
invoked on the Block.");
-W("<tt>insert</tt> is passed <tt>NULL</tt> for the GNUnet socket to ensure 
that it does not actually insert the data found on the drive.");
-W("Only if no matching block was found in the .X files and if the 
reconstruction attempt failed, gnunet-download actually starts downloading the 
blocks.");
-W("Note that this slows down gnunet-download at the beginning a bit since the 
insert-check may be costly, especially if the file is large (we may want to 
make it optional).");
-
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "The Encoding for Censorship-Resistant Sharing";
+$description = "ECRS, the censorship-resistant content encoding for GNUnet 
file sharing";
+include("html_header.php3");
+
+H2("The Encoding for Censorship-Resistant Sharing");
+BP();
+W("When GNUnet shares files, it uses a content encoding that is called ECRS, 
the Encoding for Censorship-Resistant Sharing.");
+W("Most of ECRS is described in %s research paper.",
+  extlink_("download/ecrs.ps", "this"));
+W("ECRS obsoletes the previous %s and ESED II encodings which were used in 
GNUnet before version 0.7.0.",
+  extlink_("download/esed.ps", "ESED"));
+BR();
+W("The rest of this page assumes that the reader is familiar with the %s.",
+  extlink_("download/ecrs.ps", "ECRS paper"));
+W("What follows is a description of some minor extensions that GNUnet makes 
over what is described in the paper.");
+W("The reason why these extensions are not in the paper is that we felt that 
they were obvious or trivial extensions to the original scheme and thus did not 
warrant space in the research report.");
+EP();
+
+H3("NBlocks");
+BP();
+W("An <tt>NBlock</tt> is a signed advertisement for a namespace.");
+W("The <tt>NBlock</tt> contains metadata describing the content of the 
namespace, in particular the identifier for the root of the namespace.");
+W("The <tt>NBlock</tt> is signed with the content provder's RSA private key.");
+W("Peers can search for <tt>NBlock</tt>s in order to find out more about a 
namespace.");
+EP();
+
+H3("KNBlocks");
+BP();
++W("GNUnet implements <tt>KNBlocks</tt> which are <tt>KBlocks</tt> that, 
instead of encrypting a CHK and metadata, encrypt an <tt>NBlock</tt> instead.");
+W("In other words, <tt>KNBlocks</tt> enable GNUnet to find <tt>NBlocks</tt> 
using the global keyword search.");
+W("The rationale behind <tt>KNBlock</tt>s and <tt>NBlock</tt>s is to enable 
peers to discover namespaces via keyword searches, and, to associate useful 
information with namespaces.");
+W("When GNUnet finds <tt>KNBlocks</tt> during a normal keyword search, it adds 
the information to an internal list of discovered namespaces.");
+W("Users looking for interesting namespaces can then inspect this list, 
reducing the need for out-of-band discovery of namespaces.");
+W("Naturally, namespaces can also be referenced from directories, but 
<tt>KNBlock</tt>s should make it easier to advertise namespaces for the owner 
of the pseudonym since they eliminate the need to first create a directory.");
+P();
+W("Collections are also advertised using <tt>KNBlock</tt>s.");
+EP();
+
+
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/faq.php3
===================================================================
--- GNUnet-docs/WWW/test/faq.php3       2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/faq.php3       2006-04-01 11:59:15 UTC (rev 2599)
@@ -25,7 +25,7 @@
 LIV(extlink_("#platform","On which platforms does GNUnet run?"));
 LIV(extlink_("#hostkey","CRC errors: the deleted hostkey problem."));
 LIV(extlink_("#database","What is the right database for me?"));
-LIV(extlink_("#delete","<tt>gnunet-delete</tt> behaves in unexpected ways."));
+LIV(extlink_("#delete","<tt>gnunet-unindex</tt> behaves in unexpected ways."));
 LIV(extlink_("#spam","How does GNUnet handle spam? or: what are namespaces and 
directories good for?"));
 LIV(extlink_("#knownbugs","Are there any known bugs?"));
 LIV(extlink_("#bugs","How do I report a bug?"));
@@ -36,10 +36,9 @@
 ANCHOR("raq");H3("What do I do if my question is not answered here?");
 BP();
 W("There are many other sources of information.");
-W("You can read additional %s, ask the question on one of the %s or look at 
the %s.",
+W("You can read additional %s, ask the question on one of the %s.",
   ARRAY(intlink_("documentation.php3", "documentation"),
-       intlink_("mailinglist.php3","mailing lists"),
-       extlink_("http://www.angelfire.com/super2/duologue/gnunet/";, 
"alternative FAQ")));
+       intlink_("mailinglist.php3","mailing lists")));
 EP();
 
 ANCHOR("license");H3("Is the code free?");
@@ -48,6 +47,7 @@
 W("GNUnet is free software, available under the %s (GPL).",
   extlink_("http://www.gnu.org/copyleft/gpl.html";,
            "GNU Public License"));
+W("You are free to run, distribute or modify the code under the terms stated 
in that license.");
 W("We are a part of the %s.",
   extlink_("http://www.gnu.org/","GNU project"));
 EP();
@@ -56,46 +56,50 @@
 W("The general answer is, when it is ready.");
 W("A better answer may be, earlier if you contribute (test, debug, code, 
document).");
 W("Every release will be anounced on the %s mailing list and on %s.",
-  
ARRAY(extlink_("http://mail.gnu.org/mailman/listinfo/info-gnunet","Announcements";),
-       extlink_("http://freshmeat.net/projects/gnunet/","freshmeat";)));
+  ARRAY(extlink_("http://mail.gnu.org/mailman/listinfo/info-gnunet";,
+        "Announcements"),
+       extlink_("http://freshmeat.net/projects/gnunet/";,
+        "freshmeat")));
 W("You can subscribe to the mailing list or to the project on freshmeat to 
automatically receive a notification.");
 EP();
 ANCHOR("gui");H3("Is there a GUI?");
 BP();
 W("Yes, it&#8217;s called <tt>gnunet-gtk</tt>.");
 W("The GUI supports searching, downloading and inserting files.");
-W("Before starting <tt>gnunet-gtk</tt> you should start the GNUnet server, 
<tt>gnunetd</tt>.");
-W("You may also want to wait a couple of minutes to give <tt>gnunetd</tt> the 
time to connect to other peers.");
 P();
 W("If you prefer the shell for everything, that&#8217;s easy, too.");
 W("First, use <tt>gnunet-search</tt> to search for content:");
 P();
-PRE("# gnunet-search GPL\n" .
-    "gnunet-download -o &quot;COPYING&quot; -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992\n"
 .
-    "=> The GNU Public License <= (mimetype: text/plain)");
+PRE("$ ~/bin/gnunet-search GPL\n" .
+    
"gnunet://ecrs/chk/9E4MDN4VULE8KJG6U1C8FKH5HA8C5CHSJTILRTTPGK8MJ6VHORERHE68JU8Q0FDTOH1DGLUJ3NLE99N0ML0N9PIBAGKG7MNPBTT6UKG.1I823C58O3LKS24LLI9KB384LH82LGF9GUQRJHACCUINSCQH36SI4NF88CMAET3T3BHI93D4S0M5CC6MVDL1K8GFKVBN69Q6T307U6O.17992:\n"
 .
+    "gnunet-download -o &quot;COPYING&quot; 
gnunet://ecrs/chk/9E4MDN4VULE8KJG6U1C8FKH5HA8C5CHSJTILRTTPGK8MJ6VHORERHE68JU8Q0FDTOH1DGLUJ3NLE99N0ML0N9PIBAGKG7MNPBTT6UKG.1I823C58O3LKS24LLI9KB384LH82LGF9GUQRJHACCUINSCQH36SI4NF88CMAET3T3BHI93D4S0M5CC6MVDL1K8GFKVBN69Q6T307U6O.17992\n"
 .
+    "                    filename: COPYING\n" .
+    "                 description: The GNU Public License\n" .
+    "                      author: RMS\n" .
+    "            publication date: Sat Jun 25 08:29:13 2005");
 P();
 W("The output above is the result of searching for the keyword 
&#8220;GPL&#8221;.");
 W("<tt>gnunet-search</tt> will immediately start searching GNUnet and print 
new results (no duplicates) to the screen.");
-W("The first line is the information that is required to retrieve the file 
(query-hash, key-hash, crc (in hex) and the size of the file, here 17992 
bytes.");
+W("The first line is the information that is required to retrieve the file 
(query-hash, key-hash, and the size of the file, here 17992 bytes).");
 P();
-W("The second line contains a description of the file.");
+W("This is followed by additional information about the file.");
 W("In order to download the file, use");
 P();
-PRE("# gnunet-download -o &quot;COPYING&quot; -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992");
+PRE("$ gnunet-download -o &quot;COPYING&quot; -- 
gnunet://ecrs/chk/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992");
 P();
 W("where <tt>COPYING</tt> is the suggested filename.");
 P();
 W("If you want to add content to GNUnet, use");
 EP();
-PRE("# gnunet-insert -f COPYING -D &quot;The GNU Public License&quot; -k GPL 
-k COPYING -k Gnu -k GNU -k Public -k License -m text/plain -k FSF");
+PRE("$ gnunet-insert -m &quot;description:The GNU Public License&quot; -k GPL 
-k GNU -m mimetype:text/plain -m author:RMS COPYING");
 P();
-W("where <tt>COPYING</tt> is the filename and the arguments are the 
description of the file (in quotation marks) followed by a list of keywords.");
+W("where <tt>COPYING</tt> is the filename and the arguments are the 
description of the file (<tt>-m</tt> options) and <tt>-k</tt> is used to 
specify additional keywords.");
 EP();
 
 ANCHOR("GNUweb");H3("Is it possible to use GNUnet via a browser as an 
anonymous WWW?");
 BP();
 W("There is currently no proxy (like fproxy in Freenet) for GNUnet that would 
make it accessible with a browser.");
-W("It is possible to build such a proxy and all one needs to know is the 
protocol used between browser and proxy and a swift look at the sources in 
<tt>src/applications/afs/tools/</tt>.");
+W("It is possible to build such a proxy and all one needs to know is the 
protocol used between browser and proxy and a swift look at the sources in 
<tt>src/applications/fs/tools/</tt>.");
 P();
 W("The real question is, whether or not this is a good idea.");
 W("In order to achieve anonymity, the AFS file sharing service implemented on 
top of GNUnet has a much higher latency than the WWW.");
@@ -122,7 +126,7 @@
 BP();
 W("For a test of slightly larger scale, you can try to download another 
&#8220;official&#8221; test content by searching for keyword <tt>alien</tt> or 
go directly for the content using:");
 P();
-PRE("# gnunet-download -o &quot;Aliensong.mpeg&quot; -- 
gnunet://afs/UFOO2C84BUC11HMHBKVJOI9380DKGBQL.EGT78G1J9CR74PCK16EQ2BIFPL0ERISN.7A1AC901.3201028");
+PRE("$ gnunet-download -o &quot;Aliensong.mpeg&quot; -- 
gnunet://ecrs/chk/MN8P2LS383SRU0N68OPRBU28J0MIOPFS1BTA7K76SJUFONHHGE6LJ33PU45ASNUTGT4AP70LQUOSN79C2IODFA7D4IU0HR9K3ASIHE8.E561C1GJ1SR99AMBM7L87RF2HKGE8L7D6JLIUGT5G7UBDPCT1FNDCMV15T00LD0U92C6JE3M93JE23PJKVF2AJRHIB3VCIC41952DOO.3201028");
 
 P();
 W("Still not satisfied?");
@@ -133,17 +137,18 @@
 BP();
 W("For building directories, GNUnet keeps track of all file identifiers that 
it has so far encountered, including search results, inserted or indexed files 
and files mentioned in downloaded directories.");
 W("This information is stored in plaintext to allow building of directories.");
-W("Users should run <tt>gnunet-directory -A</tt> to remove that information.");
+W("Users should run <tt>gnunet-directory -t</tt> to start tracking this 
information.");
 W("Note that the data is kept locally in the GNUnet directory and never send 
out into the network.");
-W("You can inspect the information with <tt>gnunet-directory -a</tt>.");
-W("It is probably a good idea to clean that database from time to time.");
+W("You can inspect the information with <tt>gnunet-directory -l</tt>.");
+W("It is probably a good idea to clean this database of your activities from 
time to time.");
+W("You can run <tt>gnunet-directory -k</tt> to remove the information 
collected so far (and to stop tracking).");
+W("Once that database has been cleaned, GNUnet can no longer tell which files 
you inserted, but it can tell you which files are indexed.");
 P();
-W("Once that database has been cleaned, GNUnet can no longer tell which files 
you inserted, but it can tell you which files are indexed.");
 W("The reason why GNUnet can not tell you which files were inserted is the 
same reason, why we distinguish between indexing and insertion: deniability.");
 W("The primary use of insertion is to give an adversary no easy way to figure 
out what files are stored on your computer, and that under the assumption that 
the adversary takes full control of you machine.");
 W("Thus, GNUnet was designed to not require any information that would allow 
it to reconstruct the inserted file without the appropriate keyword (read: 
password).");
 W("If the adversary already knows the exact content, it is still possible for 
the adversary that has control of your machine to verify that the content is 
present.");
-W("The best defence against that is to insert the content with a low priority 
and to turn on ACTIVEMIGRATION.");
+W("The best defence against that is to insert the content with a low priority 
and to turn on <tt>ACTIVEMIGRATION</tt>.");
 W("Then you can plausibly claim that the content migrated to your node from 
another peer, and that you had no way of knowing that it was there.");
 W("In either case, how well deniability serves you will depend on your local 
court.");
 W("Since there are countries where breathing can get you into jail, saying 
that you were not able to tell what your computer was storing may not be 
sufficient.");
@@ -151,14 +156,13 @@
 P();
 W("Indexed content is a slightly different story.");
 W("For indexed content, the goal for GNUnet is still to make it difficult for 
the adversary to establish from which machine the content originates 
(anonymity).");
-W("For indexed content GNUnet keeps a list of the indexed files, typically in 
<tt>~/.gnunet/data/afs/database.list</tt>.");
-W("The list is in plaintext, so it is trivial to determine the indexed files 
on a machine -- for both the user and the adversary.");
+W("For indexed content GNUnet keeps links to the indexed files, typically in 
<tt>/var/lib/GNUnet/data/shared/</tt>.");
 W("GNUnet uses the list to locate the block corresponding to a request.");
-W("Do NOT edit the file by hand.");
-W("Use <tt>gnunet-delete</tt> to remove files from the list.");
+W("Do NOT edit the directory by hand.");
+W("Use <tt>gnunet-unindex</tt> to remove files from the directory.");
 P();
-W("Also, do not move indexed files since GNUnet relies on the paths of indexed 
files to be constant.");
-W("If you must move an indexed file, use first <tt>gnunet-delete</tt>, then 
move the file, and then use <tt>gnunet-insert</tt> to re-insert the file.");
+W("Also, do not move or change indexed files since GNUnet relies on the paths 
of indexed files to be constant.");
+W("If you must move an indexed file, use first <tt>gnunet-unindex</tt>, then 
move the file, and then use <tt>gnunet-insert</tt> to re-insert the file.");
 // W("Or, alternatively, implement <tt>gnunet-move</tt> and submit the patch 
:-).");
 
 EP();
@@ -170,7 +174,7 @@
 W("GNUnet is also free software and thus the source code is available, so you 
do not have to worry about being spied upon by the software.");
 W("The following table summarizes the main differences between GNUnet and 
other systems.");
 W("The information is accurate to the best of our knowledge, but especially 
for the commercial systems that does not mean much.");
-W("The comparisson is also difficult since there are sometimes differences 
between various implementations of (almost) the same protocol.");
+W("The comparison is also difficult since there are sometimes differences 
between various implementations of (almost) the same protocol.");
 W("In general, we pick a free implementation as the reference implementation 
since it is possible to inspect the free code easily.");
 W("Also, all of these systems are changing over time and thus the data below 
may not be up-to-date.");
 W("If you find any flaws, please let us know.");
@@ -231,14 +235,14 @@
    <td class="tbl"><?php W("yes"); ?></td>
   </tr>
   <tr>
-   <th class="tbl"><?php W("Platform"); ?></th>
-   <td class="tbl"><?php W("Un*x flavours only"); ?></td>
-   <td class="tbl"><?php W("any");   ?></td>
-   <td class="tbl"><?php W("many"); ?></td>
-   <td class="tbl"><?php W("many");  ?></td>
-   <td class="tbl"><?php W("many");  ?></td>
-   <td class="tbl"><?php W("any");   ?></td>
-   <td class="tbl"><?php W("JVM");   ?></td>
+   <th class="tbl"><?php W("Language"); ?></th>
+   <td class="tbl"><?php W("C"); ?></td>
+   <td class="tbl"><?php W("often C");   ?></td>
+   <td class="tbl"><?php W("C++"); ?></td>
+   <td class="tbl"><?php W("C");  ?></td>
+   <td class="tbl"><?php W("C++");  ?></td>
+   <td class="tbl"><?php W("often C");   ?></td>
+   <td class="tbl"><?php W("Java");   ?></td>
   </tr>
   <tr>
    <th class="tbl"><?php W("Transport Protocol"); ?></th>
@@ -252,13 +256,13 @@
   </tr>
   <tr>
    <th class="tbl"><?php W("Query Format (UI)"); ?></th>
-   <td class="tbl"><?php W("keywords or AFS URIs"); ?></td>
+   <td class="tbl"><?php W("keywords / ECRS URIs"); ?></td>
    <td class="tbl"><?php W("keywords");       ?></td>
    <td class="tbl"><?php W("filename, THEX"); ?></td>
    <td class="tbl"><?php W("filename, SHA");  ?></td>
    <td class="tbl"><?php W("filename, MD4?"); ?></td>
    <td class="tbl"><?php W("filename, SHA");  ?></td>
-   <td class="tbl"><?php W("secret key");     ?></td>
+   <td class="tbl"><?php W("secret key, CHK");     ?></td>
   </tr>
   <tr>
    <th class="tbl"><?php W("Routing"); ?></th>
@@ -291,16 +295,71 @@
          not really do it yet.  The others, well, probably not
          at all, but I&#8217;m not sure that we have a strong story
          at this point.  */
+BP();
+W("Another important point of reference are the various anonymous peer-to-peer 
networks.");
+W("Here, there are differences in terms of application domain and how 
specifically anonymity is achieved.");
+W("Anonymous routing is a hard research topic, so for a superficial 
comparisson like this one we focus on the latency.");
+W("Another important factor is the programming language.");
+W("Type-safe languages may offer certain security benefits; however, this may 
come at the cost of significant increases in resource consumption which in turn 
may reduce anonymity.");
+EP();
+?>
+<center>
+ <table border="0" cellspacing="0" cellpadding="0" width="90%">
+  <tr>
+   <th class="tbl"><?php W("Network"); ?></th>
+   <th class="tbl"><?php 
W("%s",extlink_("http://www.gnu.org/software/gnunet/";, "GNUnet")); ?></th>
+   <th class="tbl"><?php W("%s",extlink_("http://tor.eff.org/";, "Tor")); 
?></th>
+   <th class="tbl"><?php W("%s",extlink_("http://www.invisiblenet.net/iip/";, 
"IIP")); ?></th>
+   <th class="tbl"><?php W("%s",extlink_("http://www.i2p.net/","I2P";)); ?></th>
+   <th class="tbl"><?php W("%s",extlink_("http://mute-net.sourceforge.net/";, 
"Mute")); ?></th>
+   <th class="tbl"><?php 
W("%s",extlink_("http://www.freenetproject.org/","Freenet";)); ?></th>
+   <th class="tbl"><?php 
W("%s",extlink_("http://mixminion.net/","Mixminion";)); ?></th>
+  </tr>
+  <tr>
+   <th class="tbl"><?php W("Latency"); ?></th>
+   <td class="tbl"><?php W("medium"); ?></td>
+   <td class="tbl"><?php W("low"); ?></td>
+   <td class="tbl"><?php W("low"); ?></td>
+   <td class="tbl"><?php W("low"); ?></td>
+   <td class="tbl"><?php W("low"); ?></td>
+   <td class="tbl"><?php W("low"); ?></td>
+   <td class="tbl"><?php W("high"); ?></td>
+  </tr>
+  <tr>
+   <th class="tbl"><?php W("Application"); ?></th>
+   <td class="tbl"><?php W("file-sharing"); ?></td>
+   <td class="tbl"><?php W("TCP tunnel / HTTP"); ?></td>
+   <td class="tbl"><?php W("IRC"); ?></td>
+   <td class="tbl"><?php W("TCP tunnel / IRC"); ?></td>
+   <td class="tbl"><?php W("file-sharing"); ?></td>
+   <td class="tbl"><?php W("file-sharing"); ?></td>
+   <td class="tbl"><?php W("E-mail"); ?></td>
+  </tr>
+  <tr>
+   <th class="tbl"><?php W("Language"); ?></th>
+   <td class="tbl"><?php W("C"); ?></td>
+   <td class="tbl"><?php W("C");  ?></td>
+   <td class="tbl"><?php W("C");  ?></td>
+   <td class="tbl"><?php W("Java");  ?></td>
+   <td class="tbl"><?php W("C++"); ?></td>
+   <td class="tbl"><?php W("Java");  ?></td>
+   <td class="tbl"><?php W("Python/C");  ?></td>
+  </tr>
 
+ </table>
+</center>
+<?php
+
+
 ANCHOR("anonymity"); H3("What do you mean by &#8220;anonymity&#8221;?");
 BP();
 W("Anonymity is the lack of distinction of an individual from a (large) 
group.");
-W("A central goal for GNUnet AFS is to make all users (peers) form a group and 
to make communications in that group anonymous, that is, nobody (but the 
initiator) should be able to tell which of the peers in the group originated 
the message.");
-W("It should be impossible for an adversary to distinguish between the 
originating peer and all other peers.");
-W("In particular, even peers should not be able to recognize from which node 
the message originated.");
+W("A central goal for anonymous file-sharing in GNUnet is to make all users 
(peers) form a group and to make communications in that group anonymous, that 
is, nobody (but the initiator) should be able to tell which of the peers in the 
group originated the message.");
+W("In other words, it should be difficult to impossible for an adversary to 
distinguish between the originating peer and all other peers.");
+W("In particular, even peers should not be able to recognize from which node 
the message originated, after all, the adversary could control one or more of 
the peers.");
 P();
 W("Of course, in practice, it may be possible for a powerful adversary to do 
some analysis and potentially assign higher probabilities for being the 
originator of a message to a subset of the peers.");
-W("AFS tries to make this as hard as possible (see %s).",
+W("The GNUnet anonymity protocol tries to make this as hard as possible (see 
%s).",
   extlink_("download/aff.ps","our paper on anonymity"));
 W("The degree of anonymity (how hard it would be to distinguish an individual 
from the group) in GNUnet depends on the resources (mostly bandwidth) that the 
individual has available to achieve anonymity.");
 P();
@@ -323,7 +382,7 @@
 W("The node increases its trust in nodes that send replies to queries and 
reduces its trust in nodes that ask for content.");
 W("The %s ensures that replies are always correct and can not be made up to 
earn trust without really contributing (see also the %s paper and the %s for 
details).",
   ARRAY(intlink_("encoding.php3","GNUnet encoding"),
-       extlink_("download/esed.ps","ESED"),
+       extlink_("download/ecrs.ps","ECRS"),
        intlink_("encoding.php3","encoding page")));
 
 
@@ -347,71 +406,43 @@
 W("Packets are sent and dropped based on their priority and current load.");
 W("External shapers (like <em>token bucket filter</em>) can&#8217;t make this 
distinction and treat all GNUnet traffic as equal.");
 W("You should set GNUnets internal bandwidth limits to reflect your true 
configuration and what you can afford and <em>not use any external shaping for 
GNUnet</em>.");
-W("It&#8217;s much better to have the limits tight inside GNUnet than outside 
it.");
+W("It&#8217;s much better to have the limits enforced by <tt>gnunetd</tt> than 
by an external mechanism.");
 EP();
 
 ANCHOR("firewall");H3("How do I have to configure my firewall?");
 BP();
-W("GNUnet uses port 2086 by default.");
-W("Configure your packet filter to accept packets to port 2086 if the GNUnet 
background process gnunetd is running on the same machine.");
-W("If your firewall is a NAT box, forward packets to port 2086 to your GNUnet 
machine and tweak the configuration file gnunet.conf (Sections NETWORK, LOAD, 
UDP, TCP and NAT).");
-W("Port 2087 is used for communication between gnunetd and the client tools as 
gnunet-gtk, gnunet-search etc.");
-W("It must not be exposed to the internet.");
+W("GNUnet uses the ports 2086 and 1080 by default.");
+W("Configure your firewall to accept packets to the ports 2086 and 1080 (TCP 
and UDP) for the machine running the GNUnet daemon <tt>gnunetd</tt>.");
+W("If your firewall is a NAT box, forward packets to your GNUnet machine's 
ports 2086 and 1080 and tweak the configuration file gnunetd.conf (sections 
NETWORK, LOAD, UDP, TCP and NAT) to use the external IP of the NAT box.");
+W("Port 2087 is used for communication between <tt>gnunetd</tt> and the client 
tools as <tt>gnunet-gtk</tt>, <tt>gnunet-search</tt> etc.");
+W("There is no need to open port 2087 to the rest of the Internet.");
+P();
+W("Port 2086 is used for GNUnet's own transmission protocol, HTTP encapsulated 
GNUnet packets (\"HTTP transport\") are transmitted through port 1080 by 
default.");
+W("The HTTP transport is not necessarily required and can be disabled in 
GNUnet's configuration file.");
+W("Disabling it on firewalled systems is important, because available 
transports are advertised to other peers and activated but broken transports 
result in decreased reachability.");
 EP();
 
 ANCHOR("speed"); H3("Isn&#8217;t all this encryption going to make things 
totally slow?");
 BP();
 W("The answer to this is, that encryption is incredibly fast.");
-W("GNUnet uses mostly blowfish, a very fast and secure cipher.");
-W("What really often makes AFS slow are artificial delays that were introduced 
to make timing analysis hard and to group messages into larger packets.");
-W("The best illustration for this is the following timing results obtained by 
inserting and downloading a 3 MB binary from the local host (no real networking 
involved, only loopback).");
-W("Insertion takes (on a Celeron 667, 400 MB RAM):");
-
-P();
-PRE("real    3m38.954s\n" .
-"user    0m2.450s\n" .
-"sys     0m0.410s");
-P();
-W("For the download, it takes:");
-P();
-PRE("real    0m13.796s\n" .
-"user    0m2.150s\n" .
-"sys     0m0.660s");
-
-P();
-W("As you can see, the <em>user</em> CPU usage (how much is actually used) is 
miniscule compared to the <em>real</em> time that it took to download the 
file.");
-W("The real time is longer because the harddrive could not perform the random 
accesses to the GNUnet databases any faster.");
-W("The good news is, that as long as there is a difference between 
<em>real</em> and <em>user</em>, increasing the load on the network will not 
slow GNUnet down (in fact, it may make it faster because anonymity requires us 
to delay messages if the amount of traffic on the network is low).");
-
-P();
-
-W("The same basically applies also for the network load.");
-W("It can take quite a while to download a file from the network, even if the 
connection is 10 MBit, the file may come in at a few kb per second.");
-W("Again, the actual network utilization (at least the part generated by the 
download) will typically be fairly low (except if you are on dialup).");
-
-P();
-
-W("GNUnet thus uses CPU and network resources fairly responsibly.");
-W("The only thing that GNUnet &#8220;wastes&#8221; is time, in some sense, it 
sits idle.");
+W("GNUnet uses mostly AES-256, a very fast and secure cipher.");
+W("What really often makes anonymous file-sharing slow are artificial delays 
that were introduced to make timing analysis hard and to group messages into 
larger packets.");
 W("The reason is, that this makes it harder to correlate actions.");
 W("GNUnet must wait for enough traffic from other peers to make it plausible 
that the traffic did not originate from the local peer.");
 W("Larger delays also allow for more reordering of messages by the individual 
peer.");
-W("GNUnet peers try to maximize bandwidth utility by reordering messages.");
 W("By allowing peers to delay messages, it is easier for them to build more 
efficient messages.");
-W("Once the load in GNUnet goes up, GNUnet will increase its actual 
utilization of resources up to the maximum specified by the user (see 
gnunet.conf).");
-W("Thus, in some sense, GNUnet is slow but efficient.");
-
 P();
-
-W("The GNUnet developers are trying to make the perceived response times 
faster; yet, there is not much hope that the response times will get close to 
typical response times from other applications like the WWW.");
-W("Due to improvements in the code, the numbers quoted above may not always 
reflect the actual performance of the current version.");
-
+W("The primary cause of CPU consumption in the current implementation are 
algorithms for message scheduling.");
+W("GNUnet peers try to maximize bandwidth utility by reordering messages.");
+W("Also performing downloads in parallel can cause some significant accounting 
issues.");
+W("Many datastructures used currently are simple lists that take time linear 
to their size to operate on.");
+W("For local indexing operations the current release is typically pushing the 
limits of both the CPU and the harddrive.");
 P();
-
-W("Theoretically, it is possible that a download via GNUnet is even faster 
than a download from a crowded webserver or a single dialup user, but how 
likely this is depends in practice on the content -- and we neither promise nor 
really expect to achieve this level of performance.");
+W("We expect to use smarter, faster datastructures in the future to reduce CPU 
consumption.");
+W("The GNUnet developers are always trying to improve performance; yet, there 
is not much hope that performance will ever get close to typical response times 
from other applications like the WWW.");
+W("Theoretically, it is possible that a download via GNUnet is even faster 
than a download from a crowded webserver or a single dialup user, but how 
likely this is depends in practice on how the content is spread throughout the 
network -- and we neither promise nor really expect to achieve this level of 
performance.");
 W("While peer-to-peer networks can theoretically provide better performance 
than dedicated servers, their true strength lies in the possibility of being 
anarchistic: low administrative overhead, anonymity, no single point of 
failure.");
 W("Complete decentralization is very costly and we should thus not expect to 
outperform the centralized solution, especially not if we also want 
anonymity.");
-
 EP();
 
 ANCHOR("lastblocks"); H3("Why is downloading the last few blocks so slow?");
@@ -440,7 +471,7 @@
 W("Generally, there is the possibility of a known plaintext attack on 
keywords, but since the user has control over the keywords that are associated 
with the content he inserts, the user can take advantage of the same techniques 
used to generate reasonable passwords to defend against such an attack.");
 W("In any event, we are not trying to <i>hide</i> content; thus, unless the 
user is trying to insert information into the network that can only be shared 
with a small group of people, there is no real reason to try to obfuscate the 
content by choosing a difficult keyword anyway.");
 W("Note that it is not necessary to use keywords (or even intelligible 
keywords) at all.");
-W("The file identifiers (two hash codes, filesize and crc) can also be shared 
off-band.");
+W("The file identifiers (two hash codes and filesize) can also be shared 
off-band.");
 P();
 W("Most attacks on anonymity involve a resource battle between the attacker 
and the victim.");
 W("If the attacker has significantly more resources (bandwidth, control over 
Internet routers, many peers), anonymity can theoretically always be broken.");
@@ -457,20 +488,19 @@
 ANCHOR("platform"); H3("On which platforms does GNUnet run?");
 
 BP();
-W("GNUnet is being developed and tested under GNU/Linux for i386.");
-W("The current CVS version and version 0.3.2 and higher have been reported to 
work under Solaris, FreeBSD, NetBSD and OpenBSD.");
-W("Since 0.4.1, GNUnet should also work on big-endian architectures, 0.4.2 has 
been reported to work on Linux/PPC and Solaris.");
-W("GNUnet 0.6.5 has been reported to run successfully on Win32.");
-W("People have reported interest in porting GNUnet to OS X, but we have no 
reports of completely successful efforts for this platform (yet).");
+W("GNUnet is being developed and tested under Debian GNU/Linux for i386.");
+W("We have reports of working versions on FreeBSD, NetBSD, OpenBSD, Solaris 
and OS X.");
+W("GNUnet should work on big-endian architectures, including Linux/PPC.");
+W("GNUnet has been ported to Win32.");
 W("Patches to make it work on other platforms are always appreciated.");
 W("If you had success running GNUnet on any other platform, please report!");
 
 EP();
 
-ANCHOR("hostkey"); H3("CRC error: the deleted hostkey problem.");
+ANCHOR("hostkey"); H3("Checksum error: the deleted hostkey problem.");
 
 BP();
-W("Under certain circumstances, <tt>gnunetd</tt> will print warnings 
indicating CRC errors in messages that were received from other nodes.");
+W("Under certain circumstances, <tt>gnunetd</tt> will print warnings 
indicating checksum errors in messages that were received from other nodes.");
 W("This is most of the time not a bug and not a problem.");
 W("Everything is working ok.");
 W("What has happened most of the time is the following.");
@@ -490,17 +520,16 @@
 
 P();
 
-W("The reason why we can&#8217;t avoid this (ok, we could just not print the 
error message, but that&#8217;s not the point), is that a malicious host could 
always claim to have any address on the internet.");
+W("The reason why we can&#8217;t avoid this (ok, we could just not print the 
error message, but that&#8217;s not the point), is that a malicious host could 
always claim to have any address on the Internet.");
 W("If we have two public keys for the same host, the best we can do is try out 
both.");
 
 P();
 
-W("Checking both is very cheap, and after a while (depending on the timeout 
configured in gnunet.conf), hostkeys will eventually expire.");
+W("Checking both is very cheap, and after a while (depending on the timeout 
configured in gnunetd.conf), hostkeys will eventually expire.");
 
 P();
 
-W("You may also receive messages that will print CRC errors from clients that 
run versions of GNUnet before 0.7.0 (version mismatch).");
-W("Finally, if two nodes simultaneously perform a sessionkey exchange (A sends 
a new key to B and B at the same time sends a new key to A), there might be a 
short period of time where the nodes disagree on which key is the correct one, 
also causing CRC errors (the probability of this happening is very low, and we 
do use a timestamp in the SKEY message and use it to see which key is more 
recent, but there is still a very small probability that both nodes really send 
it at the same point in time).");
+W("You may also receive messages that will result in checksum errors from 
clients that run versions of GNUnet before 0.7.0 (protocol mismatch).");
 
 EP();
 ANCHOR("database"); H3("What is the right database for me?");
@@ -511,25 +540,25 @@
 W("<tt>mysql</tt> has good performance and the database can be repaired from 
internal failures, but its more difficult to install than any of the 
alternatives.");
 
 EP();
-ANCHOR("delete"); H3("<tt>gnunet-delete</tt> behaves in unexpected ways.");
+ANCHOR("delete"); H3("<tt>gnunet-unindex</tt> behaves in unexpected ways.");
 BP();
-W("First of all, many things can go seemingly wrong with 
<tt>gnunet-delete</tt> and one has to understand what exactly 
<tt>gnunet-delete</tt> does to avoid pitfalls.");
-W("The first thing to recall is that <tt>gnunet-delete</tt> only deletes 
blocks from the local database.");
+W("First of all, many things can go seemingly wrong with 
<tt>gnunet-unindex</tt> and one has to understand what exactly 
<tt>gnunet-unindex</tt> does to avoid pitfalls.");
+W("The first thing to recall is that <tt>gnunet-unindex</tt> only unindexes 
blocks from the local database.");
 W("Blocks that have been replicated by other peers are not removed.");
-W("This is why it is possible that a file can still be available after running 
<tt>gnunet-delete</tt>.");
-W("Also <tt>gnunet-delete</tt> does <b>not</b> delete the search-blocks 
associated with keywords.");
+W("This is why it is possible that a file can still be available after running 
<tt>gnunet-unindex</tt>.");
+W("Also <tt>gnunet-unindex</tt> does <b>not</b> unindex the search-blocks 
associated with keywords.");
 W("Thus searching for the file will still list the file as if it was there.");
-W("Part of the reason for not removing the search-blocks is that the keywords 
used when indexing are not known to gnunet-delete.");
+W("Part of the reason for not removing the search-blocks is that the keywords 
used when indexing are not known to <tt>gnunet-unindex</tt>.");
 W("A more elaborate mechanism that uses libextractor to guess which keywords 
could have been used still needs to be implemented.");
 W("In the future we also plan to time-out search-blocks to avoid the 
search-space pollution.");
 P();
-W("Another important aspect of <tt>gnunet-delete</tt> is that it may delete 
blocks <b>shared</b> with other files or within the same file.");
+W("Another important aspect of <tt>gnunet-unindex</tt> is that it may unindex 
blocks <b>shared</b> with other files or within the same file.");
 W("The reason is that blocks of identical content hash to the same identifier 
and can thus not be distinguished by GNUnet.");
 W("For highly structured content it is possible in practice that two blocks 
are identical.");
 W("GNUnet will then share the storage space for these two blocks.");
-W("When deleting a file that contains such shared blocks, GNUnet can currently 
not recognize the sharing and will remove the block even if it is still used in 
another context.");
-W("The resulting inconsistencies can result in warnings from 
<tt>gnunet-delete</tt>, as well as in downloads that do not complete.");
-W("In general, <tt>gnunet-delete</tt> should be used with caution at this 
point.");
+W("When unindexing a file that contains such shared blocks, GNUnet can 
currently not recognize the sharing and will remove the block even if it is 
still used in another context.");
+W("The resulting inconsistencies can result in warnings from 
<tt>gnunet-unindex</tt>, as well as in downloads that do not complete.");
+W("In general, <tt>gnunet-unindex</tt> should be used with caution.");
 
 
 
@@ -563,8 +592,7 @@
 W("Additionally, directories have two nice properties.");
 W("First, they are immutable, meaning that they can&prime;t be tampered with, 
but contain exactly those pointers the publisher intended.");
 W("The second property is that identical files pointed to by two directories 
waste no additional space, even if the directories were built by separate 
users.");
-W("This contrasts strongly to the case where similar files were archived by
-e.g. zip or rar, which could double the space usage over the network
+W("This contrasts strongly to the case where similar files were archived by 
e.g. zip or tar, which could double the space usage over the network
 without any speedups in retrieval time.");
 W("By using directories to group the content enables GNUnet to spread the 
identical file blocks more efficiently.");
 
@@ -616,7 +644,7 @@
 echo "</dd>";
 DT("Resolved");
 echo "<dd>";
-W("The bug has been fixed in some version of CVS or in a patch attached to the 
bug report.");
+W("The bug has been fixed in some version in Subversion or in a patch attached 
to the bug report.");
 echo "</dd>";
 DT("Closed");
 echo "<dd>";
@@ -704,19 +732,20 @@
 BP();
 W("GNUnet needs keywords such that other users can find the files.");
 W("Typing in lots of keywords is of course a major pain.");
-W("Other systems like Gnutella typically just use the filenames.");
+W("Other systems like gnutella typically just use the filenames.");
 W("Using filenames is not a good solution since they are not always very 
descriptive and/or can be a pain to produce for the content provider in the 
first place.");
 
 P();
 
 W("GNUnet uses a better approach, which is <strong>keyword 
extraction</strong>.");
-W("The library %s was developed for the purpose of extracting keywords from 
arbitrary files. If keywords can easily be extracted from your files, you 
don&#8217;t have to supply keywords by hand.",
+W("The library %s was developed for the purpose of extracting keywords from 
arbitrary files.",
   extlink_("/libextractor/","libextractor"));
-W("libextractor can also use the filename as a source for keywords.");
+W("If keywords can easily be extracted from your files, you don&#8217;t have 
to supply keywords by hand.");
+W("<tt>libextractor</tt> can also use the filename as a source for keywords.");
 
 P();
 
-W("If you have keywords in a file that should be extracted but the file format 
is not supported by libextractor, the API of the library is be simple enough 
that any C hacker who knows the file format should be able to code a plugin 
that will allow you to extract the keywords.");
+W("If you have keywords in a file that should be extracted but the file format 
is not supported by <tt>libextractor</tt>, the API of the library is be simple 
enough that any C hacker who knows the file format should be able to code a 
plugin that will allow you to extract the keywords.");
 W("If you just want filenames, <tt>libextractor</tt> can do those, too.");
 
 EP();

Modified: GNUnet-docs/WWW/test/gnunet-logo-color.png
===================================================================
(Binary files differ)

Modified: GNUnet-docs/WWW/test/gnunet-logo.png
===================================================================
(Binary files differ)

Modified: GNUnet-docs/WWW/test/gnunet.css
===================================================================
--- GNUnet-docs/WWW/test/gnunet.css     2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/gnunet.css     2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,155 +1,151 @@
-/* global css for GNUnet */
-
-ul,ol,li,div,td,th,address,blockquote,b,i,dl,dd,dt,p,h1,h2,h3,h4,h5,font.subtitle,font.lang-menu
 {
-    font-family: "Bitstream Vera Sans", "Lucida Grande", "Trebuchet MS", 
"Lucida Sans Unicode", "Luxi Sans", "Helvetica", arial, helvetica, sans-serif;
-    font-size: 12px;
-}
-     
-dt{
-  font-weight:bold;
-  margin: 10px;
-}
-
-dd {
-       margin-bottom: 12pt;
-}
-
-/* font-family = Schriftart fuer Textelemente */
-/* Arial,sans-serif = Arial und serifenlose Schrift, Wert aenderbar */
-
-h1{
-  font-size:3.5ex;
-  text-align:center;
-}
-
-h2{
-  font-size:3ex;
-  background-color:#0B8AD0;
-  color:#FFFFFF;
-  border-color:#0a6cce;
-  border-style:solid;
-  border-width:1px;
-  padding:0cm;
-  text-align:center;
-}
-
-h3{
-  font-size:2.25ex;
-  background-color:#0C95DE;
-  color:#FFFFFF;
-  border-color:#0B8AD0;
-  border-style:solid;
-  border-width:1px;
-  padding:0cm;
-  text-align:left;
-  padding-left:10pt;
-}
-
-h4{
-  font-size:2ex;
-  background-color:#3399FF;
-  color:#000000;
-  border-style:none;
-  border-width:1px;
-  padding:0cm;
-  text-align:left;
-  padding-left:10pt;
-}
-
-h5{
-  font-size:1.5ex;
-  color:#000000;
-  border-style:none;
-  border-width:1px;
-  padding:0cm;
-  text-align:left;
-  padding-left:10pt;
-}
-
-p{
-  margin: 10px;
-}
-
-pre{
-  background-color: #eee;
-  padding: 0.75em 10pt;
-  font-size: 10px;
-  border: 1px solid #ddd;
-}
-
-body{
-  background-color:#FEFEFE;
-  color:#000000;
-}
-
-pre{font-family:Courier New,Courier; color:#000000;}
-tt{font-family:Courier New,Courier; color:#0000D0;}
-
-font.title {
-  color:white;
-  font-family: "Arial","Helvetica";
-  font-size:32px;
-  font-weight: bold;
-}
-
-font.subtitle {
-  font-family: "Bitstream Vera Sans", "Lucida Grande", "Trebuchet MS", "Lucida 
Sans Unicode", "Luxi Sans", "Helvetica", arial, helvetica, sans-serif;
-  color:#d3d3d3;
-  font-size:11px;
-}
-
-font.h3 {
-  font-size:2.25ex;
-};
-
-td.menu {
-  background-color:#E4E4E4;
-  color:#FFFFFF;
-  font-size:11px;
-  font-weight: bold;
-  padding-top:2px;
-  padding-bottom:2px;
-  width: 12.5%;
-  text-align: center;
-}
-
-font.lang-menu {
-  background-color:#FFFFFF;
-  font-size:10px;
-}
-
-td.tbl {
-  text-align:center;
-  border-right:1px solid #bbbbbb;
-  border-bottom:1px solid #bbbbbb;
-  background-color:#efefef;
-}
-
-th.tbl {
-  border-right:1px solid #bbbbbb;
-  border-bottom:1px solid #bbbbbb;
-  background-color:#cccccc;
-}
-
-table.border {
-  border-left:1px solid #bbbbbb;
-  border-top:1px solid #bbbbbb;
-  margin-left: 10px;
-}
-
-/*
-table{background-color:#CCCCFF;color:#0F0F0F;}
-table.plain{background-color:#FEFEFE;color:#000000;}
-tr{background-color:#00FF00;color:#0F0F0F;}
-td{background-color:#6699FF;color:#0F0F0F;}
-th{background-color:#66CCFF;color:#0F0F0F;}
-tr.plain{background-color:#FEFEFE;color:#000000;}
-td.plain{background-color:#FEFEFE;color:#000000;}
-th.plain{background-color:#FEFEFE;color:#000000;}
-*/
-font.desc{background-color:#FFFFFF;color:#001100;}
-
-a:link{color:#0033FF; text-decoration:none;}
-a.menu:link{color:#FFFFFF; text-decoration:none;}
-a:visited{color:#0033FF; text-decoration:none;} 
-a:active{color:#EEEEEE; text-decoration:none;}
\ No newline at end of file
+/* global css for GNUnet */
+
+ul,ol,li,div,td,th,address,blockquote,b,i,dl,dd,dt,p,h1,h2,h3,h4,h5,font.subtitle,font.lang-menu
 {
+    font-family: "Bitstream Vera Sans", "Lucida Grande", "Trebuchet MS", 
"Lucida Sans Unicode", "Luxi Sans", "Helvetica", arial, helvetica, sans-serif;
+    font-size: 12px;
+}
+     
+dt{
+  font-weight:bold;
+  margin: 10px;
+}
+
+dd {
+       margin-bottom: 12pt;
+}
+
+/* font-family = Schriftart fuer Textelemente */
+/* Arial,sans-serif = Arial und serifenlose Schrift, Wert aenderbar */
+
+h1{
+  font-size:3.5ex;
+  text-align:center;
+}
+
+h2{
+  font-size:3ex;
+  background-color:#0B8AD0;
+  color:#FFFFFF;
+  border-color:#0a6cce;
+  border-style:solid;
+  border-width:1px;
+  padding:0cm;
+  text-align:center;
+}
+
+h3{
+  font-size:2.25ex;
+  background-color:#0C95DE;
+  color:#FFFFFF;
+  border-color:#0B8AD0;
+  border-style:solid;
+  border-width:1px;
+  padding:0cm;
+  text-align:left;
+  padding-left:10pt;
+}
+
+h4{
+  font-size:2ex;
+  background-color:#3399FF;
+  color:#000000;
+  border-style:none;
+  border-width:1px;
+  padding:0cm;
+  text-align:left;
+  padding-left:10pt;
+}
+
+h5{
+  font-size:1.5ex;
+  color:#000000;
+  border-style:none;
+  border-width:1px;
+  padding:0cm;
+  text-align:left;
+  padding-left:10pt;
+}
+
+p{
+  margin: 10px;
+}
+
+pre{
+  background-color: #eee;
+  padding: 0.75em 10pt;
+  font-size: 10px;
+  border: 1px solid #ddd;
+}
+
+body{
+  background-color:#FEFEFE;
+  color:#000000;
+}
+
+pre{font-family:Courier New,Courier; color:#000000;}
+tt{font-family:Courier New,Courier; color:#0000D0;}
+
+font.title {
+  color:white;
+  font-family: "Arial","Helvetica";
+  font-size:32px;
+  font-weight: bold;
+}
+
+font.subtitle {
+  font-family: "Bitstream Vera Sans", "Lucida Grande", "Trebuchet MS", "Lucida 
Sans Unicode", "Luxi Sans", "Helvetica", arial, helvetica, sans-serif;
+  color:#d3d3d3;
+  font-size:11px;
+}
+
+td.menu {
+  background-color:#E4E4E4;
+  color:#FFFFFF;
+  font-size:11px;
+  font-weight: bold;
+  padding-top:2px;
+  padding-bottom:2px;
+  width: 12.5%;
+  text-align: center;
+}
+
+font.lang-menu {
+  background-color:#FFFFFF;
+  font-size:10px;
+}
+
+td.tbl {
+  text-align:center;
+  border-right:1px solid #bbbbbb;
+  border-bottom:1px solid #bbbbbb;
+  background-color:#efefef;
+}
+
+th.tbl {
+  border-right:1px solid #bbbbbb;
+  border-bottom:1px solid #bbbbbb;
+  background-color:#cccccc;
+}
+
+table.border {
+  border-left:1px solid #bbbbbb;
+  border-top:1px solid #bbbbbb;
+  margin-left: 10px;
+}
+
+/*
+table{background-color:#CCCCFF;color:#0F0F0F;}
+table.plain{background-color:#FEFEFE;color:#000000;}
+tr{background-color:#00FF00;color:#0F0F0F;}
+td{background-color:#6699FF;color:#0F0F0F;}
+th{background-color:#66CCFF;color:#0F0F0F;}
+tr.plain{background-color:#FEFEFE;color:#000000;}
+td.plain{background-color:#FEFEFE;color:#000000;}
+th.plain{background-color:#FEFEFE;color:#000000;}
+*/
+font.desc{background-color:#FFFFFF;color:#001100;}
+
+a:link{color:#0033FF; text-decoration:none;}
+a.menu:link{color:#FFFFFF; text-decoration:none;}
+a:visited{color:#333366; text-decoration:none;}
+a:active{color:#EEEEEE; text-decoration:none;}

Modified: GNUnet-docs/WWW/test/hacking.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking.php3   2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/hacking.php3   2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,81 +1,97 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Copyright and Philosophy";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-P();
-HR();
-ANCHOR("design");H3("System Design");
-
-BP();
-W("This section is intented to be an introduction to programmers that want to 
extend the framework.");
-W("GNUnet has a layered design.");
-W("The basic goal for the layering is this:");
-EP();
-
-img("gnunet-design.png", "GNUnet layering", "CENTER", 401, 421, 0, 10, 10);
-?>
-<table border="0" cellspacing="0" cellpadding="0">
-<tr>
-<th class="tbl"><?php W("Layer"); ?></th>
-<th class="tbl"><?php W("Example"); ?></th>
-<th class="tbl"><?php W("code in"); ?></th>
-<tr>
-<th class="tbl"><?php W("User Interface(s)"); ?></th>
-<td class="tbl"><?php W("gnunet-search"); ?></td>
-<td class="tbl">applications/fs/tools/</td>
-</tr>
-<tr>
-<th class="tbl"><?php W("Application Logic"); ?></th>
-<td class="tbl"><?php W("file sharing"); echo ", "; W("statistics"); ?></td>
-<td class="tbl">applications/fs/module/, applications/stats/</td>
-</tr>
-<tr>
-<th class="tbl"><?php W("Core"); ?></th>
-<td class="tbl"><?php W("gnunetd"); ?></td>
-<td class="tbl">server/</td>
-</tr>
-<tr>
-<th class="tbl"><?php W("Transport"); ?></th>
-<td class="tbl"><?php W("UDP"); echo " "; W("TCP"); ?></td>
-<td class="tbl">transports/</td>
-</tr>
-</table>
-<?php
-BP();
-W("The GNUnet core is structured into a complex set of smaller modules.");
-W("These modules are responsible for specific aspects of the system, like 
sessionkey exchange, peer advertisements, topology management or the 
transports.");
-W("The following picture illustrates the dependencies between these 
fundamental modules in the GNUnet core:");
-EP();
-img("overview.png", "GNUnet Core Overview", "CENTER", 746, 598, 0, 10, 10);
-BP();
-W("The responsibilities of the individual modules are split as follows:");
-EP();
-echo "<dl>";
-DT("identity");
-DD("Keeping track of known peers, how much we trust them and what their 
current addresses are");
-DT("advertising");
-DD("Telling other peers about our addresses and forwarding advertisements");
-DT("pingpong");
-DD("Sending PING messages to confirm that another peer is alive and 
notifications if other peers respond to our PINGs.");
-DT("session");
-DD("Establishing encrypted sessions with other peers");
-DT("transport");
-DD("Hanlding of multiple low-level transports for direct communication with 
other peers (with UDP-like semantics)");
-DT("topology");
-DD("Maintaining a diverse set of connections with other peers, that is 
deciding with which peers to establish connections at what time");
-DT("bootstrap");
-DD("Using external means to learn about other peers to initially connect to 
the network (i.e. HTTP download of the hostlist)");
-DT("fragmentation");
-DD("Breaking of large (up to 64k) messages into smaller messages that fit the 
constraints of the MTU of the transport");
-DT("core");
-DD("Loading of modules, registering of handlers, event loops.");
-echo "</dl>";
-BP();
-W("The following sections describe various aspects of the GNUnet code in more 
detail:");
-EP();
-include("hacking_index.inc");
-
-include("html_footer.php3");
-?>
\ No newline at end of file
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Copyright and Philosophy";
+$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
+include("html_header.php3");
+
+P();
+HR();
+ANCHOR("design");H3("System Design");
+
+BP();
+W("This section is intented to be an introduction to programmers that want to 
extend the framework.");
+W("GNUnet has a layered design.");
+W("An extremely high-level, simplified view is this:");
+EP();
+
+img("gnunet-design.png", "GNUnet layering", "CENTER", 401, 421, 0, 10, 10);
+?>
+<center>
+<table border="0" cellspacing="0" cellpadding="0">
+<tr>
+<th class="tbl"><?php W("Layer"); ?></th>
+<th class="tbl"><?php W("Example"); ?></th>
+<th class="tbl"><?php W("code in"); ?></th>
+<tr>
+<th class="tbl"><?php W("User Interface(s)"); ?></th>
+<td class="tbl"><?php W("gnunet-search"); ?></td>
+<td class="tbl">applications/fs/tools/</td>
+</tr>
+<tr>
+<th class="tbl"><?php W("Application Logic"); ?></th>
+<td class="tbl"><?php W("file sharing"); echo ", "; W("statistics"); ?></td>
+<td class="tbl">applications/fs/module/, applications/stats/</td>
+</tr>
+<tr>
+<th class="tbl"><?php W("Core"); ?></th>
+<td class="tbl"><?php W("gnunetd"); ?></td>
+<td class="tbl">server/</td>
+</tr>
+<tr>
+<th class="tbl"><?php W("Transport"); ?></th>
+<td class="tbl"><?php W("UDP"); echo " "; W("TCP"); ?></td>
+<td class="tbl">transports/</td>
+</tr>
+</table>
+</center>
+<?php
+BP();
+W("The GNUnet core is structured into a complex set of smaller modules.");
+W("These modules are responsible for specific aspects of the system, like 
sessionkey exchange, peer advertisements, topology management or the 
transports.");
+W("The following picture illustrates the dependencies between these 
fundamental modules in the GNUnet core:");
+EP();
+img("overview.png", "GNUnet Core Overview", "CENTER", 746, 598, 0, 10, 10);
+BP();
+W("The responsibilities of the individual modules are split as follows:");
+EP();
+echo "<dl>";
+DT("identity");
+DD("Keeping track of known peers, how much we trust them and what their 
current addresses are");
+DT("advertising");
+DD("Telling other peers about our addresses and forwarding advertisements");
+DT("bootstrap");
+DD("Using external means to learn about other peers to initially connect to 
the network (i.e. HTTP download of the hostlist)");
+DT("fragmentation");
+DD("Breaking of large (up to 64k) messages into smaller messages that fit the 
constraints of the MTU of the transport");
+DT("pingpong");
+DD("Sending PING messages to confirm that another peer is alive and 
notifications if other peers respond to our PINGs.");
+DT("session");
+DD("Establishing encrypted sessions with other peers");
+DT("topology");
+DD("Maintaining a diverse set of connections with other peers, that is 
deciding with which peers to establish connections at what time");
+DT("transport");
+DD("Hanlding of multiple low-level transports for direct communication with 
other peers (with UDP-like semantics)");
+echo "</dl>";
+BP();
+W("The core itself is responsible for loading of modules, registering of 
handlers and the event loops.");
+W("Various helper services exist for building applications.");
+W("The most important ones are:");
+EP();
+echo "<dl>";
+DT("getoption");
+DD("Allows clients (not other peers) to query the configuration of 
<tt>gnunetd</tt> via TCP.");
+DT("rpc");
+DD("Allows applications to make remote procedure calls, that is reliable 
invocations of functions with arguments and return values at another peer.");
+DT("stats");
+DD("Keeps statistics (pair of a string and an unsigned long long value) of 
arbitrary properties of GNUnet.  The service allows other modules to add new 
statistics, the application module allows <tt>gnunet-stats</tt> to query these 
values.");
+DT("traffic");
+DD("Keeps track of how many messages of which type were recently received or 
transmitted.  Can be queried by both other modules and by clients.  Used for 
example to ensure that enough cover traffic is available for anonymous 
operations where a high level of anonymity is desired.");
+echo "</dl>";
+BP();
+
+W("The following sections describe various aspects of the GNUnet code in more 
detail:");
+EP();
+include("hacking_index.inc");
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_application.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_application.php3       2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/hacking_application.php3       2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,82 +1,81 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: writing applications";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-H4("How do I write a new application service for GNUnet?");
-BP();
-W("The directory %s contains the minimal piece of code that you will need to 
start.",
-  
extlink_("doxygen/html/template_8c-source.html","src/applications/template/"));
-W("You may also want to look at %s for a simple working example.",
-  extlink_("doxygen/html/chat_8c-source.html","src/applications/chat/"));
-P();
-W("Most simple applications will consist of two pieces of code:");
-EP();
-echo "<ol><li>";
-W("The first is a dynamic library that plugs into the GNUnet core.");
-W("This library must provide a single function which is invoked by the core 
when <tt>gnunetd</tt> starts.");
-W("This function registers a couple of callbacks with the GNUnet core in order 
to handle certain peer-to-peer messages.");
-W("Every peer-to-peer message is bounded in size (1300 octets) and must be 
bound to the appropriate application  module using a number typically defined 
in %s.",
-  extlink_("doxygen/html/gnunet__util_8h.html","src/include/gnunet_util.h"));
-W("The number must be globally unique.");
-W("The core module will be called whenever a peer-to-peer message matching a 
registered port number is received.");
-W("The core module can send messages to other nodes using the %s.",
-  
extlink_("doxygen/html/structCoreAPIForApplication.html","CoreAPIForApplication"));
-W("Typically, the module will also make use of GNUnet&rsquo;s client-server 
implementation %s to communicate with a user interface.",
-  extlink_("doxygen/html/tcpserver_8c-source.html","tcpserver"));
-W("Like with peer-to-peer messages, the service can register for client-server 
messages.");
-echo "</li><li>";
-W("The second piece of code is a user interface application.");
-W("Some implementations may even use a set of user interface applications (for 
example, the anonymous file sharing has <tt>gnunet-search</tt>, 
<tt>gnunet-insert</tt>, <tt>gnunet-download</tt> and a GUI that provides the 
combined functionality, <tt>gnunet-gtk</tt>).");
-W("It depends on the specifics of the application if it uses dynamic libraries 
or not.");
-W("The application must communicate with the service module that is loaded 
into the GNUnet core.");
-W("While any IPC mechanism should theoretically work, the preferred way that 
is used by all existing GNUnet applications is using %s, a simple TCP 
connection that communicates with the %s.",
-  ARRAY(extlink_("doxygen/html/tcpio_8c.html","tcpio"),
-       extlink_("doxygen/html/tcpserver_8c-source.html","tcpserver")));
-BR();
-W("The simplest way for a user interface to connect to the GNUnet core via TCP 
is to use the helper methods defined %s as part of the gnunet-util library; the 
library defines methods for %s and getting a client socket that is connected to 
<tt>gnunetd</tt>.",
-  ARRAY(extlink_("doxygen/html/port_8c-source.html","port.c"),
-       extlink_("doxygen/html/printhelp_8c-source.html","parsing the command 
line options")));
-echo "</li></ol>";
-
-ANCHOR("portability");H4("Portability");
-BP();
-W("The official GNUnet source maintained by the GNUnet developers supports the 
platforms listed on the downloads page.");
-W("These ports require some guidelines to be obeyed:");
-EP();
-echo "<ul>";
-echo "<li>";
-W("Avoid platform specific code outside src/util/");
-echo "</li>";
-echo "<li>";
-W("Do not use fork() or similar functions");
-echo "</li>";
-echo "<li>";
-W("Use gnunet_util_sleep() instead of sleep()");
-echo "</li>";
-echo "<li>";
-W("Use DIR_SEPARATOR and DIR_SEPARATOR_STR instead of plain slashes.");
-echo "</li>";
-echo "<li>";
-W("Use the uppercase macros defined in platform.h (CHDIR() instead of chdir(), 
CONNECT() instead of connect() etc.)");
-echo "</li>";
-echo "<li>";
-W("Use OPEN() instead of open()");
-echo "</li>";
-echo "<li>";
-W("If an I/O function is missing in platform.h, ask the GNUnet developers.");
-W("The desired function may exist on all platforms, but its behavior may be 
different.");
-echo "</li>";
-echo "<li>";
-W("Always expect I/O operations to fail with EWOULDBLOCK, even if SELECT() 
returned the fd/socket.");
-echo "</li>";
-echo "<li>";
-W("GTK functions may only be called from the main thread. Use gtkSaveCall().");
-echo "</li>";
-echo "</ul>";
-P();
-
-include("html_footer.php3");
-?>
-
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: writing applications";
+$description="How to write an application service for GNUnet";
+include("html_header.php3");
+
+H4("How do I write a new application service for GNUnet?");
+BP();
+W("The directory %s contains the minimal piece of code that you will need to 
start.",
+  
extlink_("doxygen/html/template_8c-source.html","src/applications/template/"));
+W("You may also want to look at %s for a simple working example.",
+  extlink_("doxygen/html/chat_8c-source.html","src/applications/chat/"));
+P();
+W("Most simple applications will consist of two pieces of code:");
+EP();
+echo "<ol><li>";
+W("The first is a dynamic library that plugs into the GNUnet core.");
+W("This library must provide a single function which is invoked by the core 
when <tt>gnunetd</tt> starts.");
+W("This function registers a couple of callbacks with the GNUnet core in order 
to handle certain peer-to-peer messages.");
+W("Every peer-to-peer message is bounded in size (about 60.000 octets) and 
must be bound to the appropriate application  module using a unique message 
identifier typically defined in %s.",
+  
extlink_("doxygen/html/gnunet__protocols_8h.html","src/include/gnunet_protocols.h"));
+W("The registered function of the application module will be called whenever a 
peer-to-peer message matching a registered message identifier is received.");
+W("The application module can send messages to other nodes using the %s.",
+  
extlink_("doxygen/html/structCoreAPIForApplication.html","CoreAPIForApplication"));
+W("Typically, the module will also make use of GNUnet&rsquo;s client-server 
implementation %s to communicate with a user interface.",
+  extlink_("doxygen/html/tcpserver_8c-source.html","tcpserver"));
+W("Like with peer-to-peer messages, the service can register for client-server 
messages.");
+echo "</li><li>";
+W("The second piece of code is a user interface application.");
+W("Some implementations may even use a set of user interface applications (for 
example, the anonymous file sharing has <tt>gnunet-search</tt>, 
<tt>gnunet-insert</tt>, <tt>gnunet-download</tt> and a GUI that provides the 
combined functionality, <tt>gnunet-gtk</tt>).");
+W("It depends on the specifics of the application if it uses dynamic libraries 
or not.");
+W("The application must communicate with the service module that is loaded 
into the GNUnet core.");
+W("While any IPC mechanism should theoretically work, the preferred way that 
is used by all existing GNUnet applications is using %s, a simple TCP 
connection that communicates with the %s.",
+  ARRAY(extlink_("doxygen/html/tcpio_8c.html","tcpio"),
+       extlink_("doxygen/html/tcpserver_8c-source.html","tcpserver")));
+BR();
+W("The simplest way for a user interface to connect to the GNUnet core via TCP 
is to use the helper methods defined %s as part of the <tt>gnunetutil</tt> 
library; the library defines methods for %s and getting a client socket that is 
connected to <tt>gnunetd</tt>.",
+  ARRAY(extlink_("doxygen/html/port_8c-source.html","port.c"),
+       extlink_("doxygen/html/printhelp_8c-source.html","parsing the command 
line options")));
+echo "</li></ol>";
+
+ANCHOR("portability");H4("Portability");
+BP();
+W("The official GNUnet source maintained by the GNUnet developers supports the 
platforms listed on the downloads page.");
+W("These ports require some guidelines to be obeyed:");
+EP();
+echo "<ul>";
+echo "<li>";
+W("Avoid platform specific code outside of <tt>src/util/</tt>.");
+echo "</li>";
+echo "<li>";
+W("Do not use <tt>fork()</tt> or similar functions.");
+echo "</li>";
+echo "<li>";
+W("Use <tt>gnunet_util_sleep()</tt> instead of <tt>sleep()</tt>.");
+echo "</li>";
+echo "<li>";
+W("Use <tt>DIR_SEPARATOR</tt> and <tt>DIR_SEPARATOR_STR</tt> instead of plain 
slashes.");
+echo "</li>";
+echo "<li>";
+W("Use the uppercase macros defined in <tt>platform.h</tt> (for example, 
<tt>CHDIR()</tt> instead of <tt>chdir()</tt>, <tt>CONNECT()</tt> instead of 
<tt>connect()</tt>).");
+echo "</li>";
+echo "<li>";
+W("Use <tt>fileopen()</tt> instead of <tt>open()</tt>");
+echo "</li>";
+echo "<li>";
+W("If an I/O function is missing in platform.h, ask the GNUnet developers.");
+W("The desired function may exist on all platforms, but its behavior may be 
different.");
+echo "</li>";
+echo "<li>";
+W("Always expect I/O operations to fail with <tt>EWOULDBLOCK</tt>, even if 
<tt>SELECT()</tt> returned the descriptor as ready.");
+echo "</li>";
+echo "<li>";
+W("GTK functions may only be called from the main thread.  Use 
<tt>gtkSaveCall()</tt> from the <tt>gnunetgtk_comon</tt> library before making 
any GTK calls.");
+echo "</li>";
+echo "</ul>";
+P();
+
+include("html_footer.php3");
+?>
+

Modified: GNUnet-docs/WWW/test/hacking_future.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_future.php3    2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_future.php3    2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,36 +1,37 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Future Work";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-ANCHOR("future");H3("Future Work");
-BP();
-W("Code contributions (GPL) are generally welcome.");
-W("Before writing a larger patch, you may want to discuss the idea on the 
developer mailinglist first.");
-P();
-W("Some ideas (in random order, contacts listed are people that seem to have 
given the idea some thought and/or may even have some code):");
-EP();
-echo "<ul>";
-LI("improve performance (create simulator/testbed, improve heuristics)");
-LI("improve documentation");
-LI("translate (documentation, user interface, messages, man-pages)");
-LI("more powerful user-interfaces (preferences, non-gtk+).");
-LI("write more extractors for %s (%s)",
-   ARRAY(extlink_("/libextractor/","libextractor"),
-        extlink_("mailto:address@hidden","contact";)));
-LI("How about pseudonym based E-mail with accounting to fight Spam? E-mail 
without a central server at some ISP would also get rid of the pain with 
changing the address ever again.");
-LI("fix %s",
-   extlink_("https://gnunet.org/mantis/","bugs";));
-LI("port to OS X");
-LI("improve HTTP compatibility of HTTP transport service");
-echo "</ul>";
-BP();
-W("And if you want to go totally crazy:");
-EP();
-echo "<ul>";
-LI("distributed computation (sandboxing!?)");
-LI("add steganography to existing transport protocols");
-echo "</ul>";
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Future Work";
+$description="Future work for GNUnet hackers";
+include("html_header.php3");
+
+ANCHOR("future");H3("Future Work");
+BP();
+W("Code contributions (GPL) are generally welcome.");
+W("Before writing a larger patch, you may want to discuss the idea on the 
developer mailinglist first.");
+P();
+W("Some ideas (in random order, contacts listed are people that seem to have 
given the idea some thought and/or may even have some code):");
+EP();
+echo "<ul>";
+LI("improve performance (create simulator/testbed, improve heuristics)");
+LI("improve documentation");
+LI("translate (documentation, user interface, messages, man-pages)");
+LI("more powerful user-interfaces (preferences, non-gtk+).");
+LI("write more extractors for %s (%s)",
+   ARRAY(extlink_("/libextractor/","libextractor"),
+        extlink_("mailto:address@hidden","contact";)));
+LI("fix %s",
+   extlink_("https://gnunet.org/mantis/","bugs";));
+LI("improve HTTP compatibility of HTTP transport service");
+LI("package binaries for various platforms");
+LI("design and implement a resillient, privacy-respecting chat protocol");
+echo "</ul>";
+BP();
+W("And if you want to go totally crazy:");
+EP();
+echo "<ul>";
+LI("distributed computation (sandboxing!?)");
+LI("How about pseudonym based E-mail with accounting to fight Spam? E-mail 
without a central server at some ISP would also get rid of the pain with 
changing the address ever again.");
+LI("add steganography to existing transport protocols");
+echo "</ul>";
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_organization.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_organization.php3      2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/hacking_organization.php3      2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,97 +1,99 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Code Organization";
-$description="Overview over the GNUnet source code for developers";
-include("html_header.php3");
-
-ANCHOR("libraries");H3("GNUnet libraries");
-
-BP();
-W("GNUnet is divided into several libraries.");
-W("Some libraries are statically linked (rare), some are shared libraries and 
many are plugins into the GNUnet core.");
-P();
-W("Static libraries are used for more internal re-use of code.");
-W("For example, the static gnunet-core library is used by the GNUnet deaemon 
and by various testcases and diagnostic tools.");
-P();
-W("Shared libraries are used whenever multiple tools share code.");
-W("The general OS abstraction library, gnunet-util as well as libraries like 
libgnunet-ecrs that are used by multiple user interfaces belong into this 
category.");
-P();
-W("Finally, plugins are used for all of the code that is dynamically loaded by 
the gnunet daemon when needed.");
-W("This keeps the code for gnunetd small and modular.");
-W("Modules fall into two subcategories, services and applications.");
-W("Services are useless by themselves and only provide functionality for 
applications.");
-W("A simple example for a service is message fragmentation, which is a module 
that breaks larger messages into smaller messages and re-assembles them at the 
destination.");
-W("Some services are required by the GNUnet core, others are purely 
optional.");
-W("By convention, the names for header files for service plugins end in 
<tt>_service.h</tt>.");
-W("Application modules provide useful services that are exposed to the user 
via user interfaces.");
-W("Examples for application modules are the file-sharing or the chat 
application modules.");
-W("Application modules typically also provide one or more shared libraries to 
make it easier to write user interfaces for these applications.");
-W("By convention, the names of the header files for these convenience 
libraries end in <tt>_lib.h</tt>.");
-W("Note that the application modules themselves do not define a header file 
since they are accessed using a set of client-server messages exchanged using 
code from gnunet-util and the GNUnet core.");
-EP();
-
-ANCHOR("overview");H3("Important header files and libraries");
-
-BP();
-W("The most important modules in GNUnet are:");
-EP();
-echo "<ul>\n";
-LI(extlink_("#protocols","gnunet_protocols.h"));
-LI(intlink_("hacking_util.php3","gnunet_util.h"));
-LI(extlink_("#transport","gnunet_transport.h"));
-LI(extlink_("#core","gnunet_core.h"));
-echo "</ul>\n";
-
-
-ANCHOR("protocols");H4("gnunet_protocols.h");
-BP();
-W("The <tt>gnunet_protocols.h</tt> include file also defines all GNUnet 
message ID numbers.");
-W("While these ID numbers belong to individual modules, defining them all in 
one place makes it trivial to avoid conflicting assignments.");
-W("Thus, whenever a new type of message is defined, it should be given a 
globally unique number in <tt>gnunet_protocols.h</tt> as soon as possible.");
-W("The most important sets of constants are the client-server protocol message 
types, the peer-to-peer protocol message types, the transport service 
identifiers and the ECRS block types.");
-
-EP();
-ANCHOR("transport");H4("gnunet_transport.h");
-BP();
-W("This header primarily defines the functions that any GNUnet transport 
service must implement.");
-W("The semantic of the transport service are essentially those of UDP:");
-W("out-of-order, unreliable, unencrypted delivery of bounded-size messages.");
-W("Each transport type can also define its own addressing scheme.");
-EP();
-ANCHOR("core");H4("gnunet_core.h");
-BP();
-W("This header defines the API that can be used by GNUnet modules.");
-W("It provides functions to register listeners for certain events (like 
messages from peers and local user interface clients), to load additional 
services, and to send messages to other peers.");
-
-EP();
-ANCHOR("flow");H3("Global data-flow in GNUnet");
-
-BP();
-W("There are two typical flows for data in GNUnet.");
-W("Note that this text describes the flow of the data, several threads and 
processes are involved in this.");
-P();
-W("First, a client such as %s or %s connects (via a secure TCP connection, 
typically
-loopback) to the %s.",
-  ARRAY(extlink_("doxygen/html/gnunetsearch_8c.html","gnunet-search"),
-       extlink_("doxygen/html/gnunetinsert_8c.html","gnunet-insert"),
-       extlink_("doxygen/html/tcpserver_8c.html","tcpserver")));
-W("A common request is a %s which is handed by the TCPSERVER in the GNUnet 
CORE to the FS service, which then passes the query to the %s for routing.",
-  ARRAY(extlink_("doxygen/html/structTCP__Query__Request.html","query"),
-       extlink_("doxygen/html/gnunet__gap__service_8h.html","GAP service")));
-W("The GAP service then produces a query which is enqueued in the %s module of 
the CORE for transmission to other peers.",
-  extlink_("#connection","connection"));
-W("After a while, the entire buffer is flushed and send to the destination(s) 
with a help from the %s and %s modules.",
-  ARRAY(extlink_("doxygen/html/gnunet__identity__service_8h.html","identity"),
-       
extlink_("doxygen/html/gnunet__transport__service_8h.html","transport")));
-W("The peer-to-peer message is then transmitted via a transport service, such 
as the %s transport.",
-  extlink_("doxygen/html/udp_8c.html","udp"));
-P();
-W("The second path comes into play after gnunetd receives a message on any 
transport mechanism.");
-W("The message is %s according to its message type.",
-  extlink_("doxygen/html/handler_8c.html#a14","demultiplexed"));
-W("If it is a query the GAP and FS modules perform a lookup and eventually 
send a reply.");
-W("The reply goes the same path back, eventually reaching the other peer where 
it is then passed to the user interface.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Code Organization";
+$description="Overview over the GNUnet source code for developers";
+include("html_header.php3");
+
+ANCHOR("libraries");H3("GNUnet libraries");
+
+BP();
+W("GNUnet is divided into several libraries.");
+W("Some libraries are statically linked (rare), some are shared libraries and 
many are plugins into the GNUnet core.");
+P();
+W("Static libraries are used for purely internal re-use of code (not used at 
this point).");
+P();
+W("Shared libraries are used whenever multiple tools share code.");
+W("The general OS abstraction library, <tt>gnunetutil</tt> as well as 
libraries like <tt>libgnunetecrs</tt> that are used by multiple user interfaces 
belong into this category.");
+P();
+W("Finally, plugins are used for all of the code that is dynamically loaded by 
the gnunet daemon (or <tt>gnunet-gtk</tt>) when needed.");
+W("This keeps the code for <tt>gnunetd</tt> small and modular.");
+W("Modules fall into four subcategories, transport-services, internal 
services, application services and finally plugins for <tt>gnunet-gtk</tt>.");
+W("Internal services are useless by themselves and only provide functionality 
for application services.");
+W("A simple example for an internal service is message fragmentation, which is 
a module that breaks larger messages into smaller messages and re-assembles 
them at the destination.");
+W("Some services are required by the GNUnet core, others are purely 
optional.");
+W("By convention, the names for header files for service plugins end in 
<tt>_service.h</tt>.");
+W("Application modules provide useful services that are exposed to the user 
via user interfaces.");
+W("Examples for application modules are the fs (file-sharing), tbench, 
tracekit and the chat application modules.");
+W("Application modules typically also provide one or more shared libraries to 
make it easier to write user interfaces for these applications.");
+W("By convention, the names of the header files for these convenience 
libraries end in <tt>_lib.h</tt>.");
+W("An example for such a convenience library is <tt>libgnunetfs</tt> with the 
header file <tt>gnunet_fs_lib.h</tt>.");
+W("In this case, the immediate API exposed by the fs application is extremely 
low-level and additional libraries (ECRS and FSUI) are used to provide 
higher-level abstractions.");
+W("Note that the application services themselves do not define a header file 
since they are accessed using a set of client-server messages exchanged using 
code from <tt>gnunetutil</tt> and the GNUnet core.");
+EP();
+
+ANCHOR("overview");H3("Important header files and libraries");
+
+BP();
+W("The most important header files in GNUnet are:");
+EP();
+echo "<ul>\n";
+LI(extlink_("#protocols","gnunet_protocols.h"));
+LI(intlink_("hacking_util.php3","gnunet_util.h"));
+LI(extlink_("#transport","gnunet_transport.h"));
+LI(extlink_("#core","gnunet_core.h"));
+echo "</ul>\n";
+
+
+ANCHOR("protocols");H4("gnunet_protocols.h");
+BP();
+W("The <tt>gnunet_protocols.h</tt> include file also defines all GNUnet 
message ID numbers.");
+W("While these ID numbers belong to individual modules, defining them all in 
one place makes it trivial to avoid conflicting assignments.");
+W("Thus, whenever a new type of message is defined, it should be given a 
globally unique number in <tt>gnunet_protocols.h</tt> as soon as possible.");
+W("The most important sets of constants are the client-server protocol message 
types, the peer-to-peer protocol message types, the transport service 
identifiers and the ECRS block types.");
+
+EP();
+ANCHOR("transport");H4("gnunet_transport.h");
+BP();
+W("This header primarily defines the functions that any GNUnet transport 
service must implement.");
+W("The semantic of the transport service are essentially those of UDP: 
out-of-order, unreliable, unencrypted delivery of bounded-size messages.");
+W("Each transport type can also define its own addressing scheme.");
+EP();
+ANCHOR("core");H4("gnunet_core.h");
+BP();
+W("This header defines the API that can be used by GNUnet modules.");
+W("It provides functions to register listeners for certain events (like 
messages from peers and local user interface clients), to load additional 
services, and to send messages to other peers.");
+
+EP();
+ANCHOR("flow");H3("Global data-flow in GNUnet");
+
+BP();
+W("There are two typical flows for data in GNUnet.");
+W("Note that this text describes the flow of the data, several threads and 
processes are involved in this.");
+P();
+W("First, a client such as %s or %s connects (via a secure TCP connection, 
typically
+loopback) to the %s.",
+  ARRAY(extlink_("doxygen/html/gnunetsearch_8c.html","gnunet-search"),
+       extlink_("doxygen/html/gnunetinsert_8c.html","gnunet-insert"),
+       extlink_("doxygen/html/tcpserver_8c.html","tcpserver")));
+W("The actuall connection operation is initiated in some helper library 
written for the specific application, in this case <tt>libgnunetfsui</tt> calls 
<tt>libgnunetecrs</tt> which calls <tt>libgnunetfs</tt> which sends the actual 
request via TCP using <tt>libgnunetutil</tt>.");
+W("A common request is a %s which is handed by the %s in the GNUnet CORE to 
the FS service, which then passes the query to the internal %s for routing.",
+  ARRAY(extlink_("doxygen/html/structTCP__Query__Request.html","query"),
+        extlink_("doxygen/html/tcpserver_8c.html","tcpserver"),
+       extlink_("doxygen/html/gnunet__gap__service_8h.html","GAP service")));
+W("The GAP service then produces a query which is enqueued in the %s module of 
the CORE for transmission to other peers.",
+  extlink_("#connection","connection"));
+W("After a while, the entire buffer is flushed and send to the destination(s) 
with a help from the %s and %s modules.",
+  ARRAY(extlink_("doxygen/html/gnunet__identity__service_8h.html","identity"),
+       
extlink_("doxygen/html/gnunet__transport__service_8h.html","transport")));
+W("The peer-to-peer message is then transmitted via a transport service, such 
as the %s transport.",
+  extlink_("doxygen/html/udp_8c.html","udp"));
+P();
+W("The second path comes into play after gnunetd receives a message on any 
transport mechanism.");
+W("The message is %s according to its message type.",
+  extlink_("doxygen/html/handler_8c.html#a14","demultiplexed"));
+W("If it is a query the GAP and FS modules perform a lookup and eventually 
send a reply.");
+W("The reply goes the same path back, eventually reaching the other peer where 
it is then passed to the user interface.");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_rpc.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_rpc.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_rpc.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,56 +1,56 @@
-<?php
-include("scripts.php3");
-$title="GNUnet Documentation";
-$description="GNUnet Documentation - Using GNUnet RPC";
-include("html_header.php3");
-
-H2("The GNUnet RPC service");
-BP();
-W("The GNUnet RPC service offers link-to-link reliable remote procedure 
calls.");
-W("The link-to-link restriction means that the peers have to be able to 
connect directly.");
-W("In other words, the GNUnet RPC service does not do any routing.");
-W("Also note that different peers may support a different subset of RPC 
messages.");
-W("Hence an application cannot expect every peer to respond to RPC calls.");
-P();
-W("GNUnet's RPC calls can be made synchronously or asynchronously.");
-W("In the synchronous case the caller is blocked until a reply has been 
received (or until the request times out).");
-W("Note that blocking arbitrary GNUnet threads in this manner is probably a 
bad idea, so blocking RPC calls should only be performed by dedicated 
threads.");
-W("The more common pattern is to use an asynchronous RPC call.");
-W("In that case the RPC service invokes a callback at the time where a reply 
is received.");
-W("Asynchronous RPC calls must be explicitly canceled to reclaim memory.");
-P();
-W("Just like invoking an RPC can be synchronous or asynchronous, the RPC 
functions themselves can be synchronous or asynchronous.");
-W("RPC functions that themselves perform RPC calls must almost always be 
defined as asynchronous to avoid possibly deadlocking the system.");
-W("Note that the size of RPC messages (paramters, return values) is currently 
limited by the MTU (minus headers) of the underlying transport used by 
GNUnet.");
-EP();
-
-H3("Arguments and return values");
-BP();
-W("GNUnet RPC functions use the opaque RPC_Param datastructure for passing 
arguments and return values.");
-W("RPC_Param allows naming parameters and returning any number of return 
values.");
-W("Naming parameters has the advantage that it is easy to add additional 
arguments in later versions.");
-W("Also, named parameters define a natural way to achieve a variable number of 
arguments.");
-W("RPC_Param also assigns each parameter an index.");
-W("This is useful if multiple values of the same kind need to be passed.");
-W("The %s header file defines various helper functions to access RPC_Param 
datastructures.",
-  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
-          "gnunet_rpc_service.h"));
-EP();
-
-H3("Using the RPC service");
-BP();
-W("In order to use the RPC service an application module must first request it 
from the GNUnet core.");
-W("The following code illustrates how to do this:");
-EP();
-?>
-<pre>
-CoreAPIForApplicaton * coreAPI = ...;
-RPC_ServiceAPI * rpc = (RPC_ServiceAPI) coreAPI->requestService("rpc");
-rpc->RPC_register("myRPCFunction", &myFunction);
-rpc->RPC_execute(&peer, "myRPCFunction", &args, &ret, 0, 5 * cronSECONDS);
-rpc->RPC_unregister("myRPCFunction", &myFunction);
-coreAPI->releaseService(rpc);
-</pre>
-<?php
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title="GNUnet Documentation: Remote Procedure Calls (RPC)";
+$description="Documentation of the GNUnet Remote Procedure Call Service (RPC)";
+include("html_header.php3");
+
+H2("The GNUnet RPC service");
+BP();
+W("The GNUnet RPC service offers link-to-link reliable remote procedure 
calls.");
+W("The link-to-link restriction means that the peers have to be able to 
connect directly.");
+W("In other words, the GNUnet RPC service does not do any routing.");
+W("Also note that different peers may support a different subset of RPC 
messages.");
+W("Hence an application cannot expect every peer to respond to RPC calls.");
+P();
+W("GNUnet's RPC calls can be made synchronously or asynchronously.");
+W("In the synchronous case the caller is blocked until a reply has been 
received (or until the request times out).");
+W("Note that blocking arbitrary GNUnet threads in this manner is probably a 
bad idea, so blocking RPC calls should only be performed by dedicated 
threads.");
+W("The more common pattern is to use an asynchronous RPC call.");
+W("In that case the RPC service invokes a callback at the time where a reply 
is received.");
+W("Asynchronous RPC calls must be explicitly canceled to reclaim memory.");
+P();
+W("Just like invoking an RPC can be synchronous or asynchronous, the RPC 
functions themselves can be synchronous or asynchronous.");
+W("RPC functions that themselves perform RPC calls must almost always be 
defined as asynchronous to avoid possibly deadlocking the system.");
+W("Note that the size of RPC messages (paramters, return values) is currently 
limited by the MTU (minus headers) of the underlying transport used by 
GNUnet.");
+EP();
+
+H3("Arguments and return values");
+BP();
+W("GNUnet RPC functions use the opaque RPC_Param datastructure for passing 
arguments and return values.");
+W("RPC_Param allows naming parameters and returning any number of return 
values.");
+W("Naming parameters has the advantage that it is easy to add additional 
arguments in later versions.");
+W("Also, named parameters define a natural way to achieve a variable number of 
arguments.");
+W("RPC_Param also assigns each parameter an index.");
+W("This is useful if multiple values of the same kind need to be passed.");
+W("The %s header file defines various helper functions to access RPC_Param 
datastructures.",
+  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
+          "gnunet_rpc_service.h"));
+EP();
+
+H3("Using the RPC service");
+BP();
+W("In order to use the RPC service an application module must first request it 
from the GNUnet core.");
+W("The following code illustrates how to do this:");
+EP();
+?>
+<pre>
+CoreAPIForApplicaton * coreAPI = ...;
+RPC_ServiceAPI * rpc = (RPC_ServiceAPI) coreAPI->requestService("rpc");
+rpc->RPC_register("myRPCFunction", &myFunction);
+rpc->RPC_execute(&peer, "myRPCFunction", &args, &ret, 0, 5 * cronSECONDS);
+rpc->RPC_unregister("myRPCFunction", &myFunction);
+coreAPI->releaseService(rpc);
+</pre>
+<?php
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_server.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_server.php3    2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_server.php3    2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,37 +1,35 @@
 <?php
 include("scripts.php3");
 $title = "GNUnet Documentation: Hacking gnunetd";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
+$description="Description of the internals of the gnunetd process";
 include("html_header.php3");
 
 H2("Understanding gnunetd");
-P();
 
+BP();
+
 W("In GNUnet, the server <tt>gnunetd</tt> is responsible for loading modules, 
demultiplexing messages from clients and other peers and queueing (encrypted) 
messages for other peers.");
 W("The core also performs bandwidth allocation and scheduling.");
 W("The core relies on implementations of the %s for the actual transport of 
packets.",
-  extlink_("doxygen/html/structTransportAPI.html","TransportAPI"));
+  extlink_("doxygen/html/structTransportAPI.html",
+           "TransportAPI"));
 W("The transport layer has, like the internet protocol (IP) and UDP, 
best-effort semantics.");
 W("There is no guarantee that a message will be delivered.");
 BR();
-W("Applications (like file-sharing) are build on top of GNUnet.");
+W("Applications (like file-sharing) are build on top of the GNUnet core; the 
core itself has no notion of file-sharing.");
 W("Applications may consist of multiple services and use the %s to access the 
GNUnet core.",
-  
extlink_("doxygen/html/structCoreAPIForApplication.html","CoreAPIForApplication"));
+  extlink_("doxygen/html/structCoreAPIForApplication.html",
+           "CoreAPIForApplication"));
 W("If necessary, applications are responsible for adding reliability (through 
retransmission) to the networking layer.");
 W("A common way to do this is by using the RPC service.");
 W("The applications are also responsible for avoiding congestion (see TCP).");
 W("While the core will enforce bandwidth limitations set by the user, services 
should implement better strategies.");
 W("Applications communicate these strategies to the core by giving their 
message a priority and a desired time for transmission.");
 W("The core then considers the available bandwidth, deadlines and priorities, 
solves the resulting knapsack problem and schedules the messages.");
-W("The following picture shows that the knapsack solver actually works to 
reduce noise.");
-W("It was obtained by first runnung GNUnet with very high CPU load (knapsack 
disabled).");
-W("Once the CPU load dropped the knapsack solver went into action and reduced 
the amount of noise.");
-IMG("knapsack_works.png", "Traffic percentages with and without knapsack", 
"CENTER", 653, 841);
-
 BR();
 W("In order to ease the implementation, GNUnet splits applications in two main 
parts.");
 W("The first part resides in the process space of <tt>gnunetd</tt>.");
-W("This part is implemented as a plugin.");
+W("This part is implemented as an application plugin and possibly additional 
service plugins.");
 W("The core will notify this lowest layer of the service of messages that have 
arrived for the service.");
 W("This layer of the application is responsible for all node-to-node 
interactions.");
 W("Typically, the layer consists of multiple service modules.");
@@ -47,6 +45,8 @@
   extlink_("doxygen/html/tcpio_8c-source.html","tcpio"));
 W("Note that the TCP connection between the application and <tt>gnunetd</tt> 
is presumed to be totally secure (i.e. via loopback).");
 W("You can specify the list of trusted IP addresses (i.e. the LAN) that are 
allowed to connect as clients to GNUnetd.");
+EP();
 
+
 include("html_footer.php3");
 ?>

Modified: GNUnet-docs/WWW/test/hacking_testcases.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_testcases.php3 2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_testcases.php3 2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,94 +1,76 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: writing testcases";
-$description="GNUnet Documentation - how to write testcases for GNUnet";
-include("html_header.php3");
-
-H2("Writing testcases for GNUnet");
-H3("Fundamentals");
-BP();
-W("Ideally, any non-trivial GNUnet code should be covered by automated 
testcases.");
-W("Testcases should reside in the same place as the code that is being 
tested.");
-W("The name of source files implementing tests should contain the word 
<tt>test</tt>.");
-W("Typically it is desireable to have testcases both for low-level functions 
and high-level abstractions.");
-W("For example, while the cryptographic functions would be tested as part of 
the session key exchange, they should also still be tested independently.");
-EP();
-H3("Integration with GNU autotools");
-BP();
-W("Testcases in GNUnet should be integrated with the autotools build system.");
-W("This way, developers and anyone building binary packages will be able to 
run all testcases simply by running <tt>make check</tt>.");
-W("The final testcases shipped with the distribution should output at most 
some brief progress information and not display debug messages.");
-W("The success or failure of a testcase must be indicated by returning zero 
(success) or non-zero (failure) from the main method of the testcase.");
-W("The integration with the autotools is relatively straightforward and only 
requires modifications to the <tt>Makefile.am</tt> in the directory containing 
the testcase.");
-W("For three testcases testing the code in  <tt>foo.c</tt>, <tt>bar.c</tt> and 
<tt>etc.c</tt>, the <tt>Makefile.am</tt> would contain the following lines:");
-EP();
-PRE("check_PROGRAMS = footest bartest etctest\n" .
-    "TESTS = $(check_PROGRAMS)\n" .
-    "footest_SOURCES = footest.c\n" .
-    "footest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n" .
-    "bartest_SOURCES = bartest.c\n" .
-    "bartest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n" .
-    "etctest_SOURCES = etctest.c\n" .
-    "etctest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n");
-BP();
-W("Naturally, other libraries used by the testcase may be specified in the 
<tt>LDADD</tt> directive as necessary.");
-P();
-W("Often testcases depend on additional input files, such as a configuration 
file.");
-W("These support files have to be listed using the <tt>EXTRA_DIST</tt> 
directive in order to ensure that they are included in the distribution.");
-W("Example:");
-EP();
-PRE("EXTRA_DIST = check.conf\n");
-BP();
-W("Executing <tt>make check</tt> will run all testcases in the current 
directory and all subdirectories.");
-W("Testcases can be compiled individually by running <tt>make footest</tt> and 
then invoked directly using <tt>./footest</tt>.");
-W("Note that due to the use of plugins in GNUnet, it is typically necessary to 
run <tt>make install</tt> before running any testcases.");
-W("Thus the canonical command <tt>make check install</tt> has to be changed to 
<tt>make install check</tt> for GNUnet.");
-EP();
-H3("Common problems and solutions");
-BP();
-W("When testing GNUnet, the splitting of the code into a daemon and clients 
often complicates testing.");
-W("The solution to this is to have the testcase <tt>fork</tt> a 
<tt>gnunetd</tt> process and then execute appropriate client actions (to test 
the client APIs or the core module or both).");
-W("If necessary, multiple daemons can be forked using different ports (!) to 
simulate a network.");
-W("However, most of the time only one <tt>gnunetd</tt> process is needed.");
-W("Also note that some client libraries were not written to communicate with 
multiple daemons over multiple trusted TCP connections at the same time, which 
may complicate testing in such situations.");
-W("Note that on exit, the testcase should shutdown <tt>gnunetd</tt> with a 
kill signal.");
-W("The following code illustrates spawning and killing a <tt>gnunetd</tt> 
process from a testcase:");
-EP();
-PRE("pid_t daemon; \n" .
-    "daemon = fork();\n" .
-    "if (daemon == 0) {\n" .
-    "  if (0 != execlp(\"gnunetd\",\n" .
-    "                 \"gnunetd\",\n" .
-    "                 \"-d\",\n" .
-    "                 \"-c\", \"check.conf\",\n" .
-    "                 NULL)) {\n" .
-    "    fprintf(stderr,\n" .
-    "            _(\"'%s' failed: %s\\n\"),\n" .
-    "            \"execlp\",\n" .
-    "            STRERROR(errno));\n" .
-    "    return -1;\n" . 
-    "  }\n" .
-    "}\n" .
-    "/* put actual testcode here */\n" .
-    "if (daemon != -1) {\n" .
-    "  if (0 != kill(daemon, SIGTERM))\n" .
-    "    DIE_STRERROR(\"kill\");\n" .
-    "  if (daemon != waitpid(daemon, &status, 0))\n" .
-    "    DIE_STRERROR(\"waitpid\");\n" .
-    "  if (WEXITSTATUS(status) == 0)\n" .
-    "    return -1; /* server had error */\n" .
-    "}\n");
-BP();
-W("An alternative way to just test modules (in particular if there is no 
client API to start with) is to implement a mock-version of the GNUnet core API 
and emulate a <tt>gnunetd</tt> environment for the module.");
-W("An example for this is the %s.",
-  extlink_("doxygen/html/fragmentationtest_8c.html", "fragmentationtest.c"));
-P();
-W("Another uncommonly used alternative is to have the testcase process itself 
load the modules by initiating the full <tt>gnunetd</tt> startup sequence.");
-W("For that, the testcase must link against <tt>libgnunetcore</tt>.");
-W("For an example see %s.",
-  extlink_("doxygen/html/gnunet-transport-check_8c.html", 
"gnunet-transport-check.c"));
-EP();
-
-include("html_footer.php3");
-?>
-
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: writing testcases";
+$description="How to write testcases for GNUnet";
+include("html_header.php3");
+
+H2("Writing testcases for GNUnet");
+H3("Fundamentals");
+BP();
+W("Ideally, any non-trivial GNUnet code should be covered by automated 
testcases.");
+W("Testcases should reside in the same place as the code that is being 
tested.");
+W("The name of source files implementing tests should contain the word 
<tt>test</tt>.");
+W("Typically it is desireable to have testcases both for low-level functions 
and high-level abstractions.");
+W("For example, while the cryptographic functions would be tested as part of 
the session key exchange, they should also still be tested independently.");
+EP();
+H3("Integration with GNU autotools");
+BP();
+W("Testcases in GNUnet should be integrated with the autotools build system.");
+W("This way, developers and anyone building binary packages will be able to 
run all testcases simply by running <tt>make check</tt>.");
+W("The final testcases shipped with the distribution should output at most 
some brief progress information and not display debug messages.");
+W("The success or failure of a testcase must be indicated by returning zero 
(success) or non-zero (failure) from the main method of the testcase.");
+W("The integration with the autotools is relatively straightforward and only 
requires modifications to the <tt>Makefile.am</tt> in the directory containing 
the testcase.");
+W("For three testcases testing the code in  <tt>foo.c</tt>, <tt>bar.c</tt> and 
<tt>etc.c</tt>, the <tt>Makefile.am</tt> would contain the following lines:");
+EP();
+PRE("check_PROGRAMS = footest bartest etctest\n" .
+    "TESTS = $(check_PROGRAMS)\n" .
+    "footest_SOURCES = footest.c\n" .
+    "footest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n" .
+    "bartest_SOURCES = bartest.c\n" .
+    "bartest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n" .
+    "etctest_SOURCES = etctest.c\n" .
+    "etctest_LDADD = $(top_builddir)/src/util/libgnunetutil.la\n");
+BP();
+W("Naturally, other libraries used by the testcase may be specified in the 
<tt>LDADD</tt> directive as necessary.");
+P();
+W("Often testcases depend on additional input files, such as a configuration 
file.");
+W("These support files have to be listed using the <tt>EXTRA_DIST</tt> 
directive in order to ensure that they are included in the distribution.");
+W("Example:");
+EP();
+PRE("EXTRA_DIST = check.conf\n");
+BP();
+W("Executing <tt>make check</tt> will run all testcases in the current 
directory and all subdirectories.");
+W("Testcases can be compiled individually by running <tt>make footest</tt> and 
then invoked directly using <tt>./footest</tt>.");
+W("Note that due to the use of plugins in GNUnet, it is typically necessary to 
run <tt>make install</tt> before running any testcases.");
+W("Thus the canonical command <tt>make check install</tt> has to be changed to 
<tt>make install check</tt> for GNUnet.");
+EP();
+H3("Common problems and solutions");
+BP();
+W("When testing GNUnet, the splitting of the code into a daemon and clients 
often complicates testing.");
+W("The solution to this is to have the testcase <tt>fork</tt> a 
<tt>gnunetd</tt> process and then execute appropriate client actions (to test 
the client APIs or the core module or both).");
+W("If necessary, multiple daemons can be forked using different ports (!) to 
simulate a network.");
+W("However, most of the time only one <tt>gnunetd</tt> process is needed.");
+W("Also note that some client libraries were not written to communicate with 
multiple daemons over multiple trusted TCP connections at the same time, which 
may complicate testing in such situations.");
+W("Note that on exit, the testcase should shutdown <tt>gnunetd</tt> with a 
kill signal.");
+W("The following code illustrates spawning and killing a <tt>gnunetd</tt> 
process from a testcase:");
+EP();
+PRE("pid_t daemon; \n" .
+    "daemon = startGNUnetDaemon(NO);\n" .
+    "/* put actual testcode here */\n" .
+    "if (daemon != -1) {\n" .
+    "  if (! termProcess(daemon))\n" .
+    "    DIE_STRERROR(\"kill\");\n" .
+    "}\n");
+BP();
+W("An alternative way to just test modules (in particular if there is no 
client API to start with) is to implement a mock-version of the GNUnet core API 
and emulate a <tt>gnunetd</tt> environment for the module.");
+W("An example for this is the %s.",
+  extlink_("doxygen/html/fragmentationtest_8c.html", "fragmentationtest.c"));
+P();
+W("Another uncommonly used alternative is to have the testcase process itself 
load the modules by initiating the full <tt>gnunetd</tt> startup sequence.");
+W("For that, the testcase must link against <tt>libgnunetcore</tt>.");
+W("For an example see %s.",
+  extlink_("doxygen/html/gnunet-transport-check_8c.html", 
"gnunet-transport-check.c"));
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_threading.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_threading.php3 2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_threading.php3 2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,72 +1,73 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Copyright and Philosophy";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-H4("Threading and Synchronization");
-BP();
-W("GNUnet is inherently multi-threaded.");
-W("Thus writing applications for GNUnet requires taking synchronization issues 
into account.");
-W("GNUnet provides a minimal set of threading abstractions in the %s module, 
including semaphores, mutexes, recursive mutexes and thread creation.",
-  extlink_("doxygen/html/semaphore_8c-source.html","semaphore"));
-W("When writing code for GNUnet, the following basic rules must be followed:");
-EP();
-echo "<ol><li><strong>";
-W("The core may call registered callback handlers at any time, and also 
concurrently.");
-W("The application modules are responsible for synchronizing access to their 
internal state properly.");
-echo "</strong>";
-W("In practice, client code will use MUTEX_CREATE in initializers and then 
guard access to mutable global shared state using MUTEX_LOCK and 
MUTEX_UNLOCK.");
-echo "</li><li><strong>";
-W("In order to avoid deadlocks, code that was called via callback from the 
core may not invoke methods on the core while holding locks of the 
application.");
-echo "</strong>";
-W("The rationale behind this rule is that the core may have a thread A that 
holds an internal lock L and calls a callback on the service.");
-W("If simultaneously another thread B holds a lock S of the service and calls 
back on the core, this may result in a deadlock if that callback blocks trying 
to aquire lock L and thread A blocks trying to aquire lock S.");
-W("If thread A does not hold any internal locks when calling on the core, this 
situation can be safely avoided.");
-BR();BR();
-W("Programming with this paradigm is not very difficult.");
-W("Still, it often requires a simple trick if the callback to the core 
requires an argument that is typically kept in the shared global state.");
-W("The trick is, to copy the shared global state into a local buffer while 
holding the lock, then releasing the lock and finally doing the callback on the 
core.");
-W("An example for this behavior can be found in the %s code.",
-  extlink_("doxygen/html/querymanager_8c-source.html","querymanager"));
-W("Alternatively, the global lock from the connection module can be used to 
lock on the application specific state; this global lock may be held while 
entering the GNUnet kernel.");
-echo "</li><li><strong>";
-W("Core threads should never be blocked indefinitely.");
-echo "</strong>";
-W("The core has a limited number of processing threads, so blocking them 
indefinitely will eventually block the node.");
-W("If clients (service modules in the core or applications connecting via TCP) 
block these threads, the core will stop working.");
-W("Disk-IO is typically not problematic (though excessive synchronous random 
IO operations may degrade performance significantly), and synchronization with 
other threads is also no problem (as long as they do not deadlock).");
-W("Encryption operations are also not a problem.");
-W("The only problem in practice are <em>blocking socket operations</em>.");
-W("Blocking socket operations occur pretty much only apply to TCP sockets.");
-BR();BR();
-W("The TCP transport service avoids blocking operations using <tt>select</tt> 
calls and IO buffers.");
-W("If a message can not be buffered (buffer full) and sending would block, the 
TCP transport layer discards the message (or: why we like unreliable 
operational semantics).");
-W("Client-server TCP connections are more problematic.");
-W("The reason for this is, that the client-server connection has reliable 
semantics.");
-W("Thus the gnunetd %s code blocks on writes to the client.",
-  extlink_("doxygen/html/cron_8c-source.html","tcpio"));
-W("Similarly, the client blocks when sending messages to gnunetd.");
-W("Since the client-server TCP connection is supposed to use a fast (loopback, 
LAN) connection and since gnunetd uses a thread per client connection, blocking 
on this connection is acceptable.");
-W("The problem with blocking here is that it leaves the possibility of an 
<em>inter-process deadlock</em>.");
-BR();BR();
-W("The deadlock can occur if the TCP thread that receives and processes 
messages from the client blocks on a write to the client (TCP buffer queue 
full) and thus gnunetd no longer reads from the TCP pipe.");
-W("If the client blocks on a write to gnunetd and thus no longer reads from 
its end of the TCP connection, both processes block forever. This problem is 
typically hard to diagnose since it involves two processes and may only occur 
after the TCP buffers of the operating system are full.");
-W("A typical symptom is that <tt>netstat -tn</tt> shows two local TCP 
connections with very full receive and send buffers that do not change.");
-BR();BR();
-W("The solution to the problem is that every client (not peer, remember that 
clients are trusted and can thus be expected to follow the protocol correctly) 
must always be in a state where it has a thread that can receive and process 
messages from gnunetd.");
-W("That thread should never block, neither by doing a direct write to gnunetd 
nor by aquireing a lock that could be hold by another thread while that thread 
writes to gnunetd.");
-W("A typical solution to this problem is to use one thread that processes 
replies and another thread that generates requests.");
-W("Another solution is to use the non-blocking TCPIO call in the client.");
-W("The %s code is an example for code that handles this type of problem.",
-  extlink_("doxygen/html/requestmanager_8c-source.html", "RequestManager"));
-echo "</li></ol>";
-
-H5("Notes");
-echo "<ul><li>";
-W("You should never use pthread_detach.");
-W("There is hardly ever a good reason for it, and it can be the source of 
subtle bugs.");
-W("Write a shutdown-sequence for your code and make sure to use pthread_join 
on all created threads.");
-echo "</li></ul>";
-include("html_footer.php3");
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Threading in gnunetd";
+$description="This page describes the various threads that exist in gnunetd, 
how to use them and common pitfalls that should be avoided";
+include("html_header.php3");
+
+H4("Threading and Synchronization");
+BP();
+W("GNUnet is inherently multi-threaded.");
+W("Thus writing applications for GNUnet requires taking synchronization issues 
into account.");
+W("GNUnet provides a minimal set of threading abstractions in the %s module, 
including semaphores, mutexes, recursive mutexes and thread creation.",
+  extlink_("doxygen/html/semaphore_8c-source.html","semaphore"));
+W("When writing code for GNUnet, the following basic rules must be followed:");
+EP();
+echo "<ol><li><strong>";
+W("The core may call registered callback handlers at any time, and also 
concurrently.");
+W("The application modules are responsible for synchronizing access to their 
internal state properly.");
+echo "</strong>";
+W("In practice, client code will use <tt>MUTEX_CREATE</tt> in initializers and 
then guard access to mutable global shared state using <tt>MUTEX_LOCK</tt> and 
<tt>MUTEX_UNLOCK</tt>.");
+echo "</li><li><strong>";
+W("In order to avoid deadlocks, code that was called via callback from the 
core may not invoke methods on the core while holding locks of the 
application.");
+echo "</strong>";
+W("The rationale behind this rule is that the core may have a thread A that 
holds an internal lock L and calls a callback on the service.");
+W("If simultaneously another thread B holds a lock S of the service and calls 
back on the core, this may result in a deadlock if that callback blocks trying 
to aquire lock L and thread A blocks trying to aquire lock S.");
+W("If thread A does not hold any internal locks when calling on the core, this 
situation can be safely avoided.");
+BR();BR();
+W("Programming with this paradigm is not very difficult.");
+W("Still, it often requires a simple trick if the callback to the core 
requires an argument that is typically kept in the shared global state.");
+W("The trick is to copy the shared global state into a local buffer while 
holding the lock, then releasing the lock and finally doing the callback on the 
core.");
+W("An example for this behavior can be found in the %s code.",
+  extlink_("doxygen/html/querymanager_8c-source.html","querymanager"));
+W("Alternatively, the global lock from the connection module can be used to 
lock on the application specific state; this global lock may be held while 
entering the GNUnet kernel.");
+echo "</li><li><strong>";
+W("Core threads should never be blocked indefinitely.");
+echo "</strong>";
+W("The core has a limited number of processing threads, so blocking them 
indefinitely will eventually block the node.");
+W("If clients (service modules in the core or applications connecting via TCP) 
block these threads, the core will stop working.");
+W("Disk-IO is typically not problematic (though excessive synchronous random 
IO operations may degrade performance significantly), and synchronization with 
other threads is also no problem (as long as they do not deadlock).");
+W("Encryption operations are also not a problem.");
+W("The only problem in practice are <em>blocking socket operations</em>.");
+W("Blocking socket operations occur pretty much only apply to TCP sockets.");
+BR();BR();
+W("The TCP transport service avoids blocking operations using <tt>select</tt> 
calls and IO buffers.");
+W("If a message can not be buffered (buffer full) and sending would block, the 
TCP transport layer discards the message (or: why we like unreliable 
operational semantics).");
+W("Client-server TCP connections are more problematic.");
+W("The reason for this is, that the client-server connection has reliable 
semantics.");
+W("Thus the gnunetd %s code blocks on writes to the client.",
+  extlink_("doxygen/html/cron_8c-source.html","tcpio"));
+W("Similarly, the client blocks when sending messages to gnunetd.");
+W("Since the client-server TCP connection is supposed to use a fast (loopback, 
LAN) connection and since <tt>gnunetd</tt> uses a thread per client connection, 
blocking briefly due to network latency on this connection is considered 
acceptable.");
+W("However, a common problem with blocking on TCP connections with clients is 
that it leaves the possibility of an <em>inter-process deadlock</em>.");
+BR();BR();
+W("The deadlock can occur if the TCP thread that receives and processes 
messages from the client blocks on a write to the client (TCP buffer queue 
full) and thus gnunetd no longer reads from the TCP pipe.");
+W("If the client blocks on a write to <tt>gnunetd</tt> and thus no longer 
reads from its end of the TCP connection, both processes block forever.");
+W("This problem is typically hard to diagnose since it involves two processes 
and may only occur after the TCP buffers of the operating system are full.");
+W("A typical symptom is that <tt>netstat -tn</tt> shows two local TCP 
connections with very full receive and send buffers that do not change.");
+BR();BR();
+W("The solution to the problem is that every client (not peer, remember that 
clients are trusted and can thus be expected to follow the protocol correctly) 
must always be in a state where it has a thread that can receive and process 
messages from <tt>gnunetd</tt>.");
+W("That thread should never block, neither by doing a direct write to 
<tt>gnunetd</tt> nor by aquireing a lock that could be hold by another thread 
while that thread writes to <tt>gnunetd</tt>.");
+W("A typical solution to this problem is to use one thread that processes 
replies and another thread that generates requests.");
+W("Another solution is to use the non-blocking TCPIO call in the client.");
+W("The %s code is an example for code that handles this type of problem.",
+  extlink_("doxygen/html/requestmanager_8c-source.html", "RequestManager"));
+echo "</li></ol>";
+
+H5("Notes");
+echo "<ul><li>";
+W("You should never use <tt>pthread_detach</tt>.");
+W("There is hardly ever a good reason for it, and it can be the source of 
subtle bugs.");
+W("Write a shutdown-sequence for your code and make sure to use 
<tt>pthread_join</tt> on all created threads.");
+echo "</li></ul>";
+include("html_footer.php3");
 ?>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/hacking_util.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_util.php3      2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/hacking_util.php3      2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,75 +1,90 @@
-<?php
-include("scripts.php3");
-$title="GNUnet Documentation";
-$description="GNUnet Documentation - libgnunet_util";
-include("html_header.php3");
-
-H2("libgnunet_util");
-BP();
-
-W("<tt>libgnunet_util</tt> is a helper library that is supposed to contain all 
platform dependent code (except for user interfaces).");
-W("It is also supposed to offer basic services that most if not all GNUnet 
binaries require.");
-W("The code of <tt>libgnunet_util</tt> is in the <tt>src/util/</tt> 
directory.");
-W("The public interface to the library is in the %s header.",
-  extlink_("doxygen/html/gnunet__util_8h.html",
-           "gnunet_util.h"));
-W("The functions provided by <tt>libgnunet_util</tt> fall roughly into the 
following categories:");
-EP();
-?>
-<ul>
- <li><?php extlink("doxygen/html/timer_8c.html",
-                   "timing");?></li>
- <li><?php extlink("doxygen/html/semaphore_8c.html",
-                   "threading and synchronization");?></li>
- <li><?php extlink("doxygen/html/configuration_8c.html",
-                   "configuration");?></li>
- <li><?php extlink("doxygen/html/storage_8c.html",
-                   "IO");?></li>
- <li><?php extlink("doxygen/html/logging_8c.html",
-                   "logging");?></li>
- <li><?php extlink("doxygen/html/tcpio_8c.html",
-                   "Reliable (TCP), record-based client-server 
communication");?></li>
- <li><?php extlink("doxygen/html/hashing_8c.html",
-                   "hashing");?></li>
- <li><?php extlink("doxygen/html/symcipher__gcry_8c.html",
-                   "symmetric encryption");?></li>
- <li><?php extlink("doxygen/html/hostkey__gcry_8c.html",
-                   "asymmetric encryption");?></li>
- <li><?php extlink("doxygen/html/xmalloc_8c.html",
-                   "memory management");?></li>
- <li><?php extlink("doxygen/html/dso_8c.html",
-                   "plugin support (dynamically shared objects)");?></li>
- <li><?php extlink("doxygen/html/cron_8c.html",
-                   "periodic or deferred tasks (cron jobs)");?></li>
- <li><?php extlink("doxygen/html/state_8c.html",
-                   "persistent storage, trivial string-based database");?></li>
- <li><?php extlink("doxygen/html/statistics_8c.html",
-                   "statistics; support for gnunet-stats");?></li>
- <li><?php extlink("doxygen/html/bloomfilter_8c.html",
-                   "bloomfilter implementation (with on-disk bit 
counters)");?></li>
-</ul>
-<?php
-
-
-BP();
-W("Ideally, porting GNUnet should only require porting the gnunet_util 
library.");
-W("More testcases for the gnunet-util APIs are therefore a great way to make 
porting of GNUnet easier.");
-EP();
-
-ANCHOR("crypto");
-H3("Cryptography");
-
-BP();
-W("The gnunet-util APIs also provide the cryptographic primitives used in 
GNUnet.");
-W("GNUnet uses 2048 bit RSA keys for the session key exchange and for signing 
messages by peers.");
-W("Most researchers in cryptography consider 2048 bit RSA keys as very secure 
and practically unbreakable for a very long time unless extraordinary advances 
in cryptography are made.");
-W("For the encryption of the files and the symmetric peer-to-peer 
communication GNUnet uses 128 bit keys with blowfish.");
-W("Fresh session keys are negotiated for every new connection.");
-W("Again, there is no published technique to break this cipher in any 
realistic amount of time.");
-W("Note that GNUnet does not use RSA to encrypt files or ordinary individual 
peer-to-peer messages.");
-W("No sane protocol uses public key cryptography for the bulk of the messages 
since public key encryption is extremely expensive compared to symmetric 
ciphers.");
-W("GNUnet follows the well-established practice to use public key cryptography 
to exchange an initial pair of symmetric keys that is then used for the rest of 
the communication).");
-EP();
-
-include("html_footer.php3");
-?>
\ No newline at end of file
+<?php
+include("scripts.php3");
+$title="GNUnet Documentation - libgnunetutil";
+$description="Programmer documentation for libgnunetutil";
+include("html_header.php3");
+
+H2("libgnunetutil");
+BP();
+
+W("<tt>libgnunetutil</tt> is a helper library that is supposed to contain all 
platform dependent code (except for user interfaces).");
+W("It is also supposed to offer basic services that most if not all GNUnet 
binaries require.");
+W("The code of <tt>libgnunetutil</tt> is in the <tt>src/util/</tt> 
directory.");
+W("The public interface to the library is in the %s header.",
+  extlink_("doxygen/html/gnunet__util_8h.html",
+           "gnunet_util.h"));
+W("The functions provided by <tt>libgnunetutil</tt> fall roughly into the 
following categories:");
+EP();
+?>
+<ul>
+ <li><?php extlink("doxygen/html/logging_8c.html",
+                   "logging");?></li>
+
+ <li><?php extlink("doxygen/html/dso_8c.html",
+                   "plugin support (dynamically shared objects)");?></li>
+
+ <li><?php extlink("doxygen/html/timer_8c.html",
+                   "timing");?></li>
+ <li><?php extlink("doxygen/html/statuscalls_8c.html",
+                   "load management (network, CPU)");?></li>
+
+ <li><?php extlink("doxygen/html/semaphore_8c.html",
+                   "threading and synchronization");?></li>
+ <li><?php extlink("doxygen/html/cron_8c.html",
+                   "periodic or deferred tasks (cron jobs)");?></li>
+ <li><?php extlink("doxygen/html/shutdown_8c.html",
+                   "signal handling");?></li>
+
+ <li><?php extlink("doxygen/html/tcpio_8c.html",
+                   "Reliable (TCP), record-based client-server 
communication");?></li>
+ <li><?php extlink("doxygen/html/port_8c.html",
+                   "Connecting clients with <tt>gnunetd</tt>");?></li>
+ <li><?php extlink("doxygen/html/daemon_8c.html",
+                   "External process control of <tt>gnunetd</tt> by 
clients");?></li>
+
+ <li><?php extlink("doxygen/html/random_8c.html",
+                   "random number generation");?></li>
+ <li><?php extlink("doxygen/html/hashing_8c.html",
+                   "hashing");?></li>
+ <li><?php extlink("doxygen/html/symcipher__gcry_8c.html",
+                   "symmetric encryption");?></li>
+ <li><?php extlink("doxygen/html/hostkey__gcry_8c.html",
+                   "asymmetric encryption");?></li>
+
+ <li><?php extlink("doxygen/html/xmalloc_8c.html",
+                   "memory management");?></li>
+ <li><?php extlink("doxygen/html/configuration_8c.html",
+                   "configuration");?></li>
+ <li><?php extlink("doxygen/html/storage_8c.html",
+                   "IO");?></li>
+ <li><?php extlink("doxygen/html/state_8c.html",
+                   "persistent storage, trivial string-based database");?></li>
+ <li><?php extlink("doxygen/html/bloomfilter_8c.html",
+                   "bloomfilter implementation (with on-disk bit 
counters)");?></li>
+
+</ul>
+<?php
+
+BP();
+W("Ideally, porting GNUnet should only require porting the <tt>gnunetutil</tt> 
library.");
+W("More testcases for the <tt>gnunetutil</tt> APIs are therefore a great way 
to make porting of GNUnet easier.");
+EP();
+
+ANCHOR("crypto");
+H3("Cryptography");
+
+BP();
+W("The <tt>gnunetutil</tt> APIs provides the cryptographic primitives used in 
GNUnet.");
+W("GNUnet uses 2048 bit RSA keys for the session key exchange and for signing 
messages by peers.");
+W("Most researchers in cryptography consider 2048 bit RSA keys as very secure 
and practically unbreakable for a very long time unless extraordinary advances 
in cryptography are made.");
+W("For the encryption of the files and the symmetric peer-to-peer 
communication GNUnet uses 256-bit AES encryption.");
+W("Fresh, asymmetric session keys are negotiated for every new connection.");
+W("Again, there is no published technique to break this cipher in any 
realistic amount of time.");
+W("GNUnet uses SHA-512 for computing one-way hash codes.");
+W("Note that GNUnet does not use RSA to encrypt files or ordinary individual 
peer-to-peer messages.");
+W("No sane protocol uses public key cryptography for the bulk of the messages 
since public key encryption is extremely expensive compared to symmetric 
ciphers.");
+W("GNUnet follows the well-established practice to use public key cryptography 
to exchange an initial pair of symmetric keys that is then used for the rest of 
the communication).");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/hacking_win32_build.php3
===================================================================
--- GNUnet-docs/WWW/test/hacking_win32_build.php3       2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/hacking_win32_build.php3       2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,222 +1,280 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Building on Microsoft Windows 32-bit 
Platforms";
-$description="A step-by-step guide on how to build and run GNUnet on Win32 
platforms.";
-include("html_header.php3");
-
-H3("Building GNUnet and libextractor on Microsoft Windows 32-bit Platforms");
-BP();
-W("This document is a guide to building GNUnet and libextractor on Windows 
platforms.");
-P();
-W("The Windows build uses a UNIX emulator for Windows, %s, to build the 
executable modules.",
-  extlink_("http://www.mingw.org/";, "MinGW"));
-W("These modules run natively on Windows and do not require additional 
emulation software besides the usual %s.",
-  extlink_("download.php3", "dependencies"));
-P();
-W("GNUnet development is mostly done under Linux and especially SVN checkouts 
may not build out of the box.");
-W("We regret any inconvenience, and if you have problems, please %s or ask the 
%s for assistance.",
-  ARRAY(extlink_("faq.php3#bugs", "report them"), extlink_("mailinglist.php3", 
"mailinglist")));
-EP();
-H4("Hardware and OS requirements");
-echo "<ul>";
-LI("Pentium II or equivalent processor, 350 MHz or better");
-LI("128 MB RAM");
-LI("600 MB free disk space"); 
-LI("Windows 2000 or Windows XP are recommended"); 
-echo "</ul>";
-H4("Software installation"); ?>
-<ol>
-  <li>
-    <b><?php W("Compression software");?></b>
-    <?php BR();W("The software packages GNUnet depends on are usually 
compressed using UNIX tools like tar,
-      gzip and bzip2.");
-    W("If you do not already have an utility that is able to extract such 
archives, get %s.",
-      extlink_("http://www.7-zip.org/";, "7-Zip"));
-    ?>
-  </li>
-  <li>
-    <b><?php W("UNIX environment"); ?></b>
-    <?php BR();
-    W("The MinGW project provides the compiler toolchain that is used to build 
GNUnet.");
-    BR();
-    W("Get the packages MSYS, MinGW, MSYS Developer Tool Kit, msys-autoconf 
(bin), msys-automake (bin),
-    libiconv and gettext from %s.", 
extlink_("http://www.mingw.org/download.shtml";, "the MinGW project"));
-    ?>
-    <ol>
-       <li><?php W("Install MSYS (to c:\mingw, for example)"); ?></li>
-       <li><?php W("Install MinGW to a subdirectory (to c:\mingw\mingw, for 
example)"); ?></li>
-       <li><?php W("Install the Development Kit to the MSYS directory 
(c:\mingw)"); ?></li>
-       <li><?php W("Rename (c:\mingw\mingw\)lib\libstdc++.la to avoid 
problems:");
-            BR();PRE("# mv /usr/mingw/lib/libstdc++.la 
/usr/mingw/lib/libstdc++.la.broken");
-            ?>
-        </li>
-       <li>
-               <?php W("Create a batch file bash.bat in your MSYS directory 
with the content:");BR();
-                PRE("bin\sh.exe --login");
-               W("This batch file opens a shell which is used to invoke the 
build processes.");
-               W("MinGW's standard shell (msys.bat) is not suitable because it 
opens a separate console window
-               for each compilation step."); ?>
-       </li>
-       <li><?php W("Remove the declaration of DATADIR from 
(c:\mingw\mingw\)include\objidl.h (lines 55-58)"); ?></li>
-       <li><?php W("Unpack autoconf and automake to the MSYS directory 
(c:\mingw)"); ?></li>           
-       <li><?php W("Install libiconv to the MinGW directory 
(c:\mingw\mingw)"); ?></li>        
-       <li><?php W("Install gettext to the MinGW directory (c:\mingw\mingw)"); 
?></li>
-    </ol>
-  </li>
-  <li>
-    <b><?php W("Libtool");?></b>
-    <?php BR();W("GNUnet loads its dynamic modules using Libtool.");BR();
-    W("Get the Libtool source from %s, open the shell (bash.bat) and build 
&amp; install Libtool with:",
-      extlink_("http://www.gnu.org/software/libtool/libtool.html";, "GNU"));
-    BR();
-    PRE("# ./configure --prefix= &amp;&amp; make install");
-    ?>
-  </li>
-  <li>
-    <b><?php W("Pthreads"); ?></b>
-    <?php BR();
-    W("GNUnet uses the portable POSIX thread library for multi-threading.");
-    BR();
-    ?>
-    <ol>
-       <li><?php W("Save %s as libpthread.a into the lib directory 
(c:\mingw\mingw\lib\libpthread.a)",
-               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/libpthreadGC.a";,
-                       "libpthreadGC.a")); ?></li>
-       <li><?php W("Save %s into the MinGW bin directory (c:\mingw\mingw\bin)",
-               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/pthreadGC.dll";,
-                       "pthreadGC.dll")); ?></li>
-       <li><?php W("Download all header files from %s to the include directory 
(c:\mingw\mingw\include)",
-               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/";,
-                       "include/")); ?></li>
-    </ol>
-  </li>
-  <li>
-    <b><?php W("GNU MP"); ?></b>
-    <?php BR();
-    W("GNUnet uses the GNU Multiple Precision library for special 
cryptographic operations.");
-    BR();
-    W("Get the GMP binary package from the %s and unpack it to the MinGW 
directory (c:\mingw\mingw)",
-       extlink_("http://sourceforge.net/projects/mingwrep/";, "MinGW 
repository"));
-    ?>
-  </li>
-  <li>
-    <b><?php W("SQLite");?></b>
-    <?php BR();W("GNUnet uses the SQLite database to store content.");BR();
-    W("Get the source from the %s (version 3, \"complete source code\" 
package) and
-      build &amp; install it with:",
-      extlink_("http://www.sqlite.org/download.html";, "SQLite project"));
-    BR();
-    PRE("CFLAGS='-O2 -no-undefined' ./configure --prefix= &amp;&amp; make 
&amp;&amp; make install");
-    ?>
-  </li>
-  <li>
-    <b><?php W("MySQL");?></b>
-    <?php BR();W("As an alternative to SQLite, GNUnet also supports MySQL."); 
?>
-    <ol>
-           <li>
-               <?php W("Get the binary installer from the %s (version 4.1),
-               install it and follow the instructions in %s.",
-               
ARRAY(extlink_("http://dev.mysql.com/downloads/mysql/4.1.html#Windows";, "MySQL 
project"),
-                       
extlink_("https://gnunet.org/svn/GNUnet/doc/README.mysql";, "README.mysql"))); ?>
-           </li>
-           <li>
-               <?php W("Create a temporary build directory (c:\mysql)"); ?>
-           </li>
-           <li>
-               <?php W("Copy the directories include\ and lib\ from the MySQL 
directory to the new directory"); ?>
-           </li>
-           <li>
-               <?php W("Get the patches from %s and %s and apply them: ",
-                               
ARRAY(extlink_("http://bugs.mysql.com/bug.php?id=8906&files=1";, "Bug #8906"),
-                       
extlink_("http://bugs.mysql.com/bug.php?id=8872&files=1";, "Bug #8872")));
-               BR();
-               PRE("patch -p 0 < mysql01.diff
-patch -p 0 < mysql_def03.diff"); ?>
-           </li>
-           <li>
-               <?php W("Move lib\opt\libmysql.dll to lib\libmysql.dll"); ?>
-           </li>
-           <li>
-               <?php W("Change to lib\ and create an import library:");
-               BR();
-               PRE("dlltool --input-def ../include/libmySQL.def --dllname 
libmysql.dll --output-lib libmysqlclient.a -k"); ?>
-           </li>
-           <li>
-               <?php W("Copy include\* to include\mysql\\"); ?>
-           </li>
-           <li>
-               <?php W("Pass \"--with-mysql=/c/mysql\" to ./configure and copy 
libmysql.dll to your PATH or GNUnet's bin\ directory"); ?>
-           </li>
-    </ol>
-  </li>
-  <li>
-    <b><?php W("GTK+"); ?></b>
-    <?php BR();
-    W("GTK+ is a portable library for GUIs.");
-    BR();
-    W("If you want to use gnunet-gtk or libextractor, get the runtime and 
development packages gtk+, glib, pango, atk,
-      iconv, pkgconfig and gettext from the %s and unpack them to the MinGW 
directory (c:\mingw\mingw).",
-       extlink_("http://www.gimp.org/~tml/gimp/win32/downloads.html";, "GIMP 
project"));
-    BR();
-    W("Do <em>not</em> overwrite gettext files that are already present (use 
the 7-Zip option \"Skip existing files\").");
-    BR();
-    W("The GTK binaries require the Microsoft Visual C 7 runtime library which 
can be obtained from %s (%s).",
-       ARRAY(extlink_("download/win/msvcr70.zip", "here"),
-        extlink_("download/win/msvcr70.zip.asc", "Signature")));
-    ?>
-  </li>
-  <li>
-    <b><?php W("zLib"); ?></b>
-    <?php BR();
-    W("libextractor requires zLib to decompress some file formats.");
-    BR();
-    W("Get zLib from the %s and unpack it to the MinGW directory 
(c:\mingw\mingw)",
-       extlink_("http://sourceforge.net/projects/mingwrep/";, "MinGW 
repository"));
-    ?>
-  </li>
-  <li>
-    <b><?php W("gettext"); ?></b>
-    <?php BR();
-    W("GNU gettext is used to provide national language support.");
-    BR();
-    W("Get gettext (bin and lib) from %s and unpack it to the MinGW directory 
(c:\mingw\mingw)",
-       extlink_("http://gnuwin32.sourceforge.net/packages/gettext.htm";, 
"GnuWin32"));
-    BR();
-    W("Do <em>not</em> overwrite gettext files that are already present (use 
the 7-Zip option \"Skip existing files\").");
-    ?>
-  </li>
-  <li>
-    <b><?php W("Libgcrypt");?></b>
-    <?php BR();W("Libgcrypt provides the cryptographic functions used by 
GNUnet");BR();
-    W("Get Libgcrypt from %s (%s) and unpack it to the MinGW directory 
(c:\mingw\mingw)",
-       ARRAY(extlink_("download/win/libgcrypt-1.2.1.zip", "here"),
-        extlink_("download/win/libgcrypt-1.2.1.zip.asc", "Signature")));
-    ?>
-  </li>
-</ol>
-<?php H4("Building libextractor and GNUnet");
-BP();
-W("See %s for basic instructions on building libextractor and GNUnet.", 
-   extlink_("user_gnunet.php3",
-           "Installation"));
-P();
-W("By default, all modules that are created in this way contain debug 
information and are quite large.");
-W("To compile release versions (small and fast) set the variable CFLAGS:");
-P();
-PRE("# CFLAGS='-O2' ./configure --prefix=\$HOME --with-extractor=\$HOME");
-EP();
-H4("Installer");
-BP();
-W("The GNUnet installer is made with %s.", 
extlink_("http://nsis.sourceforge.net/";,
-       "NSIS"));
-W("The installer script is located in contrib\win in the GNUnet source tree.");
-EP();
-H4("Source");
-BP();
-W("The sources of all dependencies are available %s.", 
-   extlink_("download/win/3rd_party_sources.tar",
-           "here"));
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Building on Microsoft Windows 32-bit 
Platforms";
+$description="A step-by-step guide on how to build and run GNUnet on Win32 
platforms.";
+include("html_header.php3");
+
+H3("Building GNUnet and libextractor on Microsoft Windows 32-bit Platforms");
+BP();
+W("This document is a guide to building GNUnet and libextractor on Windows 
platforms.");
+P();
+W("The Windows build uses a UNIX emulator for Windows, %s, to build the 
executable modules.",
+  extlink_("http://www.mingw.org/";, "MinGW"));
+W("These modules run natively on Windows and do not require additional 
emulation software besides the usual %s.",
+  extlink_("download.php3", "dependencies"));
+P();
+W("GNUnet development is mostly done under Linux and especially SVN checkouts 
may not build out of the box.");
+W("We regret any inconvenience, and if you have problems, please %s or ask the 
%s for assistance.",
+  ARRAY(extlink_("faq.php3#bugs", "report them"), extlink_("mailinglist.php3", 
"mailinglist")));
+EP();
+H4("Hardware and OS requirements");
+echo "<ul>";
+LI("Pentium II or equivalent processor, 350 MHz or better");
+LI("128 MB RAM");
+LI("600 MB free disk space"); 
+LI("Windows 2000 or Windows XP are recommended"); 
+echo "</ul>";
+H4("Software installation"); ?>
+<ol>
+  <li>
+    <b><?php W("Compression software");?></b>
+    <?php BR();W("The software packages GNUnet depends on are usually 
compressed using UNIX tools like tar,
+      gzip and bzip2.");
+    W("If you do not already have an utility that is able to extract such 
archives, get %s.",
+      extlink_("http://www.7-zip.org/";, "7-Zip"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("UNIX environment"); ?></b>
+    <?php BR();
+    W("The MinGW project provides the compiler toolchain that is used to build 
GNUnet.");
+    BR();
+    
+    W("Get the following packages from %s:", 
extlink_("http://www.mingw.org/download.shtml";, "the MinGW project")); ?>
+    <ul>
+       <li>GCC core</li>
+       <li>GCC g++</li>
+       <li>MSYS</li>
+       <li>MSYS Developer Tool Kit</li>
+       <li>MSYS Developer Tool Kit - msys-autoconf (bin)</li>
+       <li>MSYS Developer Tool Kit - msys-automake (bin)</li>
+       <li>MinGW Runtime</li>
+       <li>MinGW Utilities</li>
+       <li>Windows API</li>
+       <li>Binutils</li>
+       <li>make</li>
+       <li>pdcurses</li>
+       <li>GDB</li>
+    </ul>    
+    <ol>
+       <li><?php W("Install MSYS (to c:\mingw, for example.)"); W("Do 
<strong>not</strong> use spaces in the pathname (c:\program files\mingw)."); 
?></li>
+       <li><?php W("Install MinGW to a subdirectory (to c:\mingw\mingw, for 
example)"); ?></li>
+       <li><?php W("Install the Development Kit to the MSYS directory 
(c:\mingw)"); ?></li>
+       <li>
+               <?php W("Create a batch file bash.bat in your MSYS directory 
with the content:");BR();
+                PRE("bin\sh.exe --login");
+               W("This batch file opens a shell which is used to invoke the 
build processes.");
+               W("MinGW's standard shell (msys.bat) is not suitable because it 
opens a separate console window
+               for each compilation step."); ?>
+       </li>
+       <li><?php W("Start bash.sh and rename (c:\mingw\mingw\)lib\libstdc++.la 
to avoid problems:");
+            BR();PRE("# mv /usr/mingw/lib/libstdc++.la 
/usr/mingw/lib/libstdc++.la.broken");
+            ?>
+        </li>
+       <li><?php W("Remove the declaration of DATADIR from 
(c:\mingw\mingw\)include\objidl.h (lines 55-58)"); ?></li>
+       <li><?php W("Unpack autoconf, automake to the MSYS directory 
(c:\mingw)"); ?></li>
+       <li><?php W("Install all other packages to the MinGW directory 
(c:\mingw\mingw\)"); ?></li>
+    </ol>
+  </li>
+  <li>
+    <b><?php W("GNU Libtool"); ?></b>
+    <?php BR();
+    W("GNU Libtool is required to use shared libraries.");
+    BR();
+    W("Get the prebuilt package from %s and unpack it to the MinGW directory 
(c:\mingw)",
+       extlink_("download/win/libtool-1.5.18.zip", "here"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("Pthreads"); ?></b>
+    <?php BR();
+    W("GNUnet uses the portable POSIX thread library for multi-threading.");
+    BR();
+    ?>
+    <ol>
+       <li><?php W("Save %s as libpthread.a into the lib directory 
(c:\mingw\mingw\lib\libpthread.a)",
+               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/libpthreadGC2.a";,
+                       "libpthreadGC2.a")); ?></li>
+       <li><?php W("Save %s into the MinGW bin directory (c:\mingw\mingw\bin)",
+               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/pthreadGC2.dll";,
+                       "pthreadGC2.dll")); ?></li>
+       <li><?php W("Download all header files from %s to the include directory 
(c:\mingw\mingw\include)",
+               
extlink_("ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/include/";,
+                       "include/")); ?></li>
+    </ol>
+  </li>
+  <li>
+    <b><?php W("GNU MP"); ?></b>
+    <?php BR();
+    W("GNUnet uses the GNU Multiple Precision library for special 
cryptographic operations.");
+    BR();
+    W("Get the GMP binary package from the %s and unpack it to the MinGW 
directory (c:\mingw\mingw)",
+       extlink_("http://sourceforge.net/projects/mingwrep/";, "MinGW 
repository"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("GNU Gettext"); ?></b>
+    <?php BR();
+    W("GNU gettext is used to provide national language support.");
+    BR();
+    W("Get the prebuilt package from %s and unpack it to the MinGW directory 
(c:\mingw\mingw)",
+       extlink_("download/win/gettext-0.13.1.zip", "here"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("GNU iconv"); ?></b>
+    <?php BR();
+    W("GNU Libiconv is used for character encoding conversion.");
+    BR();
+    W("Get the prebuilt package from %s and unpack it to the MinGW directory 
(c:\mingw\mingw)",
+       extlink_("download/win/libiconv-1.9.1.zip", "here"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("SQLite");?></b>
+    <?php BR();W("GNUnet uses the SQLite database to store content.");BR();
+    W("Get the prebuilt binary from %s and unpack it to your MinGW directory.",
+      extlink_("http://www.gnunet.org/download/win32/sqlite.zip";, "here"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("MySQL");?></b>
+    <?php BR();W("As an alternative to SQLite, GNUnet also supports MySQL."); 
?>
+    <ol>
+           <li>
+               <?php W("Get the binary installer from the %s (version 4.1),
+               install it and follow the instructions in %s.",
+               
ARRAY(extlink_("http://dev.mysql.com/downloads/mysql/4.1.html#Windows";, "MySQL 
project"),
+                       
extlink_("https://gnunet.org/svn/GNUnet/doc/README.mysql";, "README.mysql"))); ?>
+           </li>
+           <li>
+               <?php W("Create a temporary build directory (c:\mysql)"); ?>
+           </li>
+           <li>
+               <?php W("Copy the directories include\ and lib\ from the MySQL 
directory to the new directory"); ?>
+           </li>
+           <li>
+               <?php W("Get the patches from %s and %s (the latter is only 
required for MySQL < 4.1.12) and apply them: ",
+                               
ARRAY(extlink_("http://bugs.mysql.com/bug.php?id=8906&files=1";, "Bug #8906"),
+                       
extlink_("http://bugs.mysql.com/bug.php?id=8872&files=1";, "Bug #8872")));
+               BR();
+               PRE("patch -p 0 < mysql01.diff
+patch -p 0 < mysql_def03.diff"); ?>
+           </li>
+           <li>
+               <?php W("Move lib\opt\libmysql.dll to lib\libmysql.dll"); ?>
+           </li>
+           <li>
+               <?php W("Change to lib\ and create an import library:");
+               BR();
+               PRE("dlltool --input-def ../include/libmySQL.def --dllname 
libmysql.dll --output-lib libmysqlclient.a -k"); ?>
+           </li>
+           <li>
+               <?php W("Copy include\* to include\mysql\\"); ?>
+           </li>
+           <li>
+               <?php W("Pass \"--with-mysql=/c/mysql\" to ./configure and copy 
libmysql.dll to your PATH or GNUnet's bin\ directory"); ?>
+           </li>
+    </ol>
+  </li>
+  <li>
+    <b><?php W("GTK+"); ?></b>
+    <?php BR();
+    W("gnunet-gtk and libextractor depend on GTK.");
+    BR();
+    W("Get the the binary and developer packages of atk, glib, gtk, iconv, 
gettext-runtime, pango and pkgconfig from %s and unpack it to the MinGW 
directory (c:\mingw\mingw)",
+       extlink_("http://www.gimp.org/~tml/gimp/win32/downloads.html";, "Tor 
Lillqvist"));
+    W("Do not overwrite any existing files!");
+    ?>
+  </li>
+  <li>
+    <b><?php W("Glade"); ?></b>
+    <?php BR();
+    W("gnunet-gtk and and gnunet-setup were created using this interface 
builder.");
+    BR();
+    ?>
+    <ul>
+     <li>
+       <?php
+       W("Get the Glade and libglade packages (without GTK!) from %s and 
unpack the content of the glade\ directory to the MinGW directory 
(c:\mingw\mingw)",
+               
extlink_("http://gladewin32.sourceforge.net/modules.php?name=Downloads";, 
"GladeWin32"));
+       ?>
+     </li>
+        <li>
+       <?php
+       W("Get libxml from %s and unpack it to the MinGW directory 
(c:\mingw\mingw).",
+               extlink_("download/win/libxml.zip", "here"));
+       ?>
+       </li>
+    </ul>
+  </li>
+  <li>
+    <b><?php W("zLib"); ?></b>
+    <?php BR();
+    W("libextractor requires zLib to decompress some file formats. GNUnet uses 
it to (de)compress meta-data.");
+    BR();
+    W("Get zLib from %s (%s) and unpack it to the MinGW directory 
(c:\mingw\mingw)",
+       ARRAY(extlink_("download/win/zlib.zip", "here"), 
extlink_("download/win/zlib.zip.asc", "Signature")));
+    ?>
+  </li>
+  <li>
+    <b><?php W("Bzip2"); ?></b>
+    <?php BR();
+    W("libextractor also requires Bzip2 to decompress some file formats.");
+    BR();
+    W("Get Bzip2 (binary and developer package) from %s and unpack it to the 
MinGW directory (c:\mingw\mingw)",
+       extlink_("http://gnuwin32.sourceforge.net/packages/bzip2.htm";, 
"GnuWin32"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("Libgcrypt");?></b>
+    <?php BR();W("Libgcrypt provides the cryptographic functions used by 
GNUnet");BR();
+    W("Get Libgcrypt from %s (%s) and unpack it to the MinGW directory 
(c:\mingw\mingw)",
+       ARRAY(extlink_("download/win/libgcrypt-1.2.1.zip", "here"),
+        extlink_("download/win/libgcrypt-1.2.1.zip.asc", "Signature")));
+    ?>
+  </li>
+  <li>
+    <b><?php W("PlibC"); ?></b>
+    <?php BR();
+    W("PlibC emulates Unix functions under Windows.");
+    BR();
+    W("Get PlibC from %s and unpack it to the MinGW directory 
(c:\mingw\mingw)",
+       
extlink_("https://sourceforge.net/project/showfiles.php?group_id=137319";, 
"here"));
+    ?>
+  </li>
+  <li>
+    <b><?php W("OGG Vorbis");?></b>
+    <?php BR();W("OGG Vorbis is used to extract meta-data from .ogg 
files");BR();
+    W("Get the packages %s and %s and unpack them to the MinGW directory 
(c:\mingw\mingw)",
+       
ARRAY(extlink_("http://www.gnunet.org/libextractor/download/win/libogg-1.1.2.zip";,
 "libogg"),
+        
extlink_("http://www.gnunet.org/libextractor/download/win/libvorbis-1.0.1.zip";, 
"libvorbis")));
+    ?>
+  </li>
+</ol>
+<?php H4("Building libextractor and GNUnet");
+BP();
+W("See %s for basic instructions on building libextractor and GNUnet.", 
+   extlink_("user_gnunet.php3",
+           "Installation"));
+P();
+W("By default, all modules that are created in this way contain debug 
information and are quite large.");
+W("To compile release versions (small and fast) set the variable CFLAGS:");
+P();
+PRE("# CFLAGS='-O2 -march=pentium -fomit-frame-pointer' ./configure 
--prefix=\$HOME --with-extractor=\$HOME");
+EP();
+H4("Installer");
+BP();
+W("The GNUnet installer is made with %s.", 
extlink_("http://nsis.sourceforge.net/";,
+       "NSIS"));
+W("The installer script is located in contrib\win in the GNUnet source tree.");
+EP();
+H4("Source");
+BP();
+W("The sources of all dependencies are available %s.", 
+   extlink_("download/win/3rd_party_sources.tar",
+           "here"));
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/html_footer.php3
===================================================================
--- GNUnet-docs/WWW/test/html_footer.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/html_footer.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,30 +1,30 @@
-<?php
-if (! $no_footer) {
-  P();
-  if ($menu != "NO") {
-    HR();
-    $menu_once = 0;
-    menu_bar();
-  }
-  HR();
-  PRE("Copyright (C) 2002, 2003, 2004, 2005 Christian Grothoff.\n" .
-      "Verbatim copying and distribution of this entire article\n" .
-      "is permitted in any medium, provided this notice is preserved.");
-  BR();
-  generateFooter();
-  if ($haveNBO) {
-    HR();
-    H2("Footnotes");
-    ANCHOR("NBO");H3("NBO - network byte order");
-               BP();
-    W("Fields of this type are in network byte order.");
-    W("Before reading these fields, they must be converted to host byte" .
-      " order using <tt>htons</tt> for 2-byte values, <tt>htonl</tt> for 
4-byte values" .
-      " and <tt>htonll</tt> for 8-byte values.");
-    W("Before writing to these fields, the value must be converted using" . 
-      " <tt>ntohs</tt>, <tt>ntohl</tt> and <tt>ntohll</tt> respectively.");   
-               EP();
-  }
-  echo "</body></html>\n";
- }
-?>
+<?php
+if (! $no_footer) {
+  P();
+  if ($menu != "NO") {
+    HR();
+    $menu_once = 0;
+    menu_bar();
+  }
+  HR();
+  PRE("Copyright (C) 2002, 2003, 2004, 2005, 2006 Christian Grothoff.\n" .
+      "Verbatim copying and distribution of this entire article\n" .
+      "is permitted in any medium, provided this notice is preserved.");
+  BR();
+  generateFooter();
+  if ($haveNBO) {
+    HR();
+    H2("Footnotes");
+    ANCHOR("NBO");H3("NBO - network byte order");
+               BP();
+    W("Fields of this type are in network byte order.");
+    W("Before reading these fields, they must be converted to host byte" .
+      " order using <tt>htons</tt> for 2-byte values, <tt>htonl</tt> for 
4-byte values" .
+      " and <tt>htonll</tt> for 8-byte values.");
+    W("Before writing to these fields, the value must be converted using" . 
+      " <tt>ntohs</tt>, <tt>ntohl</tt> and <tt>ntohll</tt> respectively.");   
+               EP();
+  }
+  echo "</body></html>\n";
+ }
+?>

Modified: GNUnet-docs/WWW/test/html_header.php3
===================================================================
--- GNUnet-docs/WWW/test/html_header.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/html_header.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,49 +1,49 @@
-<?php
-DOCTYPE("HTML", "Transitional");
-echo "<html><head>\n";
-$haveNBO = 0;
-if ($title) {
-  TITLE($title);
- } else {
-  TITLE("GNUnet");
- }
-if ($description) {
-  echo "<meta name=\"description\" content=\"";
-  TRANSLATE($description);
-  echo "\">";
- }
-?>
-<meta name="author" content="Christian Grothoff">
-<meta name="keywords" 
content="GNUnet,distributed,anonymous,p2p,sharing,accounting,accountability,denyability,backup,freenet,file,decentralized,free,GNU,Linux,GPL">
-<meta name="robots" content="index,follow">
-<meta name="revisit-after" content="28 days">
-<?php
-echo "<meta name=\"content-language\" content=\"" . $languagecodes[$lang] . 
"\">";
-echo "<meta name=\"language\" content=\"" . $languagecodes[$lang] . "\">";
-?>
-<meta name="publisher" content="Christian Grothoff">
-<meta name="date" content="2004-12-19">
-<?php
-if ($author)
- echo "<meta name=\"rights\" content=\"(C) 2001,2002,2003,2004 by $author\">";
-else
- echo "<meta name=\"rights\" content=\"(C) 2001,2002,2003,2004 by Christian 
Grothoff\">";
-?>
-<meta http-equiv="expires" content="43200">
-<meta http-equiv="content-type" content="text/html">
-<meta http-equiv="Content-Style-Type" content="text/css">
-<link rel=stylesheet type="text/css" href="gnunet.css">
-</head>
-<body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">
-<?php
- if ($menu != "NO") {
-   include("menu.php3");
-?>
-<font class="lang-menu">
-<?php
-   generateLanguageBar();
-?>
-</font>
-<?php
- }
-?>
+<?php
+DOCTYPE("HTML", "Transitional");
+echo "<html><head>\n";
+$haveNBO = 0;
+if ($title) {
+  TITLE($title);
+ } else {
+  TITLE("GNUnet");
+ }
+if ($description) {
+  echo "<meta name=\"description\" content=\"";
+  TRANSLATE($description);
+  echo "\">";
+ }
+?>
+<meta name="author" content="Christian Grothoff">
+<meta name="keywords" 
content="GNUnet,distributed,anonymous,p2p,sharing,accounting,accountability,denyability,backup,freenet,file,decentralized,free,GNU,Linux,GPL">
+<meta name="robots" content="index,follow">
+<meta name="revisit-after" content="28 days">
+<?php
+echo "<meta name=\"content-language\" content=\"" . $languagecodes[$lang] . 
"\">";
+echo "<meta name=\"language\" content=\"" . $languagecodes[$lang] . "\">";
+?>
+<meta name="publisher" content="Christian Grothoff">
+<meta name="date" content="2004-12-19">
+<?php
+if ($author)
+ echo "<meta name=\"rights\" content=\"(C) 2001,2002,2003,2004 by $author\">";
+else
+ echo "<meta name=\"rights\" content=\"(C) 2001,2002,2003,2004 by Christian 
Grothoff\">";
+?>
+<meta http-equiv="expires" content="43200">
+<meta http-equiv="content-type" content="text/html">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel=stylesheet type="text/css" href="gnunet.css">
+</head>
+<body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">
+<?php
+ if ($menu != "NO") {
+   include("menu.php3");
+?>
+<font class="lang-menu">
+<?php
+   generateLanguageBar();
+?>
+</font>
+<?php
+ }
+?>

Modified: GNUnet-docs/WWW/test/i18nhtml.inc.php
===================================================================
--- GNUnet-docs/WWW/test/i18nhtml.inc.php       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/i18nhtml.inc.php       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -183,7 +183,11 @@
   if ($hasTranslation == "")
     $hasTranslation = $i18nHTMLhasTranslation;
   if ( ($editor) || ($i18nHTMLhasTranslation == 0) ) {
-    $back = "http://"; . $HTTP_SERVER_VARS["HTTP_HOST"] . 
$HTTP_SERVER_VARS["REQUEST_URI"];
+    $protocol = "http";
+    if ($HTTP_SERVER_VARS["HTTPS"] == "on") {
+       $protocol = "https"; // switch to https
+    }
+    $back = $protocol . "://" . $HTTP_SERVER_VARS["HTTP_HOST"] . 
$HTTP_SERVER_VARS["REQUEST_URI"];
     return "<a href=\"" . $i18nHTMLbase . "translate.php?xlang="
       . $lang
       . "&amp;text=" . urlencode(fix($a))
@@ -790,9 +794,13 @@
   global $HTTP_SERVER_VARS;
 
   P();
-  echo "Translation engine based on <a 
href=\"http://gnunet.org/i18nHTML/\";>i18nHTML</a> (C) 2003, 2004, 2005 
Christian Grothoff.<br />\n";
+  echo "Translation engine based on <a 
href=\"http://gnunet.org/i18nHTML/\";>i18nHTML</a> (C) 2003, 2004, 2005 <a 
href=\"http://grothoff.org/christian/\";>Christian Grothoff</a>.<br />\n";
   if ( ($xlang) && ($xlang != "English") ) {
-    $back = "http://"; . $HTTP_SERVER_VARS["HTTP_HOST"] . 
$HTTP_SERVER_VARS["REQUEST_URI"];
+    $protocol = "http";
+    if ($HTTP_SERVER_VARS["HTTPS"] == "on") {
+       $protocol = "https"; // switch to https
+    }
+    $back = $protocol . "://" . $HTTP_SERVER_VARS["HTTP_HOST"] . 
$HTTP_SERVER_VARS["REQUEST_URI"];
     echo "<center><small>\n";
     if ($editor != 1)
       echo " <a href=\"$back&amp;editor=1\">" . W_("enter translation mode") . 
"</a>";
@@ -852,6 +860,12 @@
 function EP() {
   echo "</p>\n";
 }
+function BOL($attr="") {
+  echo "<ol $attr>\n";
+}
+function EOL() {
+  echo "</ol>\n";
+}
 function P($attr="") {
   EP();
   BP($attr);
@@ -862,12 +876,20 @@
 function HR() {
   echo "<hr/>\n";
 }
-function DTDD($a,$b) {
+function DTDD($a,$b,$args=null) {
   DT($a);
-  DD($b);
+  DD($b,$args);
 }
 function LILI($a,$b) {
-  echo "<li>" . extlink_($a,$b) . "</li>\n";
+  if ( ($a[0] == '#') ||
+       ( ($a[0] == 'h') &&
+         ($a[1] == 't') &&
+         ($a[2] == 't') &&
+         ($a[3] == 'p') ) ) {
+    echo "<li>" . extlink_($a,$b) . "</li>\n";
+  } else {
+    echo "<li>" . intlink_($a,$b) . "</li>\n";
+  }
 }
 function ANCHOR($a) {
   echo "<a name=\"$a\"></a>\n";
@@ -882,11 +904,10 @@
   $ret = $ret . "\" align=\"" . $align . "\" width=$width height=$height 
border=$border hspace=$hspace vspace=$vspace>\n";
   $ret = $ret . translateLink_($alt);
   if ($align == "CENTER")
-    $ret = $ret . "</center><p>\n";
+    $ret = $ret . "</center></p>\n";
   return $ret;
 }
 function IMG($src, $alt, $align="CENTER", $width, $height, $border=0, 
$hspace=0, $vspace=0) {
   echo IMG_($src, $alt, $align, $width, $height, $border, $hspace, $vspace);
 }
-
-?>
\ No newline at end of file
+?>

Modified: GNUnet-docs/WWW/test/index.php
===================================================================
--- GNUnet-docs/WWW/test/index.php      2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/index.php      2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,87 +1,124 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet";
-$description="GNUnet - an anonymous distributed backup system :-)";
-include("html_header.php3");
-
-H2("About GNUnet");
-
-BP();
-W("GNUnet is a framework for secure peer-to-peer networking that does not use 
any centralized or otherwise trusted services.");
-W("A first service implemented on top of the networking layer allows anonymous 
censorship-resistant file-sharing.");
-W("GNUnet uses a simple, excess-based economic model to allocate resources.");
-W("Peers in GNUnet monitor each others behavior with respect to resource 
usage; peers that contribute to the network are rewarded with better service.");
-P();
-
-W("GNUnet is part of the %s.",
-  extlink_("http://www.gnu.org/","GNU project"));
-W("Our official GNU website can be found at %s.",
-  
extlink_("http://www.gnu.org/software/gnunet/","http://www.gnu.org/software/gnunet/";));
-W("GNUnet can be downloaded from this site or the %s.",
-  extlink_("http://www.gnu.org/prep/ftp.html","GNU mirrors"));
-
-EP();
-H2("News");
-BP();
-W("Older news can be found %s.\n",
-  intlink_("old_news.php3", "here"));
-EP();
-echo "<dl>\n";
-
-function convert_time($mysql_timestamp){
-if (ereg("^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})" .
-           "([0-9]{2})([0-9]{2})",$mysql_timestamp,$res)):
-  $year=$res[1];
-  $month=$res[2];
-  $day=$res[3];
-  $hour=$res[4];
-  $min=$res[5];
-  $sec=$res[6];
-
- return(array($year,$month,$day,$hour,$min,$sec));
-  else:
-     return(false);
- endif;
-}
-
-// definition: news is what is less than 3 months old :-)
-$query = "SELECT title,include,posted FROM news " .
-   "WHERE TO_DAYS(NOW())-TO_DAYS(posted) < 90 " .
-   "ORDER BY posted DESC";
-$result = mysql_query($query, $connection);
-$num = 0;
-if ($result) {
-  $num = mysql_numrows($result);
-}
-for ($i=0;$i<$num;$i++) {
-  $row = mysql_fetch_array($result);
-  $pd = convert_time($row["posted"]);
-  echo "<dt>" . $pd[0] . "-" . $pd[1] . "-" . $pd[2] .  ": " . 
W_($row["title"]) . "</dt>\n";
-  echo "<dd>\n";
-  include($row["include"]);
-  echo "\n</dd>\n";
-}
-echo "</dl>\n";
-H2("Roadmap");
-BP();
-W("Here is the current development plan:");
-echo "<ul>\n";
-LI("fix %s",
-   extlink_("https://gnunet.org/mantis/","bugs";));
-LI("improve handling of pseudonyms (manage reputation in namespaces)");
-LI("add testbed harness to allow automated testing and profiling (%s)",
-   extlink_("mailto:address@hidden","contact";));
-LI("extend GTK UI (delete, statistics, configuration, recursive insertion)");
-LI("add download-daemon that manages ongoing/completed/stalled downloads");
-echo "</ul>\n";
-EP();
-H2("Contact");
-BP();
-W("GNUnet is developed by %s.",
-  extlink_("http://www.gnu.org/software/gnunet/","the GNUnet developers"));
-W("For questions about GNUnet send E-Mail to %s.",
-  extlink_("mailto:address@hidden","address@hidden";));
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet";
+$description="GNUnet - an anonymous distributed backup system :-)";
+include("html_header.php3");
+
+H2("About GNUnet");
+
+BP();
+W("GNUnet is a framework for secure peer-to-peer networking that does not use 
any centralized or otherwise trusted services.");
+W("A first service implemented on top of the networking layer allows anonymous 
censorship-resistant file-sharing.");
+W("GNUnet uses a simple, excess-based economic model to allocate resources.");
+W("Peers in GNUnet monitor each others behavior with respect to resource 
usage; peers that contribute to the network are rewarded with better service.");
+P();
+
+W("GNUnet is part of the %s.",
+  extlink_("http://www.gnu.org/","GNU project"));
+W("Our official GNU website can be found at %s.",
+  
extlink_("http://www.gnu.org/software/gnunet/","http://www.gnu.org/software/gnunet/";));
+W("GNUnet can be downloaded from this site or the %s.",
+  extlink_("http://www.gnu.org/prep/ftp.html","GNU mirrors"));
+P();
+
+W("%s is a graphical user interface for the GNUnet framework.",
+  intlink_("gnunetgtk.php3", "gnunet-gtk"));
+W("It is a separate %s; some %s are available.", 
+  ARRAY(intlink_("download.php3", "download"),
+        intlink_("screenshots.php3","screenshots")));
+
+EP();
+H2("Why GNUnet?");
+BP();
+W("The first question that developers of %s %s %s %s %s %s %s %s should 
probably answer is <em>why yet another network?</em>",
+  ARRAY(extlink_("http://freenetproject.org/";, "any"),
+        extlink_("http://tor.eff.org/";, "of"),
+        extlink_("http://mnet.sourceforge.net/";, "the"),
+        extlink_("http://www.i2p.net/";, "dozens"),
+        extlink_("http://gift.sf.net/";, "of"),
+        extlink_("http://entropy.stop1984.com/";, "emerging"),
+        extlink_("http://thecircle.org.au/";, "P2P"),
+        extlink_("http://www.invisiblenet.net/iip/";, "networks")));
+W("GNUnet was started in late 2001 with a set of new technical ideas for 
secure peer-to-peer networking.");
+W("Most of the key technical contributions behind GNUnet are described in 
detail in our %s.",
+  intlink_("papers.php3", "research papers"));
+W("When GNUnet was started, existing systems were investigated (at the time in 
particular %s and %s) to find a starting point.",
+  ARRAY(extlink_("http://freenetproject.org/";, "Freenet"),
+        extlink_("http://mnet.sourceforge.net/";, "mnet")));
+W("However, the conclusion was that the envisioned system was too far from the 
existing codebases to benefit from building on top of any of those.");
+P();
+W("GNUnet continues to improve both in terms of technical ideas and 
implementation, often thanks to discussions with developers from related 
projects.");
+W("Probably the most well-known such project is %s, a peer-to-peer network 
that acts as a proxy which anonymizes low-latency TCP traffic.",
+  extlink_("http://tor.eff.org/";, "TOR"));
+W("TOR is general in design and lacks features that would be specific to 
(anonymous) file-sharing, such as searching, swarming or caching.");
+P();
+W("In conclusion, we believe that GNUnet is (or at least will become) the best 
solution for (anonymous) file-sharing.");
+W("The key technical ideas continue to distinguish GNUnet from other projects 
with similar goals.");
+W("Some GNUnet developers also have the ambition to provide a good general 
infrastructure for developing new peer-to-peer protocols.");
+W("In the meantime, users that are looking for %s solutions or to %s should 
probably look elsewhere.",
+  ARRAY(extlink_("http://www.bittorrent.com/";, "faster, non-anonymous"),
+        extlink_("http://tor.eff.org/";, "anonymize their HTTP traffic")));
+
+EP();
+H2("News");
+BP();
+W("Older news can be found %s.\n",
+  intlink_("old_news.php3", "here"));
+EP();
+echo "<dl>\n";
+
+function convert_time($mysql_timestamp){
+if (ereg("^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})" .
+           "([0-9]{2})([0-9]{2})",$mysql_timestamp,$res)):
+  $year=$res[1];
+  $month=$res[2];
+  $day=$res[3];
+  $hour=$res[4];
+  $min=$res[5];
+  $sec=$res[6];
+
+ return(array($year,$month,$day,$hour,$min,$sec));
+  else:
+     return(false);
+ endif;
+}
+
+// definition: news is what is less than 3 months old :-)
+$query = "SELECT title,include,posted FROM news " .
+   "WHERE TO_DAYS(NOW())-TO_DAYS(posted) < 90 " .
+   "ORDER BY posted DESC";
+$result = mysql_query($query, $connection);
+$num = 0;
+if ($result) {
+  $num = mysql_numrows($result);
+}
+for ($i=0;$i<$num;$i++) {
+  $row = mysql_fetch_array($result);
+  $pd = convert_time($row["posted"]);
+  echo "<dt>" . $pd[0] . "-" . $pd[1] . "-" . $pd[2] .  ": " . 
W_($row["title"]) . "</dt>\n";
+  echo "<dd>\n";
+  include("news/" . $row["include"]);
+  echo "\n</dd>\n";
+}
+echo "</dl>\n";
+H2("Roadmap");
+BP();
+W("Here is the current development plan:");
+echo "<ul>\n";
+LI("fix %s",
+   extlink_("https://gnunet.org/mantis/","bugs";));
+LI("add testbed harness to allow automated testing and profiling");
+LI("extend GTK UI (unindex, more statistics, configuration)");
+LI("complete and integrate DHT implementation");
+echo "</ul>\n";
+EP();
+H2("Contact");
+BP();
+W("GNUnet is developed by %s.",
+  extlink_("http://www.gnu.org/software/gnunet/","the GNUnet developers"));
+W("For questions about GNUnet send E-Mail to %s.",
+  extlink_("mailto:address@hidden","address@hidden";));
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/links.php3
===================================================================
--- GNUnet-docs/WWW/test/links.php3     2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/links.php3     2006-04-01 11:59:15 UTC (rev 2599)
@@ -5,77 +5,98 @@
 include("html_header.php3");
 
 H2("GNUnet related projects");
-gnunetlogo();
-?>
-<ul>
- <li><a href="http://freshmeat.net/projects/gnunet/";>GNUnet on 
freshmeat</a></li>
- <li><a href="/freeway/">freeway (GNUnet port to Java)</a></li>
- <li><a href="http://xnap.org/";>xnap (GNUnet-freeway plugin is under 
development)</a></li>
- <li><a href="/libextractor/">libextractor</a></li>
- <li><a href="http://shell.franken.de/~dg1nsw/gnunet/faq/";>Another GNUnet 
FAQ</a></li>
- <li><a href="http://www.angelfire.com/super2/duologue/gnunet/";>Tom 
Barnes-Lewrence&rsquo;s GNUnet page with FAQ and informal keyword 
standard</a></li>
- <li><a href="http://gnunet.wensley.org.uk/";>GNUnet hostlist and various 
tips</a></li>
-</ul>
-<?php
+echo "<ul>";
+LILI("http://freshmeat.net/projects/gnunet/";, "GNUnet on freshmeat");
+LILI("/freeway/", "freeway (GNUnet port to Java)");
+LILI("http://xnap.org/";, "xnap (GNUnet-freeway plugin is under development)");
+LILI("/libextractor/", "libextractor");
+LILI("http://shell.franken.de/~dg1nsw/gnunet/faq/";, "Another GNUnet FAQ");
+LILI("http://gnunet.wensley.org.uk/";, "GNUnet hostlist and various tips");
+LILI("http://metalinks.sourceforge.net/";, "metalinks");
+echo "</ul>\n";
 H2("Other p2p Networks");
-?>
-<ul>
- <li><a href="http://freenetproject.org/";>Freenet</a></li>
- <li><a href="http://tor.eff.org/";>The Onion Router (TOR)</a></li>
- <li><a href="http://mnet.sourceforge.net/";>Mnet</a></li>
- <li><a href="http://www.i2p.net/";>I2P</a></li>
- <li><a href="http://mute-net.sourceforge.net/";>Mute</a></li>
- <li><a href="http://www.openp2p.com/";>OpenP2P</a></li>
- <li><a href="http://www.freehaven.net/";>Freehaven</a></li>
- <li><a href="http://entropy.stop1984.com/";>Entropy</a></li>
- <li><a href="http://cs1.cs.nyu.edu/~waldman/publius/";>Publius</a></li>
- <li><a href="http://www.distributed.net";>Distributed.Net</a></li>
- <li><a href="http://grapevine.sourceforge.net";>Grapevine Project</a></li>
- <li><a href="http://freepastry.rice.edu/";>FreePastry</a></li>
- <li><a href="http://www.invisiblenet.net/iip/";>Anonymous P2P Chat</a></li>
- <li><a href="http://thecircle.org.au/";>The Circle, Chord based file 
sharing</a></li>
- <li><a href="http://www.gnutella2.com/";>gnutella2</a></li>
-</ul>
-<?php
+echo "<ul>\n";
+LILI("http://freenetproject.org/","Freenet";);
+LILI("http://tor.eff.org/","The Onion Router (TOR)");
+LILI("http://mnet.sourceforge.net/","Mnet";);
+LILI("http://www.i2p.net/","I2P";);
+LILI("http://mute-net.sourceforge.net/","Mute";);
+LILI("http://www.freehaven.net/","Freehaven";);
+LILI("http://entropy.stop1984.com/","Entropy";);
+LILI("http://cs1.cs.nyu.edu/~waldman/publius/","Publius";);
+LILI("http://www.distributed.net","Distributed.Net";);
+LILI("http://grapevine.sourceforge.net","Grapevine Project");
+LILI("http://freepastry.org/","FreePastry";);
+LILI("http://www.invisiblenet.net/iip/","Anonymous P2P Chat");
+LILI("http://thecircle.org.au/","The Circle, Chord based file sharing");
+LILI("http://gift.sf.net/","giFT";);
+LILI("http://www.gnutella2.com/","gnutella2";);
+echo "</ul>\n";
+H2("Relevant Conferences");
+BP();
+W("Note that the list excludes security conferences that have a broader 
focus.");
+EP();
+echo "<ul>\n";
+LILI("http://petworkshop.org/";,
+     "PET (Privacy Enhancing Technologies)");
+LILI("http://iptps05.cs.cornell.edu/";,
+     "International Workshop on Peer-To-Peer Systems");
+LILI("http://www.ieee-security.org/TC/SP-Index.html";,
+     "IEEE Symposium on Security and Privacy");
+LILI("http://p2pecon.cs.cornell.edu/";,
+     "Workshop on the Economics of Peer-to-Peer Systems");
+LILI("http://www.isrc.qut.edu.au/events/acisp2005/";,
+     "Australasian Conference on Information Security and Privacy");
+LILI("http://www.ieee-security.org/TC/SP-Index.html";,
+     "IEEE Symposium on Security and Privacy");
+LILI("http://www.uoc.edu/symposia/ih05/";,
+     "Information Hiding Workshop");
+echo "</ul>\n";
+
+
 H2("Mailinglists");
-?>
-<ul>
- <li><a href="http://www.cypherspace.org/";>Cypherspace</a></li>
- <li><a href="http://zgp.org/mailman/listinfo/p2p-hackers";>P2P Hackers 
mailinglist</a></li>
- <li><a href="http://www.nymip.org/mailman/listinfo";>nymip</a></li>
-</ul>
-<?php
+echo "<ul>\n";
+LILI("http://zgp.org/mailman/listinfo/p2p-hackers";,
+     "P2P Hackers mailinglist");
+echo "</ul>\n";
 H2("Other related work");
-?>
-<ul>
- <li><a href="http://freehaven.net/anonbib/date.html";>Anonymity Research 
bibliography</a></li>
- <li><a href="http://www.cl.cam.ac.uk/~rja14/econsec.html";>Economics and 
Security Resource Page</a></li>
- <li><a href="http://bitconjurer.org/BitTorrent/";>BitTorrent</a></li>
- <li><a href="http://mixminion.net/";>Mixminion</a></li>
- <li><a href="http://mixmaster.sourceforge.net/";>Mixmaster</a></li>
- <li><a href="http://www.advogato.org/trust-metric.html";>Avogadro</a>, another 
system based on
-     trust to keep malicious participants in check</li>
- <li><a href="http://www.cs.umd.edu/projects/nice/";>NICE</a>, peer-to-peer 
research
-     project that is still in the early stages.</li>
- <li><a 
href="http://www.open-content.net/specs/draft-jchapweske-thex-02.html";>Tree 
Hash EXchange format (THEX)</a></li>
-</ul>
-<?php
+echo "<ul>\n";
+LILI("http://freehaven.net/anonbib/date.html";,
+     "Anonymity Research bibliography");
+LILI("http://www.cl.cam.ac.uk/~rja14/econsec.html";,
+     "Economics and Security Resource Page");
+LILI("http://www.bittorrent.com/","BitTorrent";);
+LILI("http://mixminion.net/","Mixminion";);
+LILI("http://mixmaster.sourceforge.net/","Mixmaster";);
+LILI("http://www.advogato.org/trust-metric.html";,
+     "Avogadro another system based on trust to keep malicious participants in 
check");
+LILI("http://www.cs.umd.edu/projects/nice/";,
+     "NICE, peer-to-peer research project (still in the early stages)");
+LILI("http://www.open-content.net/specs/draft-jchapweske-thex-02.html";,
+     "Tree Hash EXchange format (THEX)");
+echo "</ul>\n";
 H2("Praise &amp; Press");
 BP();
 W("Note that these articles were all written independently and most of the 
time without any feedback from the GNUnet developers.");
 W("Some contain some serious mistakes.");
 EP();
+echo "<ul>\n";
+LILI("http://www.golem.de/0204/19103.html";,
+     "Golem.de");
+LILI("http://www.kuro5hin.org/story/2002/6/3/185643/7148";,
+     "kuro5hin");
+LILI("http://www.infoanarchy.org/story/2002/4/1/5152/25842";,
+     "infoanarchy");
+LILI("http://www.gnu.org/brave-gnu-world/issue-40.en.html";,
+     "Brave GNU World");
+LILI("http://www.heise.de/newsticker/data/jk-28.03.03-003/";,
+     "Heise reporting about PET 2003");
+LILI("http://lwn.net/Articles/61329/";,
+     "LWN");
+LILI("http://www.root.cz/clanek/2551";,
+     "Article about GNUnet on root.cz");
+LILI("http://lwn.net/Articles/162190/";,
+     "Linux Weekly News");
+echo "</ul>";
+include("html_footer.php3");
 ?>
-<ul>
- <li><a href="http://www.golem.de/0204/19103.html";>Golem.de</a></li>
- <li><a 
href="http://www.kuro5hin.org/story/2002/6/3/185643/7148";>kuro5hin</a></li>
- <li><a 
href="http://www.infoanarchy.org/story/2002/4/1/5152/25842";>infoanarchy</a></li>
- <li><a href="http://www.gnu.org/brave-gnu-world/issue-40.en.html";>Brave GNU 
World</a></li>
- <li><a href="http://www.heise.de/newsticker/data/jk-28.03.03-003/";>Heise 
reporting</a> about <a href="http://petworkshop.org/";>PET</a></li>
- <li><a href="http://lwn.net/Articles/61329/";>LWN</a></li>
- <li><a href="http://www.root.cz/clanek/2551";>Article about GNUnet on 
root.cz</a></li>
-</ul>
-
-<?php
- include("html_footer.php3");
-?>

Modified: GNUnet-docs/WWW/test/mailinglist.php3
===================================================================
--- GNUnet-docs/WWW/test/mailinglist.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/mailinglist.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,97 +1,91 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet: Contact";
-$description="Ways to get in contact with the GNUnet developers and to keep in 
touch with the development.";
-include("html_header.php3");
-
-H2("Blogs, Forum, Stories and Polls");
-BP();
-W("GNUnet uses %s as a community content management system.",
-  extlink_("http://gnunet.org/drupal/";, "drupal"));
-W("There, you can read the latest stories, participate in the forums and polls 
and even start your own blogs.");
-W("Everything related to GNUnet is welcome, as long as it is respectful and 
legal.");
-EP();
-
-H2("Bugtrack");
-BP();
-W("GNUnet uses Mantis for bugtracking.");
-W("Visit %s to report bugs.",
-  extlink_("https://gnunet.org/mantis/","https://gnunet.org/mantis/";));
-W("You need to sign up for a reporter account.");
-W("Please make sure you report bugs under <strong>GNUnet</strong> and not 
under any of the other projects.");
-P();
-W("If you dislike Mantis and need to report a bug via E-mail, you can use the 
standard GNU way by sending mail to %s.",
-  extlink_("mailto:address@hidden","address@hidden";));
-EP();
-
-H2("GNUnet Development");
-BP();
-W("This mailinglist is used for developer communication.");
-W("Signing up is easy, send good patches and you get CVS access, too:");
-EP();
-echo "<center>";
-BP();
-extlink("http://mail.gnu.org/mailman/listinfo/gnunet-developers","Developers";);
-EP();
-echo "</center>";
-
-H2("GNUnet Users");
-BP();
-W("<tt>help-gnunet</tt> is a mailinglist that is intended as a discussion 
forum for users, such that they can help other users.");
-W("Some developers usually also hang around to help.");
-W("This mailinglist is be open for everybody and any kind of (netiquette 
compatible) discussion:");
-EP();
-echo "<center>";
-BP();
-extlink("http://mail.gnu.org/mailman/listinfo/help-gnunet","Users";);
-EP();
-echo "</center>";
-
-H2("GNUnet Announcements");
-BP();
-W("If you just want to receive announcements of new versions, you can 
subscribe to a strictly moderated mailinglist.");
-W("Only developers can post announcements for new releases of GNUnet related 
software on this list.");
-W("All other mail will be discareded.");
-W("This list is not for discussions or bug reports!");
-EP();
-echo "<center>";
-BP();
-extlink("http://mail.gnu.org/mailman/listinfo/info-gnunet","Announcements";);
-EP();
-echo "</center>";
-
-H2("GNUnet Diffs");
-BP();
-W("This mailinglist is used to instantly publish all commits to the %s.",
-  extlink_("/svn/", "GNUnet subversion repository"));
-W("So if you want to be notified about any change to the GNUnet codebase, you 
can subscribe to this mailinglist.");
-W("Only subversion-diffs should (and hopefully can) be posted on this list.");
-W("All other mail will be discareded.");
-EP();
-echo "<center>";
-BP();
-extlink("http://mail.gnu.org/mailman/listinfo/gnunet-sv","Diffs";);
-EP();
-echo "</center>";
-
-H2("Other Discussion Forums");
-BP();
-W("The %s is a webpage for discussions of GNUnet and related topics.",
-  extlink_("http://www.boardy.de/forumdisplay.php?forumid=104104","GNUnet 
Forum"));
-W("The forum was started by German GNUnet users and hence many postings are in 
German, but contributions in English are welcome.");
-W("Note that the forum is not the place for reporting bugs, please use 
Mantis.");
-W("Also, the main forum for GNUnet is now %s.",
-  extlink_("/drupal/", "here"));
-W("%s is an international P2P board with GNUnet related subcategories.",
-  extlink_("http://board.planetpeer.de/";, "Planet Peer"));
-EP();
-
-H2("Chat");
-BP();
-W("Various GNUnet people are regularly hanging out on the %s.",
-  extlink_("http://www.freenode.net/","Freenode IRC Network"));
-W("The channel name is <tt>#GNUnet</tt>.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet: Contact";
+$description="Ways to get in contact with the GNUnet developers and to keep in 
touch with the development.";
+include("html_header.php3");
+
+H2("Blogs, Forum, Stories and Polls");
+BP();
+W("GNUnet uses %s as a community content management system.",
+  extlink_("http://gnunet.org/drupal/";, "drupal"));
+W("There, you can read the latest stories, participate in the forums and polls 
and even start your own blogs.");
+W("Everything related to GNUnet is welcome, as long as it is respectful and 
legal.");
+EP();
+
+H2("Bugtrack");
+BP();
+W("GNUnet uses Mantis for bugtracking.");
+W("Visit %s to report bugs.",
+  extlink_("https://gnunet.org/mantis/","https://gnunet.org/mantis/";));
+W("You need to sign up for a reporter account.");
+W("Please make sure you report bugs under <strong>GNUnet</strong> and not 
under any of the other projects.");
+P();
+W("If you dislike Mantis and need to report a bug via E-mail, you can use the 
standard GNU way by sending mail to %s.",
+  extlink_("mailto:address@hidden","address@hidden";));
+EP();
+
+H2("Mailinglists");
+BP();
+echo "<dl><dt>";
+extlink("http://mail.gnu.org/mailman/listinfo/gnunet-developers","Developers";);
+echo "</dt><dd>";
+W("This mailinglist is used for developer communication.");
+W("Signing up is easy, send good patches and you get Subversion access, too.");
+echo "</dd><dt>";
+extlink("http://mail.gnu.org/mailman/listinfo/help-gnunet","Users";);
+echo "</dt><dd>";
+W("<tt>help-gnunet</tt> is a mailinglist that is intended as a discussion 
forum for users, such that they can help other users.");
+W("Some developers usually also hang around to help.");
+echo "</dd><dt>";
+extlink("http://mail.gnu.org/mailman/listinfo/info-gnunet","Announcements";);
+echo "</dt><dd>";
+W("If you just want to receive announcements of new versions, you can 
subscribe to a strictly moderated mailinglist.");
+W("Only developers can post announcements for new releases of GNUnet related 
software on this list.");
+W("All other mail will be discareded.");
+W("This list is not for discussions or bug reports!");
+echo "</dd><dt>";
+extlink("http://mail.gnu.org/mailman/listinfo/gnunet-svn","Diffs";);
+echo "</dt><dd>";
+W("This mailinglist is used to instantly publish all commits to the %s.",
+  extlink_("/svn/", "GNUnet Subversion repository"));
+W("So if you want to be notified about any change to the GNUnet codebase, you 
can subscribe to this mailinglist.");
+W("Only Subversion-diffs should (and hopefully can) be posted on this list.");
+W("All other mail will be discareded.");
+W("Do not send patches to this list, send them to the developer mailinglist 
instead!");
+echo "</dd></dl>";
+EP();
+
+H2("Other Discussion Forums");
+BP();
+W("The %s is a webpage for discussions of GNUnet and related topics.",
+  extlink_("http://www.boardy.de/forumdisplay.php?forumid=104104","GNUnet 
Forum"));
+W("The forum was started by German GNUnet users and hence many postings are in 
German, but contributions in English are welcome.");
+W("Note that the forum is not the place for reporting bugs, please use 
Mantis.");
+W("Also, the main forum for GNUnet is now %s.",
+  extlink_("/drupal/", "here"));
+W("%s is an international P2P board with GNUnet related subcategories.",
+  extlink_("http://board.planetpeer.de/";, "Planet Peer"));
+EP();
+
+H2("Chat");
+BP();
+W("Various GNUnet people are regularly hanging out on the %s.",
+  extlink_("http://www.freenode.net/","Freenode IRC Network"));
+W("The channel name is <tt>#GNUnet</tt>.");
+EP();
+
+H2("Public Keys");
+BP();
+W("Use these %s to send encrypted mails to the GNUnet developers and to verify 
authenticity and integrity of mails and files.",
+       extlink_("http://en.wikipedia.org/wiki/Public_key";, "public keys"));
+echo "<dl><dt>Christian Grothoff</dt><dd>";
+extlink("http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE5D02E42";, 
"0xE5D02E42");
+echo "</dd><dt>Nils Durner</dt><dd>";
+extlink("http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x09F4A1E1";, 
"0x09F4A1E1");
+echo ", ";
+extlink("http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x3D23F25D";, 
"0x3D23F25D");
+echo "</dd></dl>";
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/menu.php3
===================================================================
--- GNUnet-docs/WWW/test/menu.php3      2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/menu.php3      2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,39 +1,39 @@
-<?php
-if (! $menu_once) {
-  $menu_once = 1;
-?>
-<table bgcolor="#0a6cce" border="0" cellpadding="0" cellspacing="0" 
height="58" width="100%">
-  <tr> 
-    <td colspan="4" height="10" nowrap="nowrap" valign="middle">
-    </td>
-  </tr>
-  <tr>
-    <td width="15">
-     &nbsp;
-    </td>
-    <td height="1" nowrap="nowrap" valign="middle"> 
-                       <font class="title">GNUnet</font>
-                       <br />
-                       <font class="subtitle">
-                               <?php
-                                       W("GNU's decentralized anonymous and 
censorship-resistant P2P framework.");
-                               ?>
-                       </font>
-
-    </td>
-    <td align="right" valign="top">
-       <img src="gnunet-logo.png" />
-    </td>
-    <td width="10">
-     &nbsp;
-    </td>
-  </tr>
-  <tr> 
-    <td colspan="4" height="10" nowrap="nowrap" valign="middle">
-    </td>
-  </tr>
-</table>
-<?php
-       menu_bar();
- }
-?>                         
+<?php
+if (! $menu_once) {
+  $menu_once = 1;
+?>
+<table bgcolor="#0a6cce" border="0" cellpadding="0" cellspacing="0" 
height="58" width="100%">
+  <tr> 
+    <td colspan="4" height="10" nowrap="nowrap" valign="middle">
+    </td>
+  </tr>
+  <tr>
+    <td width="15">
+     &nbsp;
+    </td>
+    <td height="1" nowrap="nowrap" valign="middle"> 
+                       <font class="title">GNUnet</font>
+                       <br />
+                       <font class="subtitle">
+                               <?php
+                                       W("GNU&#8216;s decentralized anonymous 
and censorship-resistant P2P framework.");
+                               ?>
+                       </font>
+
+    </td>
+    <td align="right" valign="top">
+       <img src="gnunet-logo-color.png" height=75 width=73 alt="GNUnet logo" />
+    </td>
+    <td width="10">
+     &nbsp;
+    </td>
+  </tr>
+  <tr> 
+    <td colspan="4" height="10" nowrap="nowrap" valign="middle">
+    </td>
+  </tr>
+</table>
+<?php
+       menu_bar();
+ }
+?>                         

Modified: GNUnet-docs/WWW/test/old_news.php3
===================================================================
--- GNUnet-docs/WWW/test/old_news.php3  2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/old_news.php3  2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,48 +1,48 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet";
-$description="GNUnet: older news";
-include("html_header.php3");
-
-H2("News archive");
-BP();
-W("The archive dates back until February 2003.");
-W("Before then, news were not archived.");
-EP();
-echo "<dl>\n";
-
-function convert_time($mysql_timestamp){
-if (ereg("^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})" .
-           "([0-9]{2})([0-9]{2})",$mysql_timestamp,$res)):
- $year=$res[1];
-  $month=$res[2];
-  $day=$res[3];
- $hour=$res[4];
-  $min=$res[5];
-  $sec=$res[6];
-
- return(array($year,$month,$day,$hour,$min,$sec));
-  else:
-     return(false);
- endif;
-}
-
-$query = "SELECT title,include,posted FROM news " .
-   "ORDER BY posted DESC";
-$result = mysql_query($query, $connection);
-$num = 0;
-if ($result) {
-  $num = mysql_numrows($result);
-}
-for ($i=0;$i<$num;$i++) {
-  $row = mysql_fetch_array($result);
-  $pd = convert_time($row["posted"]);
-  echo "<dt>" . $pd[0] . "-" . $pd[1] . "-" . $pd[2] .  ": " . 
W_($row["title"]) . "</dt>\n";
-  echo "<dd>\n";
-  include($row["include"]);
-  echo "</dd>\n";
-}
-echo "</dl>\n";
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet";
+$description="GNUnet: older news";
+include("html_header.php3");
+
+H2("News archive");
+BP();
+W("The archive dates back until February 2003.");
+W("Before then, news were not archived.");
+EP();
+echo "<dl>\n";
+
+function convert_time($mysql_timestamp){
+if (ereg("^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})" .
+           "([0-9]{2})([0-9]{2})",$mysql_timestamp,$res)):
+ $year=$res[1];
+  $month=$res[2];
+  $day=$res[3];
+ $hour=$res[4];
+  $min=$res[5];
+  $sec=$res[6];
+
+ return(array($year,$month,$day,$hour,$min,$sec));
+  else:
+     return(false);
+ endif;
+}
+
+$query = "SELECT title,include,posted FROM news " .
+   "ORDER BY posted DESC";
+$result = mysql_query($query, $connection);
+$num = 0;
+if ($result) {
+  $num = mysql_numrows($result);
+}
+for ($i=0;$i<$num;$i++) {
+  $row = mysql_fetch_array($result);
+  $pd = convert_time($row["posted"]);
+  echo "<dt>" . $pd[0] . "-" . $pd[1] . "-" . $pd[2] .  ": " . 
W_($row["title"]) . "</dt>\n";
+  echo "<dd>\n";
+  include("news/" . $row["include"]);
+  echo "</dd>\n";
+}
+echo "</dl>\n";
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/papers.php3
===================================================================
--- GNUnet-docs/WWW/test/papers.php3    2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/papers.php3    2006-04-01 11:59:15 UTC (rev 2599)
@@ -29,8 +29,9 @@
 
 echo "<dl>\n";
 DT("An Encoding for Censorship-Resistant Sharing (%s)",
-   extlink_("download/ecrs.ps","PS"));
-echo "<dd>"; echo "Krista Bennett, Christian Grothoff, Tzvetan Horozov "; 
W("and"); echo " J. T. Lindgren";
+   ARRAY(extlink_("download/ecrs.ps","ps"),
+         extlink_("download/ecrs.pdf","pdf")));
+echo "<dd>"; echo "Christian Grothoff, Krista Grothoff, Tzvetan Horozov "; 
W("and"); echo " J. T. Lindgren";
 BR();
 echo "<font class=desc>\n";
 W("The paper describes the encoding of content for the file-sharing layer of 
<em>GNUnet</em>.");
@@ -56,8 +57,9 @@
 W("The paper also compares the performance of the UDP, TCP and SMTP 
transport.");
 echo "</font>\n";
 echo "</dd>\n";
-DT("An Excess-Based Economic Model for Resource Allocation in Peer-to-Peer 
Networks (%s), %s %s.",
-   ARRAY(extlink_("download/ebe.ps","PS"),
+DT("An Excess-Based Economic Model for Resource Allocation in Peer-to-Peer 
Networks (%s, %s), %s %s.",
+   ARRAY(extlink_("download/ebe.ps","ps"),
+         extlink_("download/ebe.pdf","pdf"),
         extlink_("http://www.wirtschaftsinformatik.de/","WI";),
         
extlink_("http://www.wirtschaftsinformatik.de/wi_artikel.php?sid=917","3&rsquo;2003";)));
 echo "<dd>"; echo "Christian Grothoff";
@@ -71,8 +73,9 @@
 W("Unlike schemes for digital cash, we do not require a trusted authority.");
 echo "</font>\n";
 echo "</dd>\n";
-DT("A Quick Introduction to Bloom Filters (%s)",
-   extlink_("download/bloomfilter.ps","ps"));
+DT("A Quick Introduction to Bloom Filters (%s, %s)",
+   ARRAY(extlink_("download/bloomfilter.ps","ps"),
+         extlink_("download/bloomfilter.pdf","pdf")));
 echo "<dd>"; echo "Christian Grothoff";
 BR();
 echo "<font class=desc>\n";
@@ -82,8 +85,9 @@
 W("Bloom filters are used in GNUnet for fast set tests that must be performed 
for each query.");
 echo "</dd>";
 IMG("afs_small.png", "Anonymous file sharing logo", "RIGHT", 150, 115);
-DT("gap -- practical anonymous networking (%s, %s), %s.",
-   ARRAY(extlink_("download/aff.ps","PS"),
+DT("gap -- practical anonymous networking (%s, %s, %s), %s.",
+   ARRAY(extlink_("download/aff.ps","ps"),
+         extlink_("download/aff.pdf","pdf"),
         extlink_("download/pet/","slides"),
         extlink_("http://petworkshop.org/","PET 2003")));
 echo "<dd>"; echo " Krista Bennett "; W("and"); echo " Christian Grothoff";
@@ -120,15 +124,16 @@
 echo "</font>\n";
 echo "</dd>\n";
 
-DT("Efficient Sharing of Encrypted Data (%s), %s",
-   ARRAY(extlink_("download/esed.ps","PS"),
+DT("Efficient Sharing of Encrypted Data (%s, %s), %s",
+   ARRAY(extlink_("download/esed.ps","ps"),
+         extlink_("download/esed.pdf","pdf"),
         extlink_("http://www.cm.deakin.edu.au/ACISP&rsquo;02/","ACISP 2002")));
 echo "<dd>"; echo "Krista Bennett, Christian Grothoff, Tzvetan Horozov "; 
W("and"); echo " Ioana Patrascu";
 BR();
 echo "<font class=desc>\n";
 W("<strong>This paper is now obsolete.</strong>");
 W("It has been superceeded by %s.",
-  extlink_("download/ecrs.ps", "ECRS"));
+  extlink_("download/ecrs.pdf", "ECRS"));
 W("The paper describes the encryption of content for the file-sharing layer of 
<em>GNUnet</em>.");
 W("We describe a new technique to encode content such that it can be easily 
distributed, searched for and retrieved.");
 W("The encryption scheme allows users to insert the same content under 
multiple keys; yet multiple keys lead to practically identical copies in the 
system, reducing storage requirements.");
@@ -146,8 +151,8 @@
   extlink_("encoding.php3","encoding page"));
 echo "</dd>\n";
 DT("The GNet Whitepaper (%s or %s)",
-   ARRAY(extlink_("download/main.ps","PS"),
-        extlink_("download/main.pdf","PDF")));
+   ARRAY(extlink_("download/main.ps","ps"),
+        extlink_("download/main.pdf","pdf")));
 echo "<dd>"; echo "Krista Bennett, Christian Grothoff, Tzvetan Horozov, Ioana 
Patrascu ";
 W("and");
 echo " Tiberius Stef";
@@ -260,13 +265,8 @@
          "");
 echo "</dl>";
 
-
-H3("Searching in Peer-to-Peer networks");
+H3("Routing");
 echo "<dl>";
-bibEntry("papers/planetp.pdf",
-         "PlanetP: Using Gossiping to Build Content Addressable Peer-to-Peer 
Information Sharing Communities",
-         ARRAY("Francisco Matias Cuenca/Acuna", "Christopher Peery", "Richard 
P. Martin", "Thu D. Nguyen"),
-         "PlanetP is a peer-to-peer system in which searching content is done 
mostly locally.  Every peer knows which content is available at which other 
peers. The index information is represented compactly using bloom filters and 
distributed throughout the network using push and pull mechanisms.");
 bibEntry("papers/chord.ps",
          "Chord: A scalable peer-to-peer lookup service for Internet 
applications",
          ARRAY("Ion Stoica", "Robert Morris", "Davit Karger", "Frans 
Kaashoek", "Hari Balakrishnan"),
@@ -291,6 +291,22 @@
          "Building Low-Diameter P2P Networks",
          ARRAY("Gopal Pandurangan", "Prabhakar Raghavan", "Eli Upfal"),
          "Scheme to build dynamic, distributed P2P networks of constant degree 
and logarithmic diameter.");
+bibEntry("papers/coral-iptps03.ps",
+        "Sloppy hashing and self-organizing clusters",
+        ARRAY("Michael J. Freedman", "David Mazieres"),
+         "");
+bibEntry("papers/CameraReady_174.pdf",
+        "Dynamic Load Balancing in Distributed Hash Tables",
+        ARRAY("Marcin Bienkowski", "Miroslaw Korzeniowski", "Friedhelm Meyer 
auf der Heide"),
+         "");
+echo "</dl>";
+
+H3("Searching in Peer-to-Peer networks");
+echo "<dl>";
+bibEntry("papers/planetp.pdf",
+         "PlanetP: Using Gossiping to Build Content Addressable Peer-to-Peer 
Information Sharing Communities",
+         ARRAY("Francisco Matias Cuenca/Acuna", "Christopher Peery", "Richard 
P. Martin", "Thu D. Nguyen"),
+         "PlanetP is a peer-to-peer system in which searching content is done 
mostly locally.  Every peer knows which content is available at which other 
peers. The index information is represented compactly using bloom filters and 
distributed throughout the network using push and pull mechanisms.");
 bibEntry("papers/searching_in_encrypted_data.pdf",
          "Practical Techniques for Searches on Encrypted Data",
          ARRAY("Dawn Xiaodong Song", "David Wagner", "Adrian Perrig"),
@@ -303,10 +319,14 @@
          "Adapting Publish/Subscribe Middleware to Achieve Gnutella-like 
Functionality",
          ARRAY("Dennis Heimbinger"),
          "");
-bibEntry("papers/coral-iptps03.ps",
-        "Sloppy hashing and self-organizing clusters",
-        ARRAY("Michael J. Freedman", "David Mazieres"),
+bibEntry("papers/publickeykeywordsearch.pdf",
+        "Public Key Encryption with keyword Search",
+        ARRAY("Dan Boneh", "Giovanni Di Crescenzo"),
          "");
+bibEntry("papers/secureindex.pdf",
+        "Secure Indexes",
+        ARRAY("Eu-Jin Goh"),
+         "");
 bibEntry("papers/p207-damiani.pdf",
         "A Reputation-Based Approach for Choosing Reliable Resources in 
Peer-to-Peer Networks",
         ARRAY("Ernesto Damiani", "Sabrina De Capitani di Vimercati", "Stefano 
Paraboschi", "Pierangela Samarati", "Fabio Violante"),
@@ -319,6 +339,14 @@
         "On Algorithms for Efficient Data Migration",
          ARRAY("Joseph Hall", "Jason Hartline", "Anna R. Karlin", "Jared 
Saia", "John Wilkes"),
         "");
+bibEntry("papers/farsite.pdf",
+        "Reclaiming Space from Duplicate Files in a Serverless Distributed 
File System",
+         ARRAY("John R. Douceur", "Atul Adya", "William J. Bolosky", "Dan 
Simon", "Marvin Theimer"),
+        "");
+bibEntry("papers/farsite-replication.pdf",
+        "Competitive Hill-Climbing Strategies for Replica Placement in a 
Distributed File System",
+         ARRAY("John R. Douceur", "Roger P. Wattenhofer"),
+        "");
 bibEntry("papers/p2pmulti.pdf",
          "Replication Strategies in Unstructured Peer-to-Peer Networks",
         ARRAY("E. Cohen", "S. Shenker"),
@@ -327,6 +355,10 @@
 
 H3("Censorship Resistant Publishing");
 echo "<dl>";
+bibEntry("papers/IHW-CR.pdf",
+         "Censorship Resistance Revisited",
+         ARRAY("Ginger Perng", "Michael K. Reiter", "Chenxi Wang"),
+         "This paper proposes a formal model for censorship resistance. Given 
their model of an attacker, the authors show that censorship resistance 
requires private information retrieval (PIR), which has a complexity of O(n) 
for updates and queries. They demonstrate that almost none of the previously 
proposed systems is censorship resistant in this model. This is particularly 
interesting for GNUnet, despite the paper not mentioning GNUnet at all, for 
three reasons. First, the given formal notion of censorship resistance closely 
corresponds to what the content encoding in GNUnet (ECRS) is supposed to 
achieve. Secondly, the paper shows that for an adversary that is capable of 
guessing keywords (or content), PIR is required. Note that PIR is not 
practically feasible due to the O(n) cost associated with it. On the other 
hand, if the adversary did not have the ability to mount a successful guessing 
attack, the model matches the ECRS model used by GNUnet exactly. Given this 
type of attacker, ECRS then delivers censorship resistance (in accordance with 
the model presented in this paper) with O(1) complexity. Unfortunately, the 
paper ignores this weaker attacker model as well as ECRS in its discussion. 
Nevertheless, the discussion of what censorship resistance means as well as the 
critique of other existing systems makes this paper an important contribution 
in the field of censorship resistant publishing.");
 bibEntry("papers/tangler.ps",
          "Tangler: A Censorhsip-Resistant Publishing System Based On Document 
Entanglements",
          ARRAY("Marc Waldman", "David Mazieres"),
@@ -343,6 +375,10 @@
          "Anonymizing Censorship Resistant Systems",
          ARRAY("Andrei Serjantov"),
          "");
+bibEntry("papers/redblue.pdf",
+         "The Economics of Censorship Resistance",
+         ARRAY("George Danezis", "Ross Anderson"),
+         "");
 bibEntry("papers/publius.pdf",
          "Publius: A robust, tamper-evident, censorship-resistant web 
publishing system",
          ARRAY("Mare Waldman", "Aviel Rubin", "Lorrie Cranor"),
@@ -391,6 +427,10 @@
           "Poblano: A Distributed Trust Model for Peer-to-Peer Networks",
         ARRAY("Rita Chen", "William Yeager"),
        "");
+bibEntry("papers/ppay.pdf",
+          "PPay: Micropayments for Peer-to-Peer Systems",
+        ARRAY("Beverly Yang", "Hector Garcia-Molina"),
+       "");
 bibEntry("papers/accountability-ch16.html",
          "Peer-To-Peer: Harnessing the Power of Disruptive Technologies, 
Chapter 16: Accountability",
          ARRAY("Roger Dingledine", "Michael J. Freedman", "David Molnar"),
@@ -451,6 +491,10 @@
          "Project JXTA: An Open, Innovatie Collaboration",
          ARRAY("Sun Microsystems"),
          "Sun is building a p2p framework.");
+bibEntry("papers/herbivore-esigops.pdf",
+         "Eluding Carnivores: File Sharing with Strong Anonymity",
+         ARRAY("Emin G&uuml;n Sirer", "Sharad Goel", "Mark Robson", "Dogan 
Engin"),
+         "");
 bibEntry("papers/freehaven-ch12.html",
          "Peer-To-Peer: Harnessing the Power of Disruptive Technologies -- 
Chapter 12: Free Haven",
          ARRAY("Roger Dingledine", "Michael J. Freedman", "David Molnar"),
@@ -459,6 +503,10 @@
          "The Gnutella Protocol Specification v0.4",
          ARRAY("Clip2"),
          "A brief description of the gnutella protocol.");
+bibEntry("papers/mojonation.pdf",
+         "Experiences Deploying A Large-Scale Emergent Network",
+         ARRAY("Bryce Wilcox-O Hearn"),
+         "Describes the authors experiences with MojoNation..");
 bibEntry("papers/Dan_Klinedinst_GSEC.pdf",
          "A New Generation of File Sharing Tools",
          ARRAY("Dan Klinedinst"),
@@ -480,6 +528,10 @@
         "Peer-to-Peer Communication Across Network Address Translators",
         ARRAY("Bryan Ford", "Pyda Srisuresh", "Dan Kegel"),
         "How to establish connections in a peer-to-peer network in the 
presence of NAT, with an empirical study of various NAT implementations.  Good 
stuff.  And Ian, with a bit of native code it can even be done in Java.");
+bibEntry("papers/4616.0.109-bauer.ps",
+         "New Covert Channels in HTTP",
+         ARRAY("Matthias Bauer"),
+         "");
 echo "</dl>";
 
 H3("Publish-Subscribe");
@@ -492,6 +544,10 @@
          "Herald: Achieving a Global Event Notification Service",
          ARRAY("L. Cabrera", "M. Jones", "M. Theimer"),
          "The paper describes the design goals (and non-goals) of a scalable, 
peer-to-peer event notification system.  Its primary contribution is a 
comprehensive listing of the problems that any such system will face, such as 
unreliable or malicious peers or the requirement for heuristics that 
automatically make reasonable choices for degrees of replication.");
+bibEntry("papers/debs04perng.pdf",
+         "Providing content-based services in a peer-to-peer environment",
+         ARRAY("Ginger Perng", "Chenxi Wang", "Michael K. Reiter"),
+         "");
 echo "</dl>";
 
 H3("Other");
@@ -504,6 +560,14 @@
         "A Reputation-Based Approach for Choosing Reliable Resources in 
Peer-to-Peer Networks",
         ARRAY("Ernesto Damiani", "De Capitani di Vimercati", "Stefano 
Paraboschi", "Pierangela Samarati", "Fabio Violante"),
         "");
+bibEntry("papers/privacy-gratification.pdf",
+         "Privacy in Electronic Commerce and the Economics of Immediate 
Gratification",
+         ARRAY("Alessandro Acquisti"),
+         "");
+bibEntry("papers/goldreich98secure.ps",
+         "Secure Multi-Party Computation",
+         ARRAY("Oded Goldreich"),
+         "");
 echo "</dl>";
 
 include("html_footer.php3");

Modified: GNUnet-docs/WWW/test/philosophy.php3
===================================================================
--- GNUnet-docs/WWW/test/philosophy.php3        2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/philosophy.php3        2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,206 +1,233 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Copyright and Philosophy";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-/*
-Add HTML
-describing structure:
-Copyright, Design Goals & Philo, Concepts
-*/
-
-ANCHOR("copyright");
-H3("Copyright and Contributions");
-BP();
-W("GNUnet is part of the %s.",
-  extlink_("http://www.gnu.org/","GNU project"));
-W("All code contributions must thus be put under the %s.",
-  extlink_("http://www.gnu.org/copyleft/gpl.html";, "GNU Public License 
(GPL)"));
-W("All documentation should be put under FSF approved licenses (see %s).",
-  extlink_("http://www.gnu.org/copyleft/fdl.html","fdl";));
-W("GNU standards and the %s should be adhered to.",
-  extlink_("http://www.gnu.org/philosophy/philosophy.html","GNU philosophy"));
-
-EP();
-
-ANCHOR("goals");
-H3("Design Goals and Philosophy");
-
-BP();
-W("The foremost goal of the GNUnet project is to become a widely used, 
reliable, open, nondiscriminating, egalitarian, unfettered and 
censorship-resistant system of free information exchange.");
-W("We value free speech above state secrets, law-enforcement or intellectual 
property.");
-W("GNUnet is supposed to be an anarchistic network, where the only limitation 
for peers is that they must contribute enough back to the network such that 
their resource consumption does not have a significant impact on other users.");
-EP();
-
-ANCHOR("Privacy");
-H4("Privacy");
-BP();
-W("GNUnet&rsquo;s primary design goals are to protect the privacy of its users 
and to guard itself against attacks or abuse.");
-W("GNUnet does not have any mechanisms to control, track or censor users.");
-W("Instead, the GNUnet protocols aim to make it as hard as possible to find 
out what is happening on the network or to disrupt operations.");
-EP();
-
-ANCHOR("Versatility");
-H4("Versatility");
-BP();
-W("We call GNUnet a network because we want to support many different forms of 
peer-to-peer applications.");
-W("GNUnet uses a plugin architecture to make the system extensible and to 
encourage code reuse.");
-W("While the first versions of the system only supported anonymous 
file-sharing, other applications are being worked on and more will hopefully 
follow in the future.");
-W("A powerful synergy regarding anonymity services is created by a large 
community utilizing many diverse applications over the same software 
infrastructure.");
-W("The reason is that link encryption hides the specifics of the traffic for 
non-participating observers.");
-W("This way, anonymity can get stronger with additional (GNUnet) traffic, even 
if the additional traffic is not related to anonymous communication.");
-W("Increasing anonymity is the primary reason why GNUnet is developed to 
become a peer-to-peer framework.");
-EP();
-
-
-ANCHOR("Practicality");
-H4("Pracicality");
-
-BP();
-W("GNUnet allows participants to trade various amounts of security in exchange 
for increased efficiency.");
-W("However, it is not possible for any user's security and efficiency 
requirements to compromise the security and efficiency of any other user.");
-
-P();
-W("For GNUnet, efficiency is not paramount.");
-W("If there is a more secure and still practical approach, we would choose to 
take the more secure alternative.");
-W("<tt>telnet</tt> is more efficient than <tt>ssh</tt>, yet it is obsolete.");
-W("Hardware gets faster, and code can be optimized.");
-W("Fixing security issues as an afterthought is much harder.");
-P();
-W("While security is paramount, practicability is still a requirement.");
-W("The most secure system is always the one that nobody can use.");
-W("Similarly, any anonymous system that is extremely inefficient will only 
find few users.");
-W("However, good anonymity requires a large and diverse userbase.");
-W("Since individual security requirements may vary, the only good solution 
here is to allow individuals to trade-off security and efficiency.");
-W("The primary challenge in allowing this is to ensure that the economic 
incentives work properly.");
-W("In particular, this means that it must be impossible for a user to gain 
security at the expense of other users.");
-W("Many designs (e.g. anonymity via broadcast) fail to give users an incentive 
to choose a less secure but more efficient mode of operation.");
-W("GNUnet should avoid whereever possible to rely on protocols that will only 
work if the participants are benevolent.");
-W("While some designs have had widespread success while relying on parties to 
observe a protocol that may be sub-optimal for the individuals (e.g.  TCP 
Nagle), a protocol that ensures that individual goals never conflict with the 
goals of the group is always preferable.");
-EP();
-
-ANCHOR("concepts");
-H3("Concepts");
-
-BP();
-W("In this section, the fundamental concepts of GNUnet are explained.");
-W("Most of them are also described in our research papers.");
-W("First, some of the concepts used in the GNUnet framework are detailed.");
-W("The second part describes concepts specific to anonymous file-sharing.");
-EP();
-
-gnunetlogo();
-H4("Authentication");
-
-BP();
-W("Almost all peer-to-peer communications in GNUnet are between mutually 
authenticated peers.");
-W("The authentication works by having each peer sign a secret session key with 
its RSA key.");
-W("Furthermore, the session key is encrypted with the public key of the other 
peer.");
-W("That session key is then used to encrypt the communication between the two 
peers using Blowfish.");
-W("As only the two participating hosts know the session key, this 
authenticates each packet without requiring signatures each time.");
-
-P();
-W("In GNUnet, the identity of a host is the hash of its public key.");
-W("For that reason, man-in-the-middle attacks will not break the 
authentication or accounting goals.");
-W("Essentially, for GNUnet, the IP of the host does not matter.");
-W("As the public key is the only thing that truly matters, faking an IP, a 
port or any other property of the underlying transport protocol is 
irrelevant.");
-
-P();
-
-W("GNUnet uses a special type of message to communicate a binding between 
public (RSA) keys to their current network address.");
-W("For the UDP and TCP transport layers, a network address is an IP and a 
port.");
-W("GNUnet can also use other transport mechanisms (HTTP, SMTP, etc.) which use 
various other forms of addresses.");
-W("Note that any node can have multiple addresses at the same time for the 
various transport mechanisms.");
-W("Binding messages expire after at most a week (the timeout can be shorter if 
the user configures the node appropriately).");
-
-EP();
-H4("Accounting to Encourage Resource Sharing");
-
-BP();
-W("Most distributed P2P networks suffer from a lack of defenses or precautions 
against attacks in the form of freeloading.");
-W("While the intentions of an attacker and a freeloader are different, their 
effect on the network is the same; they both render it useless.");
-W("Most simple attacks on networks such as Gnutella involve flooding the 
network with traffic, particularly with queries that are, in the worst case, 
multiplied by the network.");
-
-P();
-
-W("In order to ensure that freeloaders or attackers have a minimal impact on 
the network, GNUnet tries to distinguish good (contributing) nodes from 
malicious (freeloading) nodes.");
-W("In GNUnet, every node keeps track of the behavior of every other node it 
has been in contact with.");
-W("Many requests (depending on the application) are transmitted with a 
priority (or importance) level.");
-W("That priority is used to establish how important the sender believes this 
request is.");
-W("If a peer responds to an important request, the recipient will increase its 
trust in the responder: the responder contributed resources.");
-W("If a peer is too busy to answer all requests, it needs to prioritize.");
-W("For that, peers to not take the priorities of the requests received at face 
value.");
-W("First, they check how much they trust the sender, and depending on that 
amount of trust they assign the request a (possibly lower) effective 
priority.");
-W("Then, they drop the requests with the lowest effective priority to satisfy 
their resource constraints.");
-W("This way, GNUnet&rsquo;s economic model ensures that nodes that are not 
currently considered to have a surplus in contributions will not be served if 
the network load is high.");
-W("More details can be found in %s.",
-  extlink_("download/ebe.ps", "this paper"));
-
-EP();
-H4("Confidentiality");
-
-BP();
-W("Adversaries outside of GNUnet are not supposed to know what kind of actions 
a peer is involved in.");
-W("Only the specific neighbor of a peer that is the corresponding sender or 
recipient of a message may know its contents, and even then application 
protocols may place further restrictions on that knowledge.");
-W("In order to ensure confidentiality, GNUnet uses link encryption, that is 
each message exchanged between two peers is encrypted using a key only known to 
these two peers.");
-W("Encrypting traffic like this makes any kind of traffic analysis much 
harder.");
-W("Naturally, for some applications, it may still be desirable if even 
neighbors cannot determine the concrete contents of a message.");
-W("In GNUnet, this problem is addressed by the specific application-level 
protocols (see for example, %s and %s in anonymous file sharing).",
-  ARRAY(extlink_("#deniability", "deniability"),
-        extlink_("#anonymity", "anonymity")));
-
-
-EP();
-afslogo();
-ANCHOR("anonymity");
-H4("Anonymity");
-
-BP();
-W("Providing anonymity for users is the central goal for the anonymous 
file-sharing application.");
-W("Many other design decisions follow in the footsteps of this requirement.");
-//W("(Nevertheless, it is possible to forego anonymity when this is not 
required.)");
-
-// some more about anonymity in general here!
-P();
-
-W("Contrary to other designs, we do not believe that users achieve strong 
anonymity just because their requests are obfuscated by a couple of 
indirections.");
-W("This is not sufficient if the adversary uses traffic analysis.");
-W("The thread model used for anonymous file sharing in GNUnet assumes that the 
adversary is quite powerful.");
-W("In particular, we assume that the adversary can see all the traffic on the 
Internet.");
-W("And while we assume that the adversary can not break our encryption, we 
assume that the adversary has many participating nodes in the network and that 
it can thus see many of the node-to-node interactions since it controls some of 
the nodes.");
-
-P();
-
-W("The system tries to achieve anonymity based on the idea that users can be 
anonymous if they can hide their actions in the traffic created by other 
users.");
-W("Hiding actions in the traffic of other users requires participating in the 
traffic, bringing back the traditional technique of using indirection and 
source rewriting.");
-W("Source rewriting is required to gain anonymity since otherwise an adversary 
could tell if a message originated from a host by looking at the source 
address.");
-W("If all packets look like they originate from a node, the adversary can not 
tell which ones originate from that node and which ones were routed.");
-W("Note that in this mindset, any node can decide to break the 
source-rewriting paradigm without violating the protocol, as this only reduces 
the amount of traffic that a node can hide its own traffic in.");
-
-P();
-
-W("If we want to hide our actions in the traffic of other nodes, we must make 
our traffic indistinguishable from the traffic that we route for others.");
-W("As our queries must have us as the receiver of the reply (otherwise they 
would be useless), we must put ourselves as the receiver of replies that 
actually go to other hosts; in other words, we must indirect replies.");
-W("Unlike other systems, in anonymous file-sharing as implemented on top of 
GNUnet we do not have to indirect the replies if we don&rsquo;t think we need 
more traffic to hide our own actions.");
-W("This increases the efficiency of the network as we can indirect less under 
higher load.");
-
-
-EP();
-ANCHOR("deniability");
-H4("Deniability");
-
-BP();
-W("Even if the user that downloads data and the server that provides data are 
anonymous, the intermediaries may still be targets.");
-W("In particular, if the intermediaries can find out which queries or which 
content they are processing, a strong adversary could try to force them to 
censor certain materials.");
-
-P();
-
-W("With the file-encoding used by GNUnet's anonymous file-sharing, this 
problem does not arise.");
-W("The reason is that queries and replies are transmitted in an encrypted 
format such that intermediaries cannot tell what the query is for or what the 
content is about.");
-W("Mind that this is not the same encryption as the link-encryption between 
the nodes.");
-W("GNUnet has encryption on the network layer (link encryption, 
confidentiality, authentication) and again on the application layer (provided 
by <tt>gnunet-insert</tt>, <tt>gnunet-download</tt>, <tt>gnunet-search</tt> and 
<tt>gnunet-gtk</tt>).");
-EP();
-
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Copyright and Philosophy";
+$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
+include("html_header.php3");
+/*
+Add HTML
+describing structure:
+Copyright, Design Goals & Philo, Concepts
+*/
+
+ANCHOR("copyright");
+H3("Copyright and Contributions");
+BP();
+W("GNUnet is part of the %s.",
+  extlink_("http://www.gnu.org/","GNU project"));
+W("All code contributions must thus be put under the %s.",
+  extlink_("http://www.gnu.org/copyleft/gpl.html";, "GNU Public License 
(GPL)"));
+W("All documentation should be put under FSF approved licenses (see %s).",
+  extlink_("http://www.gnu.org/copyleft/fdl.html","fdl";));
+W("GNU standards and the %s should be adhered to.",
+  extlink_("http://www.gnu.org/philosophy/philosophy.html","GNU philosophy"));
+
+EP();
+
+ANCHOR("goals");
+H3("Design Goals and Philosophy");
+
+BP();
+W("The foremost goal of the GNUnet project is to become a widely used, 
reliable, open, nondiscriminating, egalitarian, unfettered and 
censorship-resistant system of free information exchange.");
+W("We value free speech above state secrets, law-enforcement or intellectual 
property.");
+W("GNUnet is supposed to be an anarchistic network, where the only limitation 
for peers is that they must contribute enough back to the network such that 
their resource consumption does not have a significant impact on other users.");
+W("GNUnet should be more than just another file-sharing network.");
+W("The plan is to offer many other services and in particular to serve as a 
development platform for the next generation of decentralized Internet 
protocols.");
+EP();
+
+ANCHOR("Privacy");
+H4("Privacy");
+BP();
+W("GNUnet&rsquo;s primary design goals are to protect the privacy of its users 
and to guard itself against attacks or abuse.");
+W("GNUnet does not have any mechanisms to control, track or censor users.");
+W("Instead, the GNUnet protocols aim to make it as hard as possible to find 
out what is happening on the network or to disrupt operations.");
+EP();
+
+ANCHOR("Versatility");
+H4("Versatility");
+BP();
+W("We call GNUnet a peer-to-peer framework because we want to support many 
different forms of peer-to-peer applications.");
+W("GNUnet uses a plugin architecture to make the system extensible and to 
encourage code reuse.");
+W("While the first versions of the system only supported anonymous 
file-sharing, other applications are being worked on and more will hopefully 
follow in the future.");
+W("A powerful synergy regarding anonymity services is created by a large 
community utilizing many diverse applications over the same software 
infrastructure.");
+W("The reason is that link encryption hides the specifics of the traffic for 
non-participating observers.");
+W("This way, anonymity can get stronger with additional (GNUnet) traffic, even 
if the additional traffic is not related to anonymous communication.");
+W("Increasing anonymity is the primary reason why GNUnet is developed to 
become a peer-to-peer framework.");
+EP();
+
+
+ANCHOR("Practicality");
+H4("Pracicality");
+
+BP();
+W("GNUnet allows participants to trade various amounts of security in exchange 
for increased efficiency.");
+W("However, it is not possible for any user's security and efficiency 
requirements to compromise the security and efficiency of any other user.");
+
+P();
+W("For GNUnet, efficiency is not paramount.");
+W("If there is a more secure and still practical approach, we would choose to 
take the more secure alternative.");
+W("<tt>telnet</tt> is more efficient than <tt>ssh</tt>, yet it is obsolete.");
+W("Hardware gets faster, and code can be optimized.");
+W("Fixing security issues as an afterthought is much harder.");
+P();
+W("While security is paramount, practicability is still a requirement.");
+W("The most secure system is always the one that nobody can use.");
+W("Similarly, any anonymous system that is extremely inefficient will only 
find few users.");
+W("However, good anonymity requires a large and diverse userbase.");
+W("Since individual security requirements may vary, the only good solution 
here is to allow individuals to trade-off security and efficiency.");
+W("The primary challenge in allowing this is to ensure that the economic 
incentives work properly.");
+W("In particular, this means that it must be impossible for a user to gain 
security at the expense of other users.");
+W("Many designs (e.g. anonymity via broadcast) fail to give users an incentive 
to choose a less secure but more efficient mode of operation.");
+W("GNUnet should avoid whereever possible to rely on protocols that will only 
work if the participants are benevolent.");
+W("While some designs have had widespread success while relying on parties to 
observe a protocol that may be sub-optimal for the individuals (e.g.  TCP 
Nagle), a protocol that ensures that individual goals never conflict with the 
goals of the group is always preferable.");
+EP();
+
+ANCHOR("concepts");
+H3("Concepts");
+
+BP();
+W("In this section, the fundamental concepts of GNUnet are explained.");
+W("Most of them are also described in our research papers.");
+W("First, some of the concepts used in the GNUnet framework are detailed.");
+W("The second part describes concepts specific to anonymous file-sharing.");
+EP();
+
+gnunetlogo();
+H4("Authentication");
+
+BP();
+W("Almost all peer-to-peer communications in GNUnet are between mutually 
authenticated peers.");
+W("The authentication works by having each peer sign a secret session key with 
its RSA key.");
+W("Furthermore, the session key is encrypted with the public key of the other 
peer.");
+W("That session key is then used to encrypt the communication between the two 
peers using 256-bit AES.");
+W("A each peer independently generates such a session key for the data that 
this peer will transmit to the other peer.");
+W("As only the two participating hosts know the two session keys, this 
authenticates each packet without requiring signatures each time.");
+W("GNUnet uses SHA-512 hash codes to verify the integrity of messages.");
+
+P();
+W("In GNUnet, the identity of a host is the (SHA-512) hash of its public 
key.");
+W("For that reason, man-in-the-middle attacks will not break the 
authentication or accounting goals.");
+W("Essentially, for GNUnet, the IP of the host does not matter.");
+W("As the public key is the only thing that truly matters, faking an IP, a 
port or any other property of the underlying transport protocol is 
irrelevant.");
+
+P();
+
+W("GNUnet uses a special type of message to communicate a binding between 
public (RSA) keys to their current network address.");
+W("These messages are commonly called HELOs or peer advertisements.");
+W("They contain the public key of the peer and a signature with its current 
network address for a specific transport service.");
+W("A transport service is a special kind of shared library that enables 
unreliable, out-of-order message delivery between peers.");
+W("For the UDP and TCP transport services, a network address is an IP and a 
port.");
+W("GNUnet can also use other transports (HTTP, SMTP, etc.) which use various 
other forms of addresses.");
+W("Note that any node can have many different active transport services at the 
same time, and each of these can have a different address.");
+W("Binding messages expire after at most a week (the timeout can be shorter if 
the user configures the node appropriately).");
+W("This expiration ensures that the network will eventually get rid of 
outdated advertisements.");
+W("More details can be found in %s.",
+  extlink_("download/transport.ps", "this paper"));
+
+
+EP();
+H4("Accounting to Encourage Resource Sharing");
+
+BP();
+W("Most distributed P2P networks suffer from a lack of defenses or precautions 
against attacks in the form of freeloading.");
+W("While the intentions of an attacker and a freeloader are different, their 
effect on the network is the same; they both render it useless.");
+W("Most simple attacks on networks such as Gnutella involve flooding the 
network with traffic, particularly with queries that are, in the worst case, 
multiplied by the network.");
+
+P();
+
+W("In order to ensure that freeloaders or attackers have a minimal impact on 
the network, GNUnet tries to distinguish good (contributing) nodes from 
malicious (freeloading) nodes.");
+W("In GNUnet, every node keeps track of the behavior of every other node it 
has been in contact with.");
+W("Many requests (depending on the application) are transmitted with a 
priority (or importance) level.");
+W("That priority is used to establish how important the sender believes this 
request is.");
+W("If a peer responds to an important request, the recipient will increase its 
trust in the responder: the responder contributed resources.");
+W("If a peer is too busy to answer all requests, it needs to prioritize.");
+W("For that, peers to not take the priorities of the requests received at face 
value.");
+W("First, they check how much they trust the sender, and depending on that 
amount of trust they assign the request a (possibly lower) effective 
priority.");
+W("Then, they drop the requests with the lowest effective priority to satisfy 
their resource constraints.");
+W("This way, GNUnet&rsquo;s economic model ensures that nodes that are not 
currently considered to have a surplus in contributions will not be served if 
the network load is high.");
+W("More details can be found in %s.",
+  extlink_("download/ebe.ps", "this paper"));
+
+EP();
+H4("Confidentiality");
+
+BP();
+W("Adversaries outside of GNUnet are not supposed to know what kind of actions 
a peer is involved in.");
+W("Only the specific neighbor of a peer that is the corresponding sender or 
recipient of a message may know its contents, and even then application 
protocols may place further restrictions on that knowledge.");
+W("In order to ensure confidentiality, GNUnet uses link encryption, that is 
each message exchanged between two peers is encrypted using a pair of keys only 
known to these two peers.");
+W("Encrypting traffic like this makes any kind of traffic analysis much 
harder.");
+W("Naturally, for some applications, it may still be desirable if even 
neighbors cannot determine the concrete contents of a message.");
+W("In GNUnet, this problem is addressed by the specific application-level 
protocols (see for example, %s and %s in anonymous file sharing).",
+  ARRAY(extlink_("#deniability", "deniability"),
+        extlink_("#anonymity", "anonymity")));
+
+
+EP();
+afslogo();
+ANCHOR("anonymity");
+H4("Anonymity");
+
+BP();
+W("Providing anonymity for users is the central goal for the anonymous 
file-sharing application.");
+W("Many other design decisions follow in the footsteps of this requirement.");
+W("Anonymity is never absolute.");
+W("While there are various %s that can help quantify the level of anonymity 
that a given mechanism provides, there is no such thing as complete anonymity.",
+  extlink_("papers/tmAnon.ps", "scientific metrics"));
+W("GNUnet allows users to select for each operation (upload, search, download) 
the desired level of anonymity.");
+W("The metric used is the amount of cover traffic available to hide the 
request.");
+W("While this metric is not as good as the theoretical metric given in %s, it 
is probably the best metric available to a peer with a purely local view of the 
world that does not rely on unreliable external information.",
+ extlink_("papers/tmAnon.ps", "scientific metrics"));
+W("The default anonymity level is 1, which uses anonymous routing but imposes 
no minimal requirements on cover traffic.");
+W("It is possible to forego anonymity when this is not required.");
+W("The anonymity level of 0 allows GNUnet to use more efficient, non-anonymous 
routing.");
+EP();
+
+H5("How GNUnet achieves Anonymity");
+
+BP();
+W("Contrary to other designs, we do not believe that users achieve strong 
anonymity just because their requests are obfuscated by a couple of 
indirections.");
+W("This is not sufficient if the adversary uses traffic analysis.");
+W("The thread model used for anonymous file sharing in GNUnet assumes that the 
adversary is quite powerful.");
+W("In particular, we assume that the adversary can see all the traffic on the 
Internet.");
+W("And while we assume that the adversary can not break our encryption, we 
assume that the adversary has many participating nodes in the network and that 
it can thus see many of the node-to-node interactions since it controls some of 
the nodes.");
+
+P();
+
+W("The system tries to achieve anonymity based on the idea that users can be 
anonymous if they can hide their actions in the traffic created by other 
users.");
+W("Hiding actions in the traffic of other users requires participating in the 
traffic, bringing back the traditional technique of using indirection and 
source rewriting.");
+W("Source rewriting is required to gain anonymity since otherwise an adversary 
could tell if a message originated from a host by looking at the source 
address.");
+W("If all packets look like they originate from a node, the adversary can not 
tell which ones originate from that node and which ones were routed.");
+W("Note that in this mindset, any node can decide to break the 
source-rewriting paradigm without violating the protocol, as this only reduces 
the amount of traffic that a node can hide its own traffic in.");
+
+P();
+
+W("If we want to hide our actions in the traffic of other nodes, we must make 
our traffic indistinguishable from the traffic that we route for others.");
+W("As our queries must have us as the receiver of the reply (otherwise they 
would be useless), we must put ourselves as the receiver of replies that 
actually go to other hosts; in other words, we must indirect replies.");
+W("Unlike other systems, in anonymous file-sharing as implemented on top of 
GNUnet we do not have to indirect the replies if we don&rsquo;t think we need 
more traffic to hide our own actions.");
+W("This increases the efficiency of the network as we can indirect less under 
higher load.");
+W("More details can be found in %s.",
+  extlink_("download/aff.ps", "this paper"));
+
+
+EP();
+ANCHOR("deniability");
+H4("Deniability");
+
+BP();
+W("Even if the user that downloads data and the server that provides data are 
anonymous, the intermediaries may still be targets.");
+W("In particular, if the intermediaries can find out which queries or which 
content they are processing, a strong adversary could try to force them to 
censor certain materials.");
+
+P();
+
+W("With the file-encoding used by GNUnet's anonymous file-sharing, this 
problem does not arise.");
+W("The reason is that queries and replies are transmitted in an encrypted 
format such that intermediaries cannot tell what the query is for or what the 
content is about.");
+W("Mind that this is not the same encryption as the link-encryption between 
the nodes.");
+W("GNUnet has encryption on the network layer (link encryption, 
confidentiality, authentication) and again on the application layer (provided 
by <tt>gnunet-insert</tt>, <tt>gnunet-download</tt>, <tt>gnunet-search</tt> and 
<tt>gnunet-gtk</tt>).");
+
+W("More details can be found in %s.",
+  extlink_("download/ecrs.ps", "this paper"));
+
+EP();
+
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol.php3  2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/protocol.php3  2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,39 +1,43 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Protocols";
-$description="Overview over the GNUnet protocol families.";
-include("html_header.php3");
-
-H2("The Protocols");
-BP();
-W("GNUnet uses protocols in three different contexts.");
-EP();
-echo "<ol><li>";
-W("The first and most important protocol family is the peer-to-peer 
protocol.");
-W("This protocol defines how nodes in the network exchange information with 
each other.");
-W("The peer-to-peer protocol defines messages for peer discovery, encryption, 
availability and other, application specific messages.");
-W("All peers in the network must support a certain core subset of the 
peer-to-peer messages.");
-W("The peer-to-peer messages are exchanged between <tt>gnunetd</tt> 
processes.");
-W("The mechanisms of exchange are encapsulated in the <em>transport</em> 
services.");
-echo "</li><li>";
-W("The second protocol family is the client-server protocol.");
-W("The client-server protocol is used between <tt>gnunetd</tt> and the GNUnet 
tools.");
-W("Since <tt>gnunetd</tt> is a deamon process that runs in the background, the 
user must be able to interact with <tt>gnunetd</tt>.");
-W("GNUnet uses a TCP connection, typically loopback, to allow GNUnet clients 
to send requests to <tt>gnunetd</tt>.");
-W("For these clients, the GNUnet tools, <tt>gnunetd</tt> acts as a server, and 
not as a peer.");
-W("Note that GNUnet clients are ultimately trusted.");
-W("GNUnet does not encrypt the TCP traffic between client and server since 
this connection should only ever be allowed either via loopback or on a trusted 
LAN.");
-W("Which hosts are allowed to connect as clients to <tt>gnunetd</tt> is 
specified in the configuration file.");
-echo "</li><li>";
-W("The third family of GNUnet protocols is used in the transport layer.");
-W("The transport layer encapsulates the sending and receiving of peer-to-peer 
messages.");
-W("Every GNUnet peer must support at least one transport protocol.");
-W("Transport protocols differ in performance, system requirements and 
ease-of-use.");
-W("Each transport protocol also defines its own format for a host address.");
-W("Host addresses can be anything from a simple IP:PORT combination to an http 
URL or an E-mail address.");
-W("While a single peer can have as many addresses as transports, every peer is 
uniquely identified by its identity, which is the hash of its public key.");
-echo "</li></ol>";
-P();
-include("protocol_index.inc");
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Protocols";
+$description="Overview over the GNUnet protocol families.";
+include("html_header.php3");
+
+H2("The Protocols");
+BP();
+W("GNUnet uses protocols in three different contexts.");
+EP();
+echo "<ol><li>";
+W("The first and most important protocol family is the peer-to-peer 
protocol.");
+W("This protocol defines how nodes in the network exchange information with 
each other.");
+W("The peer-to-peer protocol defines messages for peer discovery, encryption, 
availability and other, application specific messages.");
+W("All peers in the network must support a certain core subset of the 
peer-to-peer messages.");
+W("The peer-to-peer messages are exchanged between <tt>gnunetd</tt> 
processes.");
+W("The mechanisms of exchange are encapsulated in the <em>transport</em> 
services.");
+echo "</li><li>";
+W("The second protocol family is the client-server protocol.");
+W("The client-server protocol is used between <tt>gnunetd</tt> and the GNUnet 
tools.");
+W("Since <tt>gnunetd</tt> is a deamon process that runs in the background, the 
user must be able to interact with <tt>gnunetd</tt>.");
+W("GNUnet uses a TCP connection, typically via loopback, to allow GNUnet 
clients to send requests to <tt>gnunetd</tt>.");
+W("For these clients, the GNUnet tools, <tt>gnunetd</tt> acts as a server, and 
not as a peer.");
+W("Note that GNUnet clients are ultimately trusted.");
+W("GNUnet does not encrypt the TCP traffic between client and server since 
this connection should only ever be allowed either via loopback or on a trusted 
LAN.");
+W("Which hosts are allowed to connect as clients to <tt>gnunetd</tt> is 
specified in the configuration file.");
+echo "</li><li>";
+W("The third family of GNUnet protocols is used in the transport layer.");
+W("The transport layer encapsulates the sending and receiving of peer-to-peer 
messages.");
+W("Every GNUnet peer must support at least one transport protocol.");
+W("Transport protocols differ in performance, system requirements and 
ease-of-use.");
+W("Each transport protocol also defines its own format for a host address.");
+W("Host addresses can be anything from a simple IP:PORT combination to an http 
URL or an E-mail address.");
+W("While a single peer can have as many addresses as transports, every peer is 
uniquely identified by its identity, which is the hash of its public key.");
+echo "</li></ol>";
+
+H2("Overview");
+BP();
+W("The protocols are described in the following sections:");
+EP();
+include("protocol_index.inc");
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_cs.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_cs.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_cs.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,32 +1,30 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Client-Server Protocol";
-$description="Description of the protocol used for GNUnet client-server 
communication.";
-include("html_header.php3");
-
-ANCHOR("CSprotocol");H3("GNUnet Protocol: client-to-node");
-BP();
-W("This section describes the protocol that is used on the 
<strong>trusted</strong>, reliable TCP connection between <tt>gnunetd</tt> and 
the clients (such as <tt>gnunet-insert</tt>, <tt>gnunet-search</tt>, 
<tt>gnunet-download</tt> or <tt>gnunet-gtk</tt>).");
-W("TCP is stream oriented, but GNUnet breaks the stream into records.");
-W("The different messages between GNUnet and the clients all have the 
following basic format:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-row(shortEntry_("size of the record", NBO_()),
-    shortEntry_("CS message type", NBO_()));
-rowIntEntry("(size - 4) bytes of data");
-echo "</table>\n";
-BP();
-W("The message type constants are defined in <tt>gnunet_protocols.h</tt> and 
all have names starting with <tt>CS_PROTO_</tt>.");
-W("The suffix <tt>REQUEST</tt> is used for messages from the client to 
<tt>gnunetd</tt>.");
-W("<tt>REPLY</tt> is used for messages from <tt>gnunetd</tt> to the client.");
-W("If <tt>gnunetd</tt> receives a REQUEST that it does not understand, it 
closes the connection (to prevent the client from blocking on a reply that may 
never come).");
-P();
-W("See also %s.",
-  extlink_("doxygen/html/tcpio_8c-source.html","tcpio.c"));
-
-W("The following groups of client-server messages are currently documented:");
-EP();
-include("protocol_cs_index.inc");
-include("html_footer.php3");
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Client-Server Protocol";
+$description="Description of the protocol used for GNUnet client-server 
communication.";
+include("html_header.php3");
+
+ANCHOR("CSprotocol");H3("GNUnet Protocol: client-to-node");
+BP();
+W("This section describes the protocol that is used on the 
<strong>trusted</strong>, reliable TCP connection between <tt>gnunetd</tt> and 
the clients (such as <tt>gnunet-insert</tt>, <tt>gnunet-search</tt>, 
<tt>gnunet-download</tt> or <tt>gnunet-gtk</tt>).");
+W("TCP is stream oriented, but GNUnet breaks the stream into records.");
+W("The different messages between GNUnet and the clients all have the 
following basic format:");
+EP();
+LAYOUT("CS_MESSAGE_HEADER",
+       F(ARRAY(N("message size", NBO_()) => 2,
+               N("request type", NBO_()) => 2,
+               N("(size - 4) bytes of data", "") => 0)));
+BP();
+W("The message type constants are defined in <tt>gnunet_protocols.h</tt> and 
all have names starting with <tt>CS_PROTO_</tt>.");
+W("The suffix <tt>REQUEST</tt> is used for messages from the client to 
<tt>gnunetd</tt>.");
+W("<tt>REPLY</tt> is used for messages from <tt>gnunetd</tt> to the client.");
+W("If <tt>gnunetd</tt> receives a REQUEST that it does not understand, it 
closes the connection (to prevent the client from blocking on a reply that may 
never come).");
+P();
+W("See also %s.",
+  extlink_("doxygen/html/tcpio_8c-source.html","tcpio.c"));
+
+W("The following groups of client-server messages are currently documented:");
+EP();
+include("protocol_cs_index.inc");
+include("html_footer.php3");
 ?>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/protocol_cs_afs.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_cs_afs.php3   2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_cs_afs.php3   2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,342 +1,201 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: AFS Client-to-Node protocol";
-$description="GNUnet Documentation - Protocol between client and node for 
anonymous file sharing";
-include("html_header.php3");
-
-ANCHOR("CSprotocolAFS");H3("GNUnet Protocol: client-to-node: Anonymous File 
Sharing");
-BP();
-afslogo();
-W("The GNUnet client-to-node procotol currently defines the following 
messages:");
-EP();
-?>
-<ul>
- <li><a href="#CS_QUERY">QUERY</a></li>
- <li><a href="#CS_3HASH">RESULT_3HASH</a></li>
- <li><a href="#CS_CHK">RESULT_CHK</a></li>
- <li><a href="#CS_INSERT_CHK">INSERT_CHK</a></li>
- <li><a href="#CS_INSERT_3HASH">INSERT_3HASH</a></li>
- <li><a href="#CS_INDEX_BLOCK">INDEX_BLOCK</a></li>
- <li><a href="#CS_INDEX_FILE">INDEX_FILE</a></li>
- <li><a href="#CS_INDEX_SUPER">INDEX_SUPER</a></li>
- <li><a href="#CS_DELETE_CHK">DELETE_CHK</a></li>
- <li><a href="#CS_DELETE_3HASH">DELETE_3HASH</a></li>
- <li><a href="#CS_UNINDEX_BLOCK">UNINDEX_BLOCK</a></li>
- <li><a href="#CS_UNINDEX_FILE">UNINDEX_FILE</a></li>
- <li><a href="#CS_UNINDEX_SUPER">UNINDEX_SUPER</a></li>
- <li><a href="#CS_NSQUERY">NSQUERY</a></li>
- <li><a href="#CS_INSERT_SBLOCK">INSERT_SBLOCK</a></li>
- <li><a href="#CS_RESULT_SBLOCK">RESULT_SBLOCK</a></li>
- <li><a href="#CS_UPLOAD_FILE">UPLOAD_FILE</a></li>
- <li><a href="#CS_LINK_FILE">LINK_FILE</a></li>
- <li><a href="#CS_GET_AVG_PRIORITY">GET_AVG_PRIORITY</a></li>
-</ul>
-<?php
-
-ANCHOR("CS_QUERY");H4("QUERY");
-BP();
-W("The client sends a message of this form whenever it is searching or 
downloading.");
-W("The server is expected to perform the search and send results back to the 
client.");
-W("The server can send any number of results with any delay (but typically no 
results are returned after ttl seconds and the client will re-issue the 
request), including none.");
-W("The format of the CS_QUERY message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("12+n*20", "8");
-rowIntEntryNBO("priority");
-rowIntEntryNBO("time to live (ttl)");
-fiveRowIntEntries("query [n]");
-echo "</table>\n";
-
-ANCHOR("CS_3HASH");H4("3HASH");
-BP();
-W("If <tt>gnunetd</tt> finds a search result to a %s, it sends back the data 
encapsulated in this message.",
-  extlink_("#CS_QUERY","QUERY"));
-W("The message contains the double hash from the query to identify the 
result.");
-W("The format of the  message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">";
-include("bittable.inc");
-rowSizeType("1048","9");
-fiveRowIntEntries("proof (double hash)");
-rowIntEntry("data (1024 octets)");
-echo "</table>";
-
-ANCHOR("CS_CHK");H4("CHK");
-BP();
-W("If <tt>gnunetd</tt> finds a download result to a %s, it sends back the data 
encapsulated in this message.",
-  extlink_("#CS_QUERY","QUERY"));
-W("The format of the message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("1028","10");
-rowIntEntry("data (1024 octets)");
-echo "</table>\n";
-
-ANCHOR("CS_INSERT_CHK");H4("INSERT_CHK");
-BP();
-W("Clients send this message to insert search results into the network.");
-W("The server is supposed to store the data and share it with other nodes.");
-W("Note that there are two ways to share data, via insertion and via %s.",
-  extlink_("#CS_INDEX_BLOCK","indexing"));
-W("Indexing only applies to downloads and never to search results.");
-W("The importance in this message tells the server how important it is to 
store this content, so that the server can decide which content to discard if 
it is running out of space.");
-P();
-W("If the insertion was successful, the server replies with a %s containing 
<tt>OK</tt>, otherwise the server replies with <tt>SYSERR</tt>.",
-  extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-P();
-W("The format of the INSERT_CHK message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("1032","11");
-rowIntEntryNBO("priority");
-rowIntEntry("data (1024 octets)");
-echo "</table>\n";
-
-ANCHOR("CS_INSERT_3HASH");H4("INSERT_3HASH");
-BP();
-W("Clients send this message to insert search results into the network.");
-W("The server is supposed to store the data and share it with other nodes.");
-W("The importance in this message tells the server how important it is to 
store this content, so that the server can decide which content to discard if 
it is running out of space.");
-P();
-W("If the insertion was successful, the server replies with a %s containing 
<tt>OK</tt>, otherwise the server replies with <tt>SYSERR</tt>.",
-  extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-P();
-W("The format of the INSERT_3HASH message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("1052","12");
-rowIntEntryNBO("priority");
-fiveRowIntEntries("proof (double hash)");
-rowIntEntry("data (1024 octets)");
-echo "</table>\n";
-
-ANCHOR("CS_INDEX_BLOCK");H4("INDEX_BLOCK");
-BP();
-W("Clients send this message to insert content into the network.");
-W("The indexing message does not contain the data but describes a way for the 
server to find on-demand.");
-W("The %s contains an index into the list of filenames and the offset in the 
file at which the block corresponding to the query can be found.",
-  extlink_("doxygen/html/structContentIndex.html","ContentIndex struct"));
-P();
-W("If the indexing was successful, the server replies with a %s containing 
<tt>OK</tt>, otherwise the server replies with <tt>SYSERR</tt>.",
-  extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-W("The format of the INDEX_BLOCK message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("36", "13");
-rowIntEntryVerbatim(extlink_("doxygen/html/structContentIndex.html","ContentIndex")
 . W_("(32 octets)"));
-echo "</table>\n";
-
-ANCHOR("CS_INDEX_FILE");H4("INDEX_FILE");
-BP();
-W("This message is used by the client to add a file to the list of shared 
files.");
-W("<tt>gnunetd</tt> responds to this request with %s which can be used in the 
%s messages.",
-  ARRAY(extlink_("#CS_returnvalue_MESSAGE","an index into the list of files"),
-    extlink_("#CS_INDEX_BLOCK","CS_INDEX_BLOCK")));
-W("The file is identified by the RIPE160MD hash of the contents.");
-W("Note that the client is expected to either copy or linked the file to the 
index directory with the appropriate messages.");
-W("Attempting to create a link should be done before INDEX_FILE, but making a 
copy should be done afterwards.");
-W("The server responds with a value of SYSERR if the quota-settings 
(INDEX-QUOTA) will not allow the upload of the file.");
-W("The client should use filesize 0 if a symlink will be used and thus the 
quota check can hence be avoided.");
-W("The format of the INDEX_FILE message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("32", "20");
-rowIntEntry("filesize");
-fiveRowIntEntries("Hash of the file (used to create the filename)");
-echo "</table>\n";
-
-ANCHOR("CS_INDEX_SUPER");H4("INDEX_SUPER");
-BP();
-W("This message adds a hash-code to one of the bloom filters, making the 
content effectively available.");
-W("The format of the INDEX_SUPER is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("24", "15");
-fiveRowIntEntries("proof (super hash)");
-echo "</table>\n";
-
-ANCHOR("CS_DELETE_CHK");H4("DELETE_CHK");
-BP();
-W("The CS_DELETE_CHK message uses the same format as the %s message, only that 
the type is set to 16.",
-  extlink_("#CS_INSERT_CHK","CS_INSERT_CHK"));
-W("The AFS module then deletes the corresponding CHK block.");
-W("A %s is send back to indicate success or failure.",
-   extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-EP();
-
-ANCHOR("CS_DELETE_3HASH");H4("DELETE_3HASH");
-BP();
-W("The CS_DELETE_3HASH message uses the same format as the %s message, only 
that the type is set to 17.",
-  extlink_("#CS_INSERT_CHK","CS_INSERT_CHK"));
-W("The AFS module then deletes the corresponding block.");
-W("A %s is send back to indicate success or failure.",
-   extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-W("CS_DELETE_3HASH is not currently used by the code since there is no good 
way to establish the RBlocks that correspond to a given file when facing 
user-supplied keywords and meta-data.");
-EP();
-
-ANCHOR("CS_UNINDEX_BLOCK");H4("UNINDEX_BLOCK");
-BP();
-W("The CS_UNINDEX_BLOCK message uses the same format as the %s message, only 
that the type is set to 18.",
-  extlink_("#CS_INDEX_BLOCK","CS_INDEX_BLOCK"));
-W("The AFS module then removes the corresponding index entry from the 
database.");
-W("A %s is send back to indicate success or failure.",
-   extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-EP();
-
-ANCHOR("CS_UNINDEX_FILE");H4("UNINDEX_FILE");
-BP();
-W("The CS_UNINDEX_BLOCK message uses the same format as the %s message, only 
that the type is set to 19.",
-  extlink_("#CS_INDEX_FILE","CS_INDEX_FILE"));
-W("The AFS module then removes the corresponding file from the file list.");
-W("A %s is send back to indicate success or failure.",
-   extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-EP();
-
-ANCHOR("CS_UNINDEX_SUPER");H4("UNINDEX_SUPER");
-BP();
-W("The CS_UNINDEX_SUPER message uses the same format as the %s message, only 
that the type is set to 20.",
-  extlink_("#CS_INDEX_FILE","CS_INDEX_FILE"));
-W("The AFS module then deletes the corresponding hash from the bloomfilter for 
super-hashes.");
-W("A %s is send back to indicate success or failure.",
-   extlink_("#CS_returnvalue_MESSAGE","RETURN_VALUE"));
-EP();
-
-ANCHOR("CS_NSQUERY");H4("NSQUERY");
-BP();
-W("This message is used by clients to initiate a namespace query.");
-W("It differs from ordinary queries in that it also contains the identifier of 
the namespace N.");
-W("Furthermore, an NSQUERY can only contain one identifier that is 
requested.");
-W("The SBlock identifier R that is used in an NSQUERY is derived from the 
namespace identifier N and the key K that is used to encrypt the corresponding 
SBlock by the following formula:");
-EP();
-PRE("R := H(K) XOR N");
-BP();
-W("The format is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("52","21");
-rowIntEntryNBO("priority");
-rowIntEntryNBO("time-to-live");
-fiveRowIntEntries("N (namespace id)");
-fiveRowIntEntries("R (SBlock identifier)");
-echo "</table>\n";
-
-ANCHOR("CS_INSERT_SBLOCK");H4("INSERT_SBLOCK");
-BP();
-W("This message is used by clients to insert an SBlock into the network.");
-W("The format is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("1032","22");
-rowIntEntryNBO("priority");
-rowIntEntry("encrypted data (484 bytes)");
-fiveRowIntEntries("R (routing identifier)");
-rowIntEntryVerbatim(extlink_("doxygen/html/structSignature.html",
-                             "RSA signature (256 octets)"));
-row(shortEntryVerbatim_(extlink_("doxygen/html/structPublicKey.html","Public 
Key") .
-                       " " . W_("length of N + E + 2 (256+2+2 = 260)") . 
NBO_()),
-    shortEntryVerbatim_(W_("Public Key, length of N (256)") . NBO_()));
-rowIntEntry("Public Key, N (256 octets)");
-row(shortEntry_("Public Key, E"),
-    shortEntry_("padding (must be 0)"));
-echo "</table>\n";
-
-BP();
-W("Note that there is currently no corresponding message to delete an 
SBlock.");
-EP();
-
-ANCHOR("CS_RESULT_SBLOCK");H4("RESULT_SBLOCK");
-BP();
-W("This message is send from the server to the client whenever a response to 
an %s is found.",
-  extlink_("#CS_NSQUERY","NSQUERY"));
-W("The format is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("1028","23");
-rowIntEntry("encrypted data (484 bytes)");
-fiveRowIntEntries("R (routing identifier)");
-rowIntEntryVerbatim(extlink_("doxygen/html/structSignature.html",
-                             "RSA signature (256 octets)"));
-row(shortEntryVerbatim_(extlink_("doxygen/html/structPublicKey.html","Public 
Key") .
-                       " " . W_("length of N + E + 2 (256+2+2 = 260)") . 
NBO_()),
-    shortEntryVerbatim_(W_("Public Key, length of N (256)") . NBO_()));
-rowIntEntry("Public Key, N (256 octets)");
-row(shortEntry_("Public Key, E"),
-    shortEntry_("padding (must be 0)"));
-echo "</table>\n";
-
-BP();
-W("Note that there is currently no corresponding message to delete an 
SBlock.");
-EP();
-
-
-ANCHOR("CS_UPLOAD_FILE"); H4("UPLOAD_FILE");
-
-BP();
-W("This message is used by the client to upload (part of) a file being 
indexed.");
-W("The file is identified by its RIPE160MD hash.");
-W("Each upload message contains a variable number of bytes starting at a 
certain offset.");
-W("<tt>gnunetd</tt> will store the respective block of the file in the 
index-directory.");
-W("Note that the client still must send the indexing requests for the 
individual blocks.");
-W("<tt>gnunetd</tt> signals success or error with a RETURN_VALUE of OK or 
SYSERR.");
-W("The format of the message is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("variable, &gt; 28", "24");
-rowIntEntry("position in the file");
-fiveRowIntEntries("Hash code identifying the file");
-rowIntEntry("data (size - 28 bytes)");
-echo "</table>\n";
-
-
-ANCHOR("CS_LINK_FILE"); H4("LINK_FILE");
-BP();
-W("Instead of creating a copy, try to create a symbolic link.");
-W("The given filename is the target name.");
-W("<tt>gnunetd</tt> must verify that the file is accessible AND that the 
contents match the provided RIPE160MD hash.");
-W("<tt>gnunetd</tt> signals success or error with a RETURN_VALUE of OK or 
SYSERR.");
-W("The format of the message is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("variable, &gt; 24", "25");
-fiveRowIntEntries("Hash code identifying the file");
-rowIntEntry("0-terminated filename");
-echo "</table>\n";
-
-
-ANCHOR("CS_GET_AVG_PRIORITY"); H4("GET_AVG_PRIORITY");
-
-BP();
-W("This query is used by the client to determine the current average priority 
of requests from OTHER peers that are in the routing table.");
-W("The server responds with a RETURN_VALUE message containing that average 
priority (or SYSERR on error).");
-W("The format of the message is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "26");
-echo "</table>\n";
-
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: AFS Client-to-Node protocol";
+$description="Protocol between client and node for (anonymous) file sharing";
+include("html_header.php3");
+
+H3("GNUnet Protocol: client-to-node: File Sharing");
+BP();
+afslogo();
+W("The file-sharing procotol currently defines the following messages between 
client and server:");
+EP();
+echo "<ul>\n";
+LILI("#CS_QUERY","QUERY_START");
+LILI("#CS_QUERY_STOP","QUERY_STOP");
+LILI("#CS_RESULT","RESULT");
+LILI("#CS_INSERT","INSERT");
+LILI("#CS_INDEX","INDEX");
+LILI("#CS_DELETE","DELETE");
+LILI("#CS_UNINDEX","UNINDEX");
+LILI("#CS_TESTINDEX","TESTINDEX");
+LILI("#CS_GET_AVG_PRIORITY","GET_AVG_PRIORITY");
+LILI("#CS_INIT_INDEX","INIT_INDEX");
+echo "</ul>\n";
+
+ANCHOR("CS_QUERY");H4("QUERY_START");
+BP();
+W("The client sends a message of this form whenever it is searching or 
downloading.");
+W("The server is expected to perform the search and send results back to the 
client.");
+W("The server can send any number of results with any delay.");
+W("Typically no results are returned after <tt>ttl</tt> seconds and the client 
will re-issue the request.");
+W("The server is supposed to stop searching after receiving a matching 
<tt>QUERY_STOP</tt> message.");
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_search_MESSAGE",
+       F(ARRAY(N("message size (88 or 152)", NBO_()) => 2,
+               V("request type", 8, NBO_()) => 2,
+               N("priority", NBO_()) => 4,
+               N("expiration (cron_t)", NBO_()) => 8,
+               N("type", NBO_()) => 4,
+               N("anonymity level", NBO_()) => 4,
+               N("query", "") => 64,
+               N("namespace (optional)", "") => 64)));
+
+
+ANCHOR("CS_QUERY_STOP");H4("QUERY_STOP");
+BP();
+W("This message is send by the client to <tt>gnunetd</tt> to abort a search.");
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_search_MESSAGE",
+       F(ARRAY(N("message size (88 or 152)", NBO_()) => 2,
+               V("request type", 9, NBO_()) => 2,
+               N("priority", NBO_()) => 4,
+               N("expiration (cron_t)", NBO_()) => 8,
+               N("type", NBO_()) => 4,
+               N("anonymity level", NBO_()) => 4,
+               N("query", "") => 64,
+               N("namespace (optional)", "") => 64)));
+
+
+
+ANCHOR("CS_RESULT");H4("RESULT");
+BP();
+W("If <tt>gnunetd</tt> finds a search result to a %s, it sends back the data 
encapsulated in this message.",
+  extlink_("#CS_QUERY","QUERY_START"));
+W("The format of the  message is:");
+EP();
+LAYOUT("CS_fs_reply_content_MESSAGE",
+       F(ARRAY(N("message size (4+X)", NBO_()) => 2,
+               V("request type", 9, NBO_()) => 2,
+               N("data (ECRS encoded)", "") => 0)));
+
+ANCHOR("CS_INSERT");H4("INSERT");
+BP();
+W("Clients send this message to insert data into the network.");
+W("The server is supposed to store the data and share it with other nodes.");
+W("Note that there are two ways to share data, via insertion and via %s.",
+  extlink_("#CS_INDEX","indexing"));
+W("Indexing only applies to downloads and never to search results.");
+W("The importance in this message tells the server how important it is to 
store this content, so that the server can decide which content to discard if 
it is running out of space.");
+P();
+W("If the insertion was successful, the server replies with a %s containing 
<tt>OK</tt>, otherwise the server replies with <tt>SYSERR</tt>.",
+  intlink_("protocol_cs_core.php3","RETURN_VALUE"));
+P();
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_insert_MESSAGE",
+       F(ARRAY(N("message size (20+X)", NBO_()) => 2,
+               V("request type", 10, NBO_()) => 2,
+               N("priority", NBO_()) => 4,
+               N("expiration (cron_t)", NBO_()) => 8,
+               N("anonymity level", NBO_()) => 4,
+              N("data (ECRS encoded)", "") => 0)));
+
+ANCHOR("CS_INDEX");H4("INDEX");
+BP();
+W("Clients send this message to index content to make it available to the 
network.");
+W("The indexing message does not only contain the data but also describes a 
way for the server to possibly find it on-demand.");
+W("This is achieved using the <tt>file ID</tt>, a hash of the entire file.");
+W("This hash thus uniquely identifies the file.");
+W("The client should send an <tt>INDEX_INIT</tt> message earlier that tells 
the server the location of a file with that hash in the filesystem.</tt>");
+W("If <tt>gnunetd</tt> can access that file, it will create a symbolic link 
instead of copying <tt>data</tt> into its internal database.");
+W("If <tt>gnunetd</tt> cannot access the file, it will create a copy of the 
file using the <tt>data</tt> contained in the <tt>INDEX</tt> messages.");
+W("In both cases <tt>gnunetd</tt> will store an index of the file in its 
database in order to be able to retrieve the blocks on-demand.");
+P();
+W("If the indexing was successful, the server replies with a %s containing 
<tt>OK</tt>, otherwise the server replies with <tt>SYSERR</tt>.",
+  intlink_("protocol_cs_core.php3","RETURN_VALUE"));
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_index_MESSAGE",
+       F(ARRAY(N("message size (92+X)", NBO_()) => 2,
+               V("request type", 11, NBO_()) => 2,
+               N("priority", NBO_()) => 4,
+               N("expiration (cron_t)", NBO_()) => 8,
+               N("offset of data in file", NBO_()) => 8,
+               N("file ID (SHA-512 of entire file)", "") => 64,
+               N("anonymity level", NBO_()) => 4,
+              N("data (X bytes in plaintext)", "") => 0)));
+
+
+ANCHOR("CS_DELETE");H4("DELETE");
+BP();
+W("This message is used by clients to request the deletion of specific content 
by <tt>gnunetd</tt> from the local datastore.");
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_delete_MESSAGE",
+       F(ARRAY(N("message size (4+X)", NBO_()) => 2,
+               V("request type", 12, NBO_()) => 2,
+              N("data (ECRS encoded)", "") => 0)));
+
+
+ANCHOR("CS_UNINDEX");H4("UNINDEX");
+BP();
+W("This message is used to request the removal of an entire indexed file from 
the database of <tt>gnunetd</tt>.");
+W("<tt>gnunetd</tt> will use the original file to reconstruct the individual 
blocks stored in the index.");
+W("For that, <tt>gnunetd</tt> needs to know the <tt>blocksize</tt> that was 
used during the construction of the original index.");
+W("The format of the message is:");
+EP();
+LAYOUT("CS_fs_request_unindex_MESSAGE",
+       F(ARRAY(N("message size (72)", NBO_()) => 2,
+               V("request type", 13, NBO_()) => 2,
+               N("blocksize", NBO_()) => 4,
+               N("file ID (SHA-512 of entire file)", "") => 64)));
+
+
+ANCHOR("CS_TESTINDEX");H4("TESTINDEX");
+BP();
+W("This message is used by the client to test if a given file is already 
indexed.");
+W("The server replies with a %s containing <tt>YES</tt> or <tt>NO</tt>.",
+  intlink_("protocol_cs_core.php3","RETURN_VALUE"));
+W("The format of the message is:");
+EP();
+LAYOUT("RequestTestindex",
+       F(ARRAY(V("message size", 72, NBO_()) => 2,
+               V("request type", 14, NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 4,
+               N("file ID (SHA-512 of entire file)", "") => 64)));
+EP();
+
+
+ANCHOR("CS_GET_AVG_PRIORITY"); H4("GET_AVG_PRIORITY");
+
+BP();
+W("This query is used by the client to determine the current average priority 
of requests from OTHER peers that are in the routing table.");
+W("The server replies with a %s containing that average priority (or SYSERR on 
error).",
+  intlink_("protocol_cs_core.php3","RETURN_VALUE"));
+W("The format of the message is:");
+EP();
+LAYOUT("CS_MESSAGE_HEADER",
+       F(ARRAY(V("message size", 4, NBO_()) => 2,
+               V("request type", 15, NBO_()) => 2)));
+
+
+
+ANCHOR("CS_INIT_INDEX"); H4("INIT_INDEX");
+
+BP();
+W("This message is used by the client to initiate the indexing process of a 
file.");
+W("The file is identified by its SHA-512 hash.");
+
+W("The message is used to give <tt>gnunetd</tt> a chance to create a symbolic 
link instead of creating a copy.");
+W("The given filename is the target name on the machine where the client is 
running.");
+W("In other words, the file may not exist on the machine where 
<tt>gnunetd</tt> is running.");
+W("Also, file permissions maybe set such that <tt>gnunetd</tt> cannot access 
the file.");
+W("<tt>gnunetd</tt> must verify that the file is accessible AND that the 
contents match the provided SHA-512 hash.");
+W("<tt>gnunetd</tt> signals success or error with a %s_VALUE of OK or SYSERR.",
+  intlink_("protocol_cs_core.php3","RETURN_VALUE"));
+// FIXME: what does "success" mean? Not always symlinking, right?
+W("The format of the message is:");
+
+
+LAYOUT("CS_fs_request_init_index_MESSAGE",
+       F(ARRAY(N("message size (72+X)", NBO_()) => 2,
+               V("request type", 16, NBO_()) => 2,
+              V("reserved", 0, NBO_())=>4,
+              N("file ID (SHA-512 of the file)", "")=> 64,
+              N("filename", "") => 0)));
+
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_cs_core.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_cs_core.php3  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_cs_core.php3  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,172 +1,43 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: AFS Client-to-Node protocol";
-$description="GNUnet Documentation - core client-server protocol";
-include("html_header.php3");
-
-ANCHOR("CSprotocolCore");H3("GNUnet Protocol: client-to-node: core");
-BP();
-W("The only application independent, always available client-server (CS) 
message that are currently defined are:");
-EP();
-echo "<ul><li>";
-extlink("#CS_returnvalue_MESSAGE","RETURN_VALUE");
-echo "</li><li>";
-extlink("#CS_GET_STATISTICS","GET_STATISTICS");
-echo "</li><li>";
-extlink("#CS_STATISTICS","STATISTICS");
-echo "</li><li>";
-extlink("#CS_TRAFFIC_QUERY","TRAFFIC_QUERY");
-echo "</li><li>";
-extlink("#CS_traffic_info_MESSAGE","TRAFFIC_INFO");
-echo "</li><li>";
-extlink("#CS_SHUTDOWN_REQUEST","SHUTDOWN_REQUEST");
-echo "</li><li>";
-extlink("#CS_getoption_request_MESSAGE","GET_OPTION_REQUEST");
-echo "</li><li>";
-extlink("#CS_getoption_reply_MESSAGE","GET_OPTION_REPLY");
-echo "</li></ul>";
-
-ANCHOR("CS_returnvalue_MESSAGE");H4("RETURN_VALUE");
-BP();
-W("The RETURN_VALUE message is used to communicate simple (int) return values 
from TCP requests.");
-W("It is always send in response to another, specific request.");
-W("The format of the RETURN_VALUE message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("8","0");
-rowIntEntryNBO("the return value");
-echo "</table>\n";
-
-ANCHOR("CS_GET_STATISTICS");H4("GET_STATISTICS");
-BP();
-W("With this message, the client can request statistics from the server.");
-W("The server always replies with a %s message.",
-  extlink_("#CS_STATISTICS","STATISTICS"));
-P();
-W("The format of the GET_STATISTICS message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "1");
-echo "</table>\n";
-
-ANCHOR("CS_STATISTICS");H4("STATISTICS");
-BP();
-W("The available statistical information may change between GNUnet versions.");
-W("It also depends on which modules are loaded.");
-W("The %s of this message is:",
-  extlink_("doxygen/html/structSTATISTICS__Message.html","format"));
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("variable", "2");
-rowIntEntryNBO("start time (gnuentd start)");
-rowIntEntryNBO("start time (gnunetd start)");
-rowIntEntryNBO("total counters (number of statistical values gnunetd keeps 
track of)");
-rowIntEntryNBO("stat counters (number of statistical values transmitted in 
this message)");
-rowIntEntryNBO("values (unsigned long long[stat counters])");
-rowIntEntryNBO("descriptions (stat counters of zero-terminated strings 
describing the values)");
-echo "</table>\n";
-
-BP();
-W("The server sends potentially several STATISTICS messages until the sum of 
<tt>stat counters</tt> in all messages equals the <tt>total counters</tt> 
advertised.");
-W("The last decription string is also zero-terminated.");
-W("Thus the last character in every STATISTICS message is 0.");
-EP();
-
-
-ANCHOR("CS_TRAFFIC_QUERY");H4("TRAFFIC_QUERY");
-BP();
-W("With this message, the client can request traffic statistics from 
gnunetd.");
-W("The time period specfied in the message specifies which traffic is 
interesting for the request (in terms of not older than time period time 
units).");
-W("The format of the TRAFFIC_QUERY message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "2");
-rowIntEntryNBO("time period (in CU)");
-echo "</table>\n";
-BP();
-W("The server responds with a TRAFFIC_INFO message.");
-EP();
-
-
-ANCHOR("CS_traffic_info_MESSAGE");H4("TRAFFIC_INFO");
-BP();
-W("With this message, the server sends traffic information to the client.");
-W("The format of the TRAFFIC_INFO message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "3");
-rowIntEntryNBO("number of traffic counters that follow");
-echo "</table>\n";
-
-BP();
-W("The traffic counters have the following format:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-row(shortEntry_("flags (see TC_ constants)", NBO_()),
-    shortEntry_("number of messages of this type that were processed", 
NBO_()));
-row(shortEntry_("message type", NBO_()),
-    shortEntry_("average message size", NBO_()));
-rowIntEntryNBO("bitmask indicating in which of the last 32 time units a 
message was received");
-echo "</table>\n";
-
-
-ANCHOR("CS_SHUTDOWN_REQUEST");H4("SHUTDOWN_REQUEST");
-BP();
-W("With this message, the client can request gnunetd to shutdown.");
-W("The format of the SHUTDOWN_REQUEST message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "64");
-echo "</table>\n";
-BP();
-W("The server responds with a RETURN_VALUE message with the contents OK if it 
is shutting down.");
-EP();
-
-
-ANCHOR("GET_OPTION_REQUEST");H4("GET_OPTION_REQUEST");
-BP();
-W("With this message, the client can request the value of an option from the 
gnunetd configuration.");
-W("The format of the GET_OPTION_REQUEST message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("4", "65");
-rowIntEntry("32 characters giving the section name, 0-terminated");
-rowIntEntry("32 characters giving the option name, 0-terminated");
-echo "</table>\n";
-BP();
-W("The server responds with a GET_OPTION_REPLY message.");
-
-EP();
-ANCHOR("GET_OPTION_REPLY");H4("GET_OPTION_REPLY");
-BP();
-W("With this message, the server notifies the client about the value of an 
option.");
-W("The format of the GET_OPTION_REPLY message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("variable(&gt;4)", "66");
-rowIntEntry("option value (as characters), 0-terminated, size determined");
-echo "</table>\n";
-
-
-
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Client-to-Node protocol";
+$description="Documentation of the CS messages implemented by the GNUnet 
core.";
+include("html_header.php3");
+
+H3("GNUnet Protocol: client-to-node: core");
+BP();
+W("The following messages are not specific to any particular appliation.");
+W("They are implemented by the core and always available.");
+W("The RETURN_VALUE message is also used as part of application-specific CS 
protocols.");
+EP();
+echo "<ul>\n";
+LILI("#CS_returnvalue_MESSAGE","RETURN_VALUE");
+LILI("#CS_SHUTDOWN_REQUEST","SHUTDOWN_REQUEST");
+echo "</ul>\n";
+
+ANCHOR("CS_returnvalue_MESSAGE");H4("RETURN_VALUE");
+BP();
+W("The RETURN_VALUE message is used to communicate simple (int) return values 
from TCP requests.");
+W("It is always send in response to another, specific request.");
+W("The format of the RETURN_VALUE message is:");
+EP();
+LAYOUT("CS_returnvalue_MESSAGE",
+       F(ARRAY(V("message size", 8, NBO_()) => 2,
+               V("request type", 0, NBO_()) => 2,
+               N("return value", NBO_()) => 4)));
+
+
+ANCHOR("CS_SHUTDOWN_REQUEST");H4("SHUTDOWN_REQUEST");
+BP();
+W("With this message, the client can request gnunetd to shutdown.");
+W("The format of the SHUTDOWN_REQUEST message is:");
+EP();
+LAYOUT("CS_MESSAGE_HEADER",
+       F(ARRAY(V("message size", 4, NBO_()) => 2,
+               V("request type", 1, NBO_()) => 2)));
+BP();
+W("The server responds with a RETURN_VALUE message with the contents OK if it 
is shutting down.");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_cs_index.inc
===================================================================
--- GNUnet-docs/WWW/test/protocol_cs_index.inc  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_cs_index.inc  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,8 +1,11 @@
 <ol>
 <li><?php intlink("protocol_cs_core.php3","GNUnet core"); ?></li>
-<li><?php intlink("protocol_cs_afs.php3","AFS"); ?></li>
-<!-- li><?php intlink("protocol_cs_chat.php3","Chat"); ?></li -->
-<!-- li><?php intlink("protocol_cs_tbench.php3","TBench"); ?></li -->
-<!-- li><?php intlink("protocol_cs_tracekit.php3","TraceKit"); ?></li -->
-<li><?php intlink("protocol_cs_testbed.php3","Testbed"); ?></li>
+<li><?php intlink("protocol_cs_getoption.php3","getoption"); ?></li>
+<li><?php intlink("protocol_cs_stats.php3","stats"); ?></li>
+<li><?php intlink("protocol_cs_traffic.php3","traffic"); ?></li>
+<li><?php intlink("protocol_cs_afs.php3","fs"); ?></li>
+<!-- li><?php intlink("protocol_cs_chat.php3","chat"); ?></li -->
+<!-- li><?php intlink("protocol_cs_tbench.php3","tbench"); ?></li -->
+<!-- li><?php intlink("protocol_cs_tracekit.php3","tracekit"); ?></li -->
+<!-- li><?php intlink("protocol_cs_testbed.php3","testbed"); ?></li -->
 </ol>

Modified: GNUnet-docs/WWW/test/protocol_cs_testbed.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_cs_testbed.php3       2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/protocol_cs_testbed.php3       2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,95 +1,95 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Testbed Client-to-Node protocol";
-$description="GNUnet Documentation - the Testbed client-server protocol";
-include("html_header.php3");
-
-ANCHOR("CSprotocolTestbed");H3("GNUnet Protocol: client-to-node: testbed");
-BP();
-W("The testbed protocol encapsulates all of its messages within two global 
message types, <tt>CS_TESTBED_REQUEST</tt> and <tt>CS_TESTBED_REPLY</tt>.");
-W("Also note that the testbed module does not define peer-to-peer messages by 
itself.");
-W("The testbed protocol is used to instrument the peer-to-peer network, but 
does not use peer-to-peer protocols to achieve that.");
-W("The testbed setup itself is inherently client-server.");
-EP();
-
-ANCHOR("CS_TESTBED_REQUEST");H4("CS_TESTBED_REQUEST");
-BP();
-W("The CS_TESTBED_REQUEST message is used to request a specific action from 
the peer.");
-W("The action itself is specified in the <tt>message type</tt> field.");
-W("Depending on the message type, the testbed-request message is further 
parametrized by variable-size data.");
-W("Thus CS_TESTBED_REQUEST is inherently a variable-size message.");
-W("The general format of the CS_TESTBED_REQUEST message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("size","50");
-rowIntEntryNBO("message type");
-rowIntEntry("(size - 8) bytes of data");
-echo "</table>\n";
-
-BP();
-W("The possible parametrizations are (see also %s):",
-  extlink_("doxygen/html/testbed_8h.html", "testbed.h"));
-EP();
-echo "<ul>";
-$messages = ARRAY(1=>"ADD_PEER",
-                 2=>"DEL PEER",
-                 3=>"DEL_ALL_PEERS",
-                 4=>"GET_HELO",
-                 5=>"SET_TVALUE",
-                 6=>"GET_TVALUE",
-                 7=>"BLACKLIST",
-                 8=>"SET_IN_BW",
-                 9=>"SET_OUT_BW",
-                 10=>"SET_LOSS_RATE",
-                 11=>"LOAD_MODULE",
-                 12=>"UNLOAD_MODULE");
-foreach($messages as $i=>$b)
-  printf("<li><a href=\"#%s\">TESTBED_%s</a></li>",
-         $b, $b);
-echo "</ul>";
-
-ANCHOR("ADD_PEER"); H5("TESTBED_ADD_PEER");
-ANCHOR("DEL_PEER"); H5("TESTBED_DEL_PEER");
-ANCHOR("DEL_ALL_PEERS"); H5("TESTBED_DEL_ALL_PEERS");
-ANCHOR("GET_HELO"); H5("TESTBED_GET_HELO");
-ANCHOR("SET_TVALUE"); H5("TESTBED_SET_TVALUE");
-ANCHOR("GET_TVALUE"); H5("TESTBED_GET_TVALUE");
-ANCHOR("BLACKLIST"); H5("BLACKLIST");
-ANCHOR("SET_IN_BW"); H5("SET_IN_BW");
-ANCHOR("SET_OUT_BW"); H5("SET_OUT_BW");
-ANCHOR("SET_LOSS_RATE"); H5("SET_LOSS_RATE");
-ANCHOR("LOAD_MODULE"); H5("LOAD_MODULE");
-ANCHOR("UNLOAD_MODULE"); H5("UNLOAD_MODULE");
-
-ANCHOR("CS_TESTBED_REPLY");H4("CS_TESTBED_REPLY");
-BP();
-W("The CS_TESTBED_REPLY message is used as a response from the peer to some of 
the CS_TESTBED_REQUEST messages.");
-W("Specifics of the response are encoded in the <tt>message type</tt> field.");
-W("Depending on the message type, the testbed-reply message is further 
parametrized by variable-size data.");
-W("Overall, CS_TESTBED_REPLY is very similar to CS_TESTBED_REQUEST, only that 
it is send in the other direction.");
-W("The general format of the CS_TESTBED_REPLY message is:");
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("size","51");
-rowIntEntryNBO("message type");
-rowIntEntry("(size - 8) bytes of data");
-echo "</table>\n";
-
-BP();
-W("The possible parametrizations are:");
-EP();
-echo "<ul>";
-$messages = ARRAY(0=>"HELO_RESPONSE");
-foreach($messages as $i=>$b)
-  printf("<li><a href=\"#%s\">TESTBED_%s</a></li>",
-         $b, $b);
-echo "</ul>";
-
-ANCHOR("HELO_RESPONSE"); H5("TESTBED_HELO_RESPONSE");
-
-include("html_footer.php3");
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Testbed Client-to-Node protocol";
+$description="GNUnet Documentation - the Testbed client-server protocol";
+include("html_header.php3");
+
+ANCHOR("CSprotocolTestbed");H3("GNUnet Protocol: client-to-node: testbed");
+BP();
+W("The testbed protocol encapsulates all of its messages within two global 
message types, <tt>CS_TESTBED_REQUEST</tt> and <tt>CS_TESTBED_REPLY</tt>.");
+W("Also note that the testbed module does not define peer-to-peer messages by 
itself.");
+W("The testbed protocol is used to instrument the peer-to-peer network, but 
does not use peer-to-peer protocols to achieve that.");
+W("The testbed setup itself is inherently client-server.");
+EP();
+
+ANCHOR("CS_TESTBED_REQUEST");H4("CS_TESTBED_REQUEST");
+BP();
+W("The CS_TESTBED_REQUEST message is used to request a specific action from 
the peer.");
+W("The action itself is specified in the <tt>message type</tt> field.");
+W("Depending on the message type, the testbed-request message is further 
parametrized by variable-size data.");
+W("Thus CS_TESTBED_REQUEST is inherently a variable-size message.");
+W("The general format of the CS_TESTBED_REQUEST message is:");
+EP();
+
+echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
+include("bittable.inc");
+rowSizeType("size","50");
+rowIntEntryNBO("message type");
+rowIntEntry("(size - 8) bytes of data");
+echo "</table>\n";
+
+BP();
+W("The possible parametrizations are (see also %s):",
+  extlink_("doxygen/html/testbed_8h.html", "testbed.h"));
+EP();
+echo "<ul>";
+$messages = ARRAY(1=>"ADD_PEER",
+                 2=>"DEL PEER",
+                 3=>"DEL_ALL_PEERS",
+                 4=>"GET_HELO",
+                 5=>"SET_TVALUE",
+                 6=>"GET_TVALUE",
+                 7=>"BLACKLIST",
+                 8=>"SET_IN_BW",
+                 9=>"SET_OUT_BW",
+                 10=>"SET_LOSS_RATE",
+                 11=>"LOAD_MODULE",
+                 12=>"UNLOAD_MODULE");
+foreach($messages as $i=>$b)
+  printf("<li><a href=\"#%s\">TESTBED_%s</a></li>",
+         $b, $b);
+echo "</ul>";
+
+ANCHOR("ADD_PEER"); H5("TESTBED_ADD_PEER");
+ANCHOR("DEL_PEER"); H5("TESTBED_DEL_PEER");
+ANCHOR("DEL_ALL_PEERS"); H5("TESTBED_DEL_ALL_PEERS");
+ANCHOR("GET_HELO"); H5("TESTBED_GET_HELO");
+ANCHOR("SET_TVALUE"); H5("TESTBED_SET_TVALUE");
+ANCHOR("GET_TVALUE"); H5("TESTBED_GET_TVALUE");
+ANCHOR("BLACKLIST"); H5("BLACKLIST");
+ANCHOR("SET_IN_BW"); H5("SET_IN_BW");
+ANCHOR("SET_OUT_BW"); H5("SET_OUT_BW");
+ANCHOR("SET_LOSS_RATE"); H5("SET_LOSS_RATE");
+ANCHOR("LOAD_MODULE"); H5("LOAD_MODULE");
+ANCHOR("UNLOAD_MODULE"); H5("UNLOAD_MODULE");
+
+ANCHOR("CS_TESTBED_REPLY");H4("CS_TESTBED_REPLY");
+BP();
+W("The CS_TESTBED_REPLY message is used as a response from the peer to some of 
the CS_TESTBED_REQUEST messages.");
+W("Specifics of the response are encoded in the <tt>message type</tt> field.");
+W("Depending on the message type, the testbed-reply message is further 
parametrized by variable-size data.");
+W("Overall, CS_TESTBED_REPLY is very similar to CS_TESTBED_REQUEST, only that 
it is send in the other direction.");
+W("The general format of the CS_TESTBED_REPLY message is:");
+EP();
+
+echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
+include("bittable.inc");
+rowSizeType("size","51");
+rowIntEntryNBO("message type");
+rowIntEntry("(size - 8) bytes of data");
+echo "</table>\n";
+
+BP();
+W("The possible parametrizations are:");
+EP();
+echo "<ul>";
+$messages = ARRAY(0=>"HELO_RESPONSE");
+foreach($messages as $i=>$b)
+  printf("<li><a href=\"#%s\">TESTBED_%s</a></li>",
+         $b, $b);
+echo "</ul>";
+
+ANCHOR("HELO_RESPONSE"); H5("TESTBED_HELO_RESPONSE");
+
+include("html_footer.php3");
 ?>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/protocol_p2p.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p.php3      2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p.php3      2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,47 +1,44 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Peer-to-Peer Protocols";
-$description="GNUnet Documentation: The protocol for inter-node 
communication.";
-include("html_header.php3");
-
-ANCHOR("protocol");H3("GNUnet Protocols: node-to-node");
-BP();
-W("A packet exchanged between GNUnet hosts can contain any number of 
messages.");
-W("The total packet size is limited by the MTU of the transport service that 
is used.");
-W("Packets are assembled from individual messages by the GNUnet core.");
-W("They are padded with noise until they have the size of the MTU of the 
specific transport service used to transmit the message.");
-
-W("The GNUnet core also computes a checksum of the plaintext message and 
encrypts the data with blowfish.");
-W("The transport service only needs to transmit the information.");
-W("The data that the transport service needs to communicate is the sender 
identity, the checksum, the total message size, a flag indicating whether or 
not the message is in plaintext or encrypted, and the packet itself.");
-W("The transport layer implementation is responsible for wrapping the packet 
appropriately.");
-W("Different transports can send message very differently.");
-W("For example, TCP needs to communicate the size explicitly but the sender 
identity is only communicated once (at the time where the connection is 
established).");
-W("UDP on the other hand does not need to explicitly communicate the size 
(datagrams!), but it needs to supply the sender identity each time 
(stateless!).");
-
-W("For received packets, the transport is not responsible for checking the 
checksum.");
-W("If the checksum does not verify the core will discard the message 
silently.");
-P();
-W("Each of the messages in the plaintext packet has the following %s:",
-   extlink_("doxygen/html/structMessagePart.html","header"));
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-row(shortEntry_("message size", NBO_()),
-    shortEntry_("request type", NBO_()));
-echo "</table>\n";
-
-BP();
-W("The header is followed by <tt>message size</tt> octets for the message.");
-W("GNUnet clients are required to skip unknown request types.");
-W("The <tt>message size</tt> field is the size of the message in octets 
including the header.");
-P();
-W("The following groups of peer-to-peer messages are documented:");
-include("protocol_p2p_index.inc");
-EP();
-HR();
-
-include("html_footer.php3");
-?>
-
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Peer-to-Peer Protocols";
+$description="GNUnet Documentation: The protocol for inter-node 
communication.";
+include("html_header.php3");
+
+ANCHOR("protocol");H3("GNUnet Protocols: node-to-node");
+BP();
+W("A packet exchanged between GNUnet hosts can contain any number of 
messages.");
+W("The total packet size is limited by the MTU of the transport service that 
is used.");
+W("Packets are assembled from individual messages by the GNUnet core.");
+W("They are padded with noise until they have the size of the MTU of the 
specific transport service used to transmit the message.");
+
+W("The GNUnet core also computes a checksum of the plaintext message and 
encrypts the data with blowfish.");
+W("The transport service only needs to transmit the information.");
+W("The data that the transport service needs to communicate is the sender 
identity, the checksum, the total message size, a flag indicating whether or 
not the message is in plaintext or encrypted, and the packet itself.");
+W("The transport layer implementation is responsible for wrapping the packet 
appropriately.");
+W("Different transports can send message very differently.");
+W("For example, TCP needs to communicate the size explicitly but the sender 
identity is only communicated once (at the time where the connection is 
established).");
+W("UDP on the other hand does not need to explicitly communicate the size 
(datagrams!), but it needs to supply the sender identity each time 
(stateless!).");
+
+W("For received packets, the transport is not responsible for checking the 
checksum.");
+W("If the checksum does not verify the core will discard the message 
silently.");
+P();
+W("Each of the messages in the plaintext packet has the following header:");
+EP();
+
+LAYOUT("P2P_MESSAGE_HEADER",
+       F(ARRAY(N("message size", NBO_()) => 2,
+              N("request type", NBO_()) => 2,
+              N("(size - 4) bytes of data", "") => 0)));
+
+BP();
+W("The header is followed by <tt>message size</tt> octets for the message.");
+W("GNUnet clients are required to skip unknown request types.");
+W("The <tt>message size</tt> field is the size of the message in octets 
including the header.");
+P();
+W("The following groups of peer-to-peer messages are documented:");
+include("protocol_p2p_index.inc");
+EP();
+
+include("html_footer.php3");
+?>
+

Modified: GNUnet-docs/WWW/test/protocol_p2p_afs.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_afs.php3  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_afs.php3  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,117 +1,117 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet: The AFS Peer-to-Peer Protocol";
-$description="Protocol used between peers for anonymous file sharing.";
-include("html_header.php3");
-
-afslogo();
-ANCHOR("ROUTING");H4("Anonymous Routing: GAP");
-BP();
-W("First, a &quot;correct&quot; implementation of the GAP protocol does not 
have to implement routing exactly as described henceforth.");
-W("The described algorithm is the best we could come up with so far (while 
achieving good anonymity).");
-W("Peers can implement a different algorithm and still be protocol 
compatible.");
-P();
-W("Whenever a peer receives a query, it must make a couple of decisions.");
-W("First, it may decide to just ignore the query.");
-W("This is done if the local load is far too high, if the query is expired or 
if the query has already been processed recently.");
-W("This first question is among the most difficult.");
-W("GAP uses a time-to-live per query, which is a relative, possibly negative 
lifetime in milliseconds.");
-W("From this timestamp GAP computes an absolute time and compares it with its 
(finite) routing table.");
-W("If the query has less time to live than an existing query in the table, it 
is dropped.");
-W("Note that this is only an approximative description (lacking aspects like 
economics, queries with seen replies, multi-queries, and so on), for details 
see the %s.\n",
-  extlink_("doxygen/html/routing_8c.html#a31",
-           "code (routing.c, needsForwarding)"));
-P();
-
-W("Once GAP has decided that a query will be processed, it decides on 
performing a local lookup.");
-W("Potential replies are send back (with a random delay) if the bandwidth 
allocation code permits it.");
-W("The code then decides on forwarding the query (with decremented 
time-to-live) to a subset of the connected peers.");
-W("At most four peers are selected based on a biased random selection.");
-W("The selection is biased based on the recent number of replies received from 
a peer for queries that originated from the same previous peer as the current 
query.");
-W("The exact code can be found %s.",
-  extlink_("doxygen/html/querymanager_8c.html#a21",
-           "here (querymanager.c, forwardQuery)"));
-W("Furthermore, queries are forwarded to other peers if this is possible for 
free.");
-W("Sending queries for free typically happens when the requirement of 
uniform-sized messages leaves enough room for a query (or multiple queries).");
-W("In that case, the bandwidth allocation code polls the %s for possible 
bandwidth-fillers.",
-  extlink_("doxygen/html/querymanager_8c.html#a16",
-          "query management code (querymanager.c, fillInQuery)"));     
-W("The query management then selects suitable recent queries that were so far 
not forwarded to the peer in question.");
-P();
-
-W("If GAP receives a reply, it checks its routing table for a matching 
entry.");
-W("It is possible that there is no corresponding query in the routing table 
(anymore), in which case the reply is dropped (or, given enough space, 
replicated in the local datastore anyway).");
-W("If there is a routing table entry, it is used to evaluate the economic 
importance of the reply, which again may or may not lead to replicating the 
reply in the local datastore.");
-W("Furthermore, the reply is scheduled for delivery to all peers (and local 
client processes) waiting for the response.");
-W("The response is delivered instantly to local clients and with a (random) 
delay to other peers.");
-W("The query stays in the routingtable since there is still a possibility for 
loops routing the query back to the peer.");
-W("Also some queries can yield multiple results.");
-W("In order to handle queries that can yield multiple results, each peer 
remembers which results have already been processed for a given query.");
-P();
-
-W("The philosophy of why this should achieve good anonymity is described in 
the %s.",
-  extlink_("download/aff.ps", "gap paper"));
-W("The rationale behind correlating queries from the same predecessor lies in 
the %s which will yield strong correlations between successive queries from the 
same client.",
-  extlink_("download/ecrs.ps", "content encoding"));
-
-P();
-W("The GAP protocol defines the following messages:");
-echo "<ul>";
-LI(intlink_("#QUERY","P2P_gap_query_MESSAGE"));
-LI(intlink_("#RESULT","GAP_RESULT"));
-echo "</ul>";
-EP();
-
-ANCHOR("QUERY");H4("QUERY");
-BP();
-W("GAP queries consists of several GAP specific fields, a hash which is used 
for routing and for the database lookup, and possibly additional hash codes.");
-W("The semantics of these additional hash codes depend on the query type.");
-W("As far as GAP is concerend, the query type and those additional hash codes 
are merely passed along.");
-W("Peers that receive a GAP QUERY can respond with one or more GAP REPLY 
messages.");
-W("The GAP protocol uses the ECRS-core to verify that a response matches a 
query.");
-W("The details of how replies are verified are discussed in the %s paper.",
-  extlink_("download/ecrs.ps","ECRS"));
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("36+20*n","16");
-rowIntEntryNBO("type");
-rowIntEntryNBO("priority");
-rowIntEntryNBO("time-to-live");
-fiveRowIntEntries("return to");
-fiveRowIntEntries("query [n &gt; 1]");
-echo "</table>\n";
-
-BP();
-W("The priority is used to determine the value of the query.");
-W("Queries with lower priorities are more likely to be dropped.");
-W("For details see the paper on the %s for GNUnet.",
-  extlink_("download/ebe.ps", "economic model"));
-W("The time-to-live determines how long the peer is going to route replies.");
-W("Replies are transmitted to the peer that is specified in the <tt>return 
to</tt> field.");
-W("For details see the %s paper.",
-  extlink_("download/gap.ps", "GAP"));
-W("The type field and all hash codes after the first query are only passed 
along and used by the %s.",
-  extlink_("download/ecrs.ps", "ECRS encoding"));
-
-EP();
-ANCHOR("RESULT");H4("RESULT");
-BP();
-W("A GAP RESULT message is a reply of a GNUnet node to a %s that was used to 
request a specific block of a file.",
-  extlink_("#QUERY","QUERY"));
-W("The GAP RESULT message contains the type and first hash code from the 
respective QUERY.");
-W("Note that the type is necessary since the QUERY may specify <em>any</em> 
for the type.");
-W("The data portion of the result depends on the query type and is again 
defined by ECRS.");
-W("See also the %s and the %s for the way data is transmitted in GNUnet.",
-  ARRAY(extlink_("download/esed.ps","GNUnet encoding paper"),
-       extlink_("encoding.php3","encoding page")));
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("28+N","17");
-rowIntEntry("N bytes content");
-echo "</table>\n";
-
-include("html_footer.php3");
-?>
\ No newline at end of file
+<?php
+include("scripts.php3");
+$title = "GNUnet: The GAP Peer-to-Peer Protocol";
+$description="The protocol used between GNUnet peers for anonymous 
file-sharing.";
+include("html_header.php3");
+
+afslogo();
+ANCHOR("ROUTING");H4("Anonymous Routing: GAP");
+BP();
+W("First, a &quot;correct&quot; implementation of the GAP protocol does not 
have to implement routing exactly as described henceforth.");
+W("The described algorithm is the best we could come up with so far (while 
achieving good anonymity).");
+W("Peers can implement a different algorithm and still be protocol 
compatible.");
+P();
+W("Whenever a peer receives a query, it makes a couple of decisions.");
+W("The peer first decides whether to just ignore the query.");
+W("This is done if the local load is far too high, if the query is expired or 
if the query has already been processed recently.");
+W("This first question is among the most difficult.");
+W("GAP uses a time-to-live per query, which is a relative, possibly negative 
lifetime in milliseconds.");
+W("From this timestamp GAP computes an absolute time and compares it with its 
(finite) routing table.");
+W("If the query has less time to live than an existing query in the table, it 
is dropped.");
+W("Note that this is only an approximative description (lacking aspects like 
economics, queries with seen replies, multi-queries, and so on), for details 
see the %s.\n",
+  extlink_("doxygen/html/routing_8c.html#a31",
+           "code (routing.c, needsForwarding)"));
+P();
+
+W("Once GAP has decided that a query will be processed, it performs a local 
lookup.");
+W("Potential replies are sent back (with a random delay) if the bandwidth 
allocation code permits it.");
+W("The code then decides on forwarding the query (with decremented 
time-to-live) to a subset of the connected peers.");
+W("At most four peers are selected based on a biased random selection.");
+W("The selection is biased towards peers that have recently replied to other 
queries that had the same predecessor as the current query.");
+W("The exact code can be found %s.",
+  extlink_("doxygen/html/querymanager_8c.html#a21",
+           "here (querymanager.c, forwardQuery)"));
+W("Furthermore, queries may be forwarded to other peers if this is possible 
for free.");
+W("Sending queries for free typically happens when assembling a (uniform size) 
message has sufficient unused room for a query.");
+W("In that case, the bandwidth allocation code polls the %s for possible 
bandwidth-fillers.",
+  extlink_("doxygen/html/querymanager_8c.html#a16",
+          "query management code (querymanager.c, fillInQuery)"));     
+W("The query management system then selects suitable recent queries that have 
so far not been given to the peer in question.");
+P();
+
+W("If GAP receives a reply, it checks its routing table for a matching 
entry.");
+W("It is possible that there is no corresponding query in the routing table 
(anymore), in which case the reply is dropped (or, given enough space, 
replicated in the local datastore anyway).");
+W("If there is a routing table entry, it is used to evaluate the economic 
importance of the reply, which again may or may not lead to replicating the 
reply in the local datastore.");
+W("Furthermore, the reply is scheduled for delivery to all peers (and local 
client processes) waiting for the response.");
+W("The response is delivered instantly to local clients and with a (random) 
delay to other peers.");
+W("The query stays in the routingtable since there is still a possibility for 
loops routing the query back to the peer.");
+W("Also some queries can yield multiple results.");
+W("In order to handle queries that can yield multiple results, each peer 
remembers which results have already been processed for a given query.");
+P();
+
+W("The philosophy of why this should achieve good anonymity is described in 
the %s.",
+  extlink_("download/aff.ps", "GAP paper"));
+W("The rationale behind correlating queries from the same predecessor lies in 
the %s which will yield correlations between successive queries from the same 
client.",
+  extlink_("download/ecrs.ps", "encoding scheme"));
+
+P();
+W("The GAP protocol defines the following messages:");
+echo "<ul>\n";
+LILI("#QUERY","P2P_gap_query_MESSAGE");
+LILI("#RESULT","GAP_RESULT");
+echo "</ul>\n";
+EP();
+
+ANCHOR("QUERY");H4("QUERY");
+BP();
+W("GAP queries consists of several GAP specific fields, a hash which is used 
for routing and for the database lookup, and possibly additional hash codes.");
+W("The semantics of these additional hash codes depend on the query type.");
+W("As far as GAP is concerend, the query type and those additional hash codes 
are merely passed along.");
+W("Peers that receive a GAP QUERY can respond with one or more GAP REPLY 
messages.");
+W("The GAP protocol uses the ECRS-core to verify that a response matches a 
query.");
+W("The details of how replies are verified are discussed in the %s paper.",
+  extlink_("download/ecrs.ps","ECRS"));
+EP();
+
+LAYOUT("P2P_gap_query_MESSAGE",
+       F(ARRAY(N("message size", NBO_()) => 2,
+               V("request type", 16, NBO_()) => 2,
+               N("ECRS block type", NBO_()) => 4,
+               N("priority", NBO_()) => 4,
+               N("time-to-live", NBO_()) => 4,
+               N("return-to peer identity", NBO_()) => 64,
+               N("query hash", NBO_()) => 64,
+               N("namespace (optional, depending on block type)", NBO_()) => 
64)));
+BP();
+W("The priority is used to determine the value of the query.");
+W("Queries with lower priorities are more likely to be dropped.");
+W("For details see the paper on the %s for GNUnet.",
+  extlink_("download/ebe.ps", "economic model"));
+W("The time-to-live determines how long the peer is going to route replies.");
+W("Replies are transmitted to the peer that is specified in the <tt>return 
to</tt> field.");
+W("For details see the %s paper.",
+  extlink_("download/gap.ps", "GAP"));
+W("The type field and all hash codes after the first query are only passed 
along and used by the %s.",
+  extlink_("download/ecrs.ps", "ECRS encoding"));
+W("The current protocol uses at most one additional hash code for the 
namespace, but the GAP code should allow for any number of additional hash 
codes to be passed around.");
+
+EP();
+ANCHOR("RESULT");H4("RESULT");
+BP();
+W("A GAP RESULT message is a reply of a GNUnet node to a %s that was used to 
request a specific block of a file.",
+  extlink_("#QUERY","QUERY"));
+W("The GAP RESULT message contains the first hash code from the respective 
QUERY (also called the primary key).");
+W("Note that the type is encoded by ECRS in the data portion.");
+W("The size of the data portion of the result depends on the query type and is 
again defined by ECRS.");
+W("See also the %s and the %s for the way data is transmitted in GNUnet.",
+  ARRAY(extlink_("download/esed.ps","GNUnet encoding paper"),
+       extlink_("encoding.php3","encoding page")));
+EP();
+LAYOUT("P2P_gap_reply_MESSAGE",
+       F(ARRAY(N("message size", NBO_()) => 2,
+               V("request type", 17, NBO_()) => 2,
+               N("primary key", NBO_()) => 64,
+               N("ECRS-encoded data", NBO_()) => 0)));
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_p2p_core.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_core.php3 2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_core.php3 2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,277 +1,268 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Peer-to-Peer Protocols";
-$description="GNUnet Documentation - The core protocol";
-include("html_header.php3");
-
-ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: core messages");
-BP();
-W("The GNUnet node-to-node (peer-to-peer) procotol currently defines seven 
different messages that must be supported by all peers:");
-EP();
-echo "<ul>\n";
-LIV(extlink_("#HELO","HELO"));
-LIV(extlink_("#SKEY","SKEY"));
-LIV(extlink_("#PING","PING"));
-LIV(extlink_("#PONG","PONG"));
-LIV(extlink_("#HANGUP","HANGUP"));
-LIV(extlink_("#FRAGMENT","FRAGMENT"));
-LIV(extlink_("#NOISE","NOISE"));
-echo "</ul>\n";
-BP();
-W("The most basic sequence is that a host sends a %s to any other host to 
notify it of its existance on the network.",
-  extlink_("#HELO","HELO"));
-W("The recipient of the HELO sends back a %s to confirm that the host is 
actually reachable.",
-  extlink_("#PING","PING"));
-W("The receiver of the PING always sends back a %s to confirm receit.",
-  extlink_("#PONG","PONG"));
-P();
-W("Later, either of the hosts sends the other host an %s message with an 
encrypted %s to initiate a connection.",
-  ARRAY(extlink_("#SKEY","SKEY"),
-        extlink_("#PING", "PING")));
-W("The receiver acknowledges this with another SKEY, which also contains a new 
PING and a %s that corresponds to the PING that was received earlier.",
-  extlink_("#PONG","PONG"));
-W("Again, the PING is answered with an encrypted %s.",
-  extlink_("#PONG","PONG"));
-W("If no PONG is received, either side can send another SKEY and PING.");
-W("If an SKEY is repeated after a short period of time, the secret key should 
not be changed.");
-W("This sequence is pretty much equivalent to the initial three-way handshake 
in TCP.");
-P();
-W("The following diagram illustrates a possible sequence of messages:");
-
-IMG("states.png",
-    "Illustration of a message exchange in GNUnet",
-    "CENTER",
-    444,
-    571);
-
-P();
-W("Nodes then exchange application specific mesages.");
-W("%s must be used to make packets look uniform in size.",
-  extlink_("#NOISE","NOISE"));
-W("The MTU is determined by the transport layer and advertised in the HELO 
message.");
-W("%s can be used by any of the nodes to drop the connection.",
-  extlink_("#HANGUP","HANGUP"));
-W("A connection that is inactive for a long time (about 15 minutes) is also 
considered dropped.");
-W("The %s is neither acknowledged nor required, but implemented by all 
well-behaved nodes.",
-  extlink_("#HANGUP","HANGUP"));
-P();
-W("A packet exchanged between GNUnet hosts can contain any number of messages 
(only limited by the MTU of the transport layer).");
-P();
-
-W("In addition to the message itself, the transport mechanism must communicate 
the identity of the sender.");
-W("The transport layer implementation is responsible for encapsulating the 
message appropriately.");
-W("Depending on the implementation of the transport mechanism, the sender 
identity may not be transmitted for each message.");
-W("For example, a stateful transport such as TCP may only transmit the sender 
identity once at the beginning of the exchange.");
-P();
-W("In addition to encrypting the message, the GNUnet core also extends each 
message with additional information.");
-W("The GNUnet core adds a checksum, information about bandwidth limitations 
and sequencing information to prevent processing messages twice.");
-W("The encryption, decryption and verification is done by the GNUnet core and 
neither the application nor the transport code need to worry about it.");
-W("The format of the header that is added by the GNUnet core to each message 
is the following:");
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-fiveRowIntEntries("hash of the plaintext (RipeMD160)");
-rowIntEntryNBO("sequence number, 0 for plaintext");
-rowIntEntryNBO("timestamp (seconds), 0 for plaintext");
-rowIntEntryNBO("desired bandwidth (bytes per minute), 0 for plaintext");
-echo "</table>\n";
-P();
-W("This header is followed by individual messages.");
-W("Note again that the identity of the sender must also be communicated, but 
how this is done depends on the specific transport.");
-
-EP();
-ANCHOR("HELO");H4("HELO");
-
-BP();
-W("A HELO packet is used to propagate information about participating nodes 
throughout GNUnet.");
-W("Each GNUnet node is identified by its public key K.");
-W("Throughout GNUnet, the public key of a node is often abbreviated by just 
the hash of K, short H(K).");
-P();
-W("The HELO packet is the way nodes propagate public keys of other nodes.");
-W("Furthermore, the identity of the node is <strong>bound</strong> to an 
address.");
-W("How an address is specified depends on the underlying transport mechanism 
that is used.");
-W("For example, the UDP service uses the IP and the UDP port.");
-W("An SMTP transport implementation may choose to use an E-mail address.");
-W("GNUnet nodes can have multiple addresses and change addresses at any time, 
e.g. if the IP is dynamically assigned, like in DHCP or on dialup.");
-W("The %s is used to notify other hosts of a changed address.",
-  extlink_("doxygen/html/structHELO__Message.html","HELO message"));
-P();
-W("<strong>Security considerations</strong>.");
-W("Malicious nodes could disrupt GNUnet by telling nodes fake addresses.");
-W("As nodes forward HELOs from other nodes, malicious hosts could replace the 
address of the original node by an invalid address.");
-W("In order to prevent this, the address portion of a HELO must be signed with 
the private key of the node.");
-W("In order to prevent malicious hosts from forwarding outdated addresses, the 
signed portion of a HELO also contains a timestamp stating how long the HELO is 
going to be valid.");
-W("The administrator of each node can specify how long the HELOs signed by 
that node are going to be valid; the administrator is in the best position to 
judge how long the current address will be valid.");
-P();
-W("Another security concern is where hosts send out valid, signed HELO 
messages with IPs of non-participating machines.");
-W("The goal of this attack could either be to flood the non-participating 
hosts with traffic (trick GNUnet into performing an attack) or to make it hard 
for the receiver to find a valid GNUnet host in the ocean of addresses that it 
learned from the HELOs.");
-W("GNUnet defends against this type of attack by sending a PING to the 
acclaimed host and only believes the HELO of a PONG is received.");
-W("Thus the malicious host sending fake HELOs will fail to trick GNUnet into 
repeatedly trying to connect to the non-participating host.");
-
-P();
-W("Receivers of HELOs must verify the signature and check that the HELO has 
not expired.");
-W("Nodes should delete HELOs that have expired for a long time.");
-W("HELOs that expired just a short time ago may belong to nodes that may 
re-appear.");
-W("GNUnet nodes may still keep trying to connect to these nodes, but their 
HELOs should no longer be propagated.");
-W("HELOs can be send to hosts without an established encrypted connection (in 
plaintext).");
-W("This is necessary because HELOs and %ss are needed to form the encrypted 
channel in the first place.",
-  EXTLINK_("#SKEY","SKEY"));
-W("Once an encrypted channel was formed, nodes can exchange HELOs via that 
channel.");
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("556 + " . W_("sender address size"),"0");
-rowIntEntryVerbatim(extlink_("doxygen/html/structSignature.html",
-                             "RSA signature (256 octets)"));
-row(shortEntryVerbatim_(extlink_("doxygen/html/structPublicKey.html","Public 
Key") .
-                       " " . W_("length of N + E + 2 (256+2+2 = 260)") . 
NBO_()),
-    shortEntryVerbatim_(W_("Public Key, length of N (256)") . NBO_()));
-rowIntEntry("Public Key, N (256 octets)");
-row(shortEntry_("Public Key, E"),
-    shortEntry_("padding (must be 0)"));
-fiveRowIntEntries("sender identity");
-rowIntEntryNBO("expiration time");
-rowIntEntryNBO("MTU");
-row(shortEntry_("sender address size (octets)", NBO_()),
-    shortEntry_("transport protocol number", NBO_()));
-rowIntEntryNBO("sender address (sender address size bytes)");
-echo "</table>\n";
-EP();
-
-ANCHOR("SKEY");H4("SKEY");
-BP();
-W("Sessionkeys are 128 bit keys for blowfish, a symmetric cipher that is used 
for all communication between GNUnet nodes except %ss and SKEYs themselves (for 
those, RSA with 2048 bit keys is used).",
-  extlink_("#HELO","HELO"));
-P();
-W("A session between two GNUnet nodes is the existance of a pair of 
sessionkeys between the two nodes that have been confirmed by receiving an 
encrypted PONG response to an encrypted PING challenge.");
-W("Even if the underlying protocol may be connectionless, the notion of a 
session is still meaningful for GNUnet.");
-P();
-W("A session key exchange may be initiated by either node.");
-W("SKEYS are always encrypted with the public key of the receiving node.");
-W("The sender of a session key not only encrypts the key with the public key 
of the receiver but also signs it (together with an creation time) with its own 
private key.");
-W("The transmitted key is the key that the sender will use in the future.");
-W("An SKEY always contains an encrypted PING message.");
-W("An SKEY may furthermore contain an encrypted PONG message, in particular if 
the SKEY is transmitted in response to an SKEY+PING message.");
-W("The encrypted portion is part of the SKEY message since the overall message 
is still in plaintext.");
-W("While the symmetric key is encrypted and signed using RSA, the PING (and 
PONG) are encrypted with the symmetric cipher.");
-W("SKEY messages are usually not send through an encrypted channel.");
-W("If nodes that already have an SKEY pair decide to exchange a fresh 
sessionkey, that key may be send via the encrypted channel.");
-W("However, even in that case, the key must also be encrypted with the public 
key of the receiving node.");
-P();
-
-W("The sender must remember the sessionkey and can start using it after 
receiving an acknowledgement in the form of a %s from the receiver.",
-  extlink_("#PONG","PONG"));
-W("The PONG must be encrypted and can be transmitted either as part of the 
symmetrically encrpyted portion of another SKEY or as an ordinary encrypted 
message.");
-P();
-W("The format of an %s is the following:",
-  extlink_("doxygen/html/structSKEY__Message.html","SKEY message"));
-P();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("520+N","1");
-rowIntEntryNBO("creation time (not expiration!)");
-rowIntEntry("RSA Encrypted data (256 octets)");
-rowIntEntry("Signature (256 octets)");
-rowIntEntry("N bytes symmetrically encrypted PING (and possibly PONG)");
-echo "</table>\n";
-W("Note that N is always either 28 or 56 bytes.");
-
-EP();
-
-ANCHOR("PING");H4("PING");
-BP();
-W("PINGs are used to test if a node receives messages correctly.");
-W("PINGs are exchanged in encrypted messages, as part of SKEYs and in 
plaintext.");
-W("The receit of a PING must be answered by a PONG with identical body (the 
receiver just changes the type).");
-W("An encrypted PING must be answered by an encrypted PONG.");
-W("It does not matter if the encrypted PONG is encrypted as part of an SKEY or 
part of an ordinary encrypted message.");
-W("The challenge number in a PING is a random number that is used to make it 
impractical for an adversary to guess the contents of the PING and thus hard to 
fake a PONG response.");
-P();
-W("The identity stored in the PING is the identity of the receiver.");
-W("If that identity does not match, the PING must be silently discarded.");
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("28","2");
-fiveRowIntEntries("receiver identity");
-rowIntEntryNBO("challenge");
-echo "</table>\n";
-EP();
-
-ANCHOR("PONG");H4("PONG");
-BP();
-W("PONGs are responses to PINGs.");
-W("If the node is not aware of a corresponding PING (or if the challenge is 
wrong), the PONG is silently dropped.");
-W("Otherwise the appropriate action corresponding to the PING is triggered.");
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("28","3");
-fiveRowIntEntries("receiver identity");
-rowIntEntryNBO("challenge");
-echo "</table>\n";
-EP();
-
-
-ANCHOR("HANGUP");H4("HANGUP");
-BP();
-W("The format of the HANGUP message is:");
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("24","4");
-fiveRowIntEntries("sender identity");
-echo "</table>\n";
-
-BP();
-W("When a HANGUP message is received, the node must stop using the current 
sessionkey (assuming the receiver is the other node involved in the 
corresponding session with the sender).");
-W("If the receiving node desires further communication with the sender, a new 
sessionkey must be exchanged.");
-EP();
-
-
-ANCHOR("FRAGMENT");H4("FRAGMENT");
-BP();
-W("Fragments are used to communicate messages that are larger than the MTU of 
the transport.");
-W("The peer sending fragments should make sure to transmit all fragments in 
sequence.");
-W("No peer is expected to reassemble multiple fragments for the same sender at 
any time.");
-W("If the receiving peer does not receive all parts of a fragment, the entire 
message has to be discarded.");
-W("The messages constructed from fragments cannot be larger than 64k.");
-W("The format for fragments is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("12 + N","5");
-rowIntEntryNBO("fragment id");
-row(shortEntry_("offset"),
-    shortEntry_("total size"));
-rowIntEntry("N bytes of data");
-echo "</table>\n";
-BP();
-W("The N bytes of data from the fragment belong to a larger message of the 
given total size and are to be placed at the given offset.");
-W("Unlike IP fragmentation, GNUnet fragments should never be overlapping.");
-EP();
-
-
-
-ANCHOR("NOISE");H4("NOISE");
-BP();
-W("Noise is used to make it harder for adversaries to perform traffic 
analysis.");
-W("A node receiving noise should just silently ignore it.");
-W("Nodes may append noise to packets that are short to make all packets look 
more uniform in size.");
-W("Noise should only be used in encrypted traffic.");
-W("The format for noise is:");
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("&ge; 4","6");
-rowIntEntry("noise");
-echo "</table>\n";
-
-BP();
-W("The number of bytes of noise should be a multiple of 4 to preserve 
alignment.");
-W("The noise in the packet should be (pseudo) random.");
-
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Peer-to-Peer Protocols";
+$description="The core protocol, the fundamental messages underlying all 
GNUnet applications";
+include("html_header.php3");
+
+ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: core messages");
+BP();
+W("The GNUnet node-to-node (peer-to-peer) procotol currently defines seven 
different messages that must be supported by all peers:");
+EP();
+echo "<ul>\n";
+LIV(extlink_("#HELLO","HELLO"));
+LIV(extlink_("#SETKEY","SETKEY"));
+LIV(extlink_("#PING","PING"));
+LIV(extlink_("#PONG","PONG"));
+LIV(extlink_("#HANGUP","HANGUP"));
+LIV(extlink_("#FRAGMENT","FRAGMENT"));
+LIV(extlink_("#NOISE","NOISE"));
+echo "</ul>\n";
+BP();
+W("These messages are typically not all implemented directly by the core 
itself, but rather by internal service plugins.");
+W("However, loading these plugins is not optional (the core will automatically 
do so on startup).");
+W("Thus it makes sense to refer to these messages as the core messages.");
+P();
+W("The most basic sequence is that a host sends a %s to any other host to 
notify it of its existance on the network.",
+  extlink_("#HELLO","HELLO"));
+W("The recipient of the HELLO sends back a %s to confirm that the host is 
actually reachable.",
+  extlink_("#PING","PING"));
+W("The receiver of the PING always sends back a %s to confirm receit.",
+  extlink_("#PONG","PONG"));
+P();
+W("Later, either of the hosts sends the other host an %s message with an 
encrypted %s to initiate a connection.",
+  ARRAY(extlink_("#SETKEY","SETKEY"),
+        extlink_("#PING", "PING")));
+W("The receiver acknowledges this with another SETKEY, which also contains a 
new PING and a %s that corresponds to the PING that was received earlier.",
+  extlink_("#PONG","PONG"));
+W("Again, the PING is answered with an encrypted %s.",
+  extlink_("#PONG","PONG"));
+W("If no PONG is received, either side can send another SETKEY and PING.");
+W("If an SETKEY is repeated after a short period of time, the secret key 
should not be changed.");
+W("This sequence is pretty much equivalent to the initial three-way handshake 
in TCP.");
+P();
+W("The following diagram illustrates a possible sequence of messages:");
+
+IMG("states.png",
+    "Illustration of a message exchange in GNUnet",
+    "CENTER",
+    444,
+    571);
+
+P();
+W("Nodes then exchange application specific mesages.");
+W("%s must be used to make packets look uniform in size.",
+  extlink_("#NOISE","NOISE"));
+W("The MTU is determined by the transport layer and advertised in the HELLO 
message.");
+W("%s can be used by any of the nodes to drop the connection.",
+  extlink_("#HANGUP","HANGUP"));
+W("A connection that is inactive for a long time (about 15 minutes) is also 
considered dropped.");
+W("The %s is neither acknowledged nor required, but implemented by all 
well-behaved nodes.",
+  extlink_("#HANGUP","HANGUP"));
+P();
+W("A packet exchanged between GNUnet hosts can contain any number of messages 
(only limited by the MTU of the transport layer).");
+P();
+
+W("In addition to encrypting the message, the GNUnet core also extends each 
message with additional information.");
+W("The GNUnet core adds a checksum, information about bandwidth limitations 
and sequencing information to prevent processing messages twice.");
+W("The encryption, decryption and verification is done by the GNUnet core and 
neither the application nor the transport code need to worry about it.");
+W("The format of the header that is added by the GNUnet core to each message 
is the following:");
+EP();
+LAYOUT("P2P_PACKET_HEADER",
+       F(ARRAY(N("hash of the plaintext (SHA-512)", "") => 64,
+               N("sequence number, 0 for plaintext", 11, NBO_()) => 4,
+               N("timestamp (in seconds)", NBO_()) => 4,
+               N("bandwidth limit (bytes per minute)", NBO_()) => 4)));
+BP();
+W("This header is followed by individual messages.");
+W("Note again that the identity of the sender must also be communicated such 
that the core can select the right key for decryption.");
+W("However, how this is done depends on the specific transport.");
+
+EP();
+ANCHOR("HELLO");H4("HELLO");
+
+BP();
+W("A HELLO packet is used to propagate information about participating nodes 
throughout GNUnet.");
+W("Each GNUnet node is identified by its public key K.");
+W("Throughout GNUnet, the public key of a node is often abbreviated by just 
the hash of K, short H(K).");
+P();
+W("The HELLO packet is the way nodes propagate public keys of other nodes.");
+W("Furthermore, the identity of the node is <strong>bound</strong> to an 
address.");
+W("How an address is specified depends on the underlying transport mechanism 
that is used.");
+W("For example, the UDP service uses the IP and the UDP port.");
+W("An SMTP transport implementation may choose to use an E-mail address.");
+W("GNUnet nodes can have multiple addresses and change addresses at any time, 
e.g. if the IP is dynamically assigned, like in DHCP or on dialup.");
+W("The %s is used to notify other hosts of a changed address.",
+  extlink_("doxygen/html/structHELLO__Message.html","HELLO message"));
+P();
+W("<strong>Security considerations</strong>.");
+W("Malicious nodes could disrupt GNUnet by telling nodes fake addresses.");
+W("As nodes forward HELLOs from other nodes, malicious hosts could replace the 
address of the original node by an invalid address.");
+W("In order to prevent this, the address portion of a HELLO must be signed 
with the private key of the node.");
+W("In order to prevent malicious hosts from forwarding outdated addresses, the 
signed portion of a HELLO also contains a timestamp stating how long the HELLO 
is going to be valid.");
+W("The administrator of each node can specify how long the HELLOs signed by 
that node are going to be valid; the administrator is in the best position to 
judge how long the current address will be valid.");
+P();
+W("Another security concern is where hosts send out valid, signed HELLO 
messages with IPs of non-participating machines.");
+W("The goal of this attack could either be to flood the non-participating 
hosts with traffic (trick GNUnet into performing an attack) or to make it hard 
for the receiver to find a valid GNUnet host in the ocean of addresses that it 
learned from the HELLOs.");
+W("GNUnet defends against this type of attack by sending a PING to the 
acclaimed host and only believes the HELLO of a PONG is received.");
+W("Thus the malicious host sending fake HELLOs will fail to trick GNUnet into 
repeatedly trying to connect to the non-participating host.");
+
+P();
+W("Receivers of HELLOs must verify the signature and check that the HELLO has 
not expired.");
+W("Nodes should delete HELLOs that have expired for a long time.");
+W("HELLOs that expired just a short time ago may belong to nodes that may 
re-appear.");
+W("GNUnet nodes may still keep trying to connect to these nodes, but their 
HELLOs should no longer be propagated.");
+W("HELLOs can be send to hosts without an established encrypted connection (in 
plaintext).");
+W("This is necessary because HELLOs and %ss are needed to form the encrypted 
channel in the first place.",
+  EXTLINK_("#SETKEY","SETKEY"));
+W("Once an encrypted channel was formed, nodes can exchange HELLOs via that 
channel.");
+EP();
+LAYOUT("P2P_hello_MESSAGE",
+       F(ARRAY(N("message size (600 + X)", NBO_()) => 2,
+              V("request type", 0, NBO_()) => 2,
+              N("RSA signature (signing data starting from sender id to end of 
HELLO)","") => 256,
+              V("size of public key (T)", 264, NBO_()) => 2,
+              V("size of n in bytes (N)", 256, NBO_()) => 2,
+              N("n in public RSA key (N bytes)", "") => 256,
+              N("e in public RSA key (T - N bytes)", "") => 2,
+              V("padding", 0, NBO_()) => 2,
+              N("sender id (SHA-512 of data from T to padding)", "") => 64,
+              N("expiration time (in seconds)", NBO_()) => 4,
+              N("MTU of the transport (in bytes)", NBO_()) => 4,
+              N("sender address size (X, in bytes)", NBO_()) => 2,
+              N("transport protocol", NBO_()) => 2,
+              N("sender address", "") => 0)));
+
+
+
+ANCHOR("SETKEY");H4("SETKEY");
+BP();
+W("Sessionkeys are 128 bit keys for blowfish, a symmetric cipher that is used 
for all communication between GNUnet nodes except %ss and SETKEYs themselves 
(for those, RSA with 2048 bit keys is used).",
+  extlink_("#HELLO","HELLO"));
+P();
+W("A session between two GNUnet nodes is the existance of a pair of 
sessionkeys between the two nodes that have been confirmed by receiving an 
encrypted PONG response to an encrypted PING challenge.");
+W("Even if the underlying protocol may be connectionless, the notion of a 
session is still meaningful for GNUnet.");
+P();
+W("A session key exchange may be initiated by either node.");
+W("SETKEYS are always encrypted with the public key of the receiving node.");
+W("The sender of a session key not only encrypts the key with the public key 
of the receiver but also signs it (together with an creation time) with its own 
private key.");
+W("The transmitted key is the key that the sender will use in the future.");
+W("An SETKEY always contains an encrypted PING message.");
+W("An SETKEY may furthermore contain an encrypted PONG message, in particular 
if the SETKEY is transmitted in response to an SETKEY+PING message.");
+W("The encrypted portion is part of the SETKEY message since the overall 
message is still in plaintext.");
+W("While the symmetric key is encrypted and signed using RSA, the PING (and 
PONG) are encrypted with the symmetric cipher.");
+W("SETKEY messages are usually not send through an encrypted channel.");
+W("If nodes that already have an SETKEY pair decide to exchange a fresh 
sessionkey, that key may be send via the encrypted channel.");
+W("However, even in that case, the key must also be encrypted with the public 
key of the receiving node.");
+P();
+
+W("The sender must remember the sessionkey and can start using it after 
receiving an acknowledgement in the form of a %s from the receiver.",
+  extlink_("#PONG","PONG"));
+W("The PONG must be encrypted and can be transmitted either as part of the 
symmetrically encrpyted portion of another SETKEY or as an ordinary encrypted 
message.");
+P();
+W("The format of an SETKEY message is the following:");
+EP();
+LAYOUT("P2P_setkey_MESSAGE",
+       F(ARRAY(N("message size (520 + X)", NBO_()) => 2,
+              V("request type", 1, NBO_()) => 2,
+              N("creation time (seconds)", NBO_()) => 4,
+              N("RSA encrypted data", "") => 256,
+              N("RSA signature", "") => 256,
+              N("AES-512 encrypted PINGs and PONGs", "") => 0)));
+BP();
+W("Note that X is always either 72 or 144 bytes.");
+W("The RSA encrypted data decrypts with the hostkey of the receiver to an 
AES-256 session key.");
+W("Using the RSA signature as the initialization vector, this key can be used 
to decrypt the PINGs and PONGs (if present).");
+W("The sessionkey is also used for all future communication with the peer 
(until HANGUP or timeout).");
+W("If PINGs are transmitted, the peer should respond by sending an encrypted 
PONG.");
+W("If the peer has not yet transmitted a session key, the PONG can be included 
in another SETKEY message that is transmitted in response.");
+W("If a PONG is included, this should be verified and if it matches a prior 
PING used as confirmation that the other peer has received an earlier 
sessionkey.");
+EP();
+
+ANCHOR("PING");H4("PING");
+BP();
+W("PINGs are used to test if a node receives messages correctly.");
+W("PINGs are exchanged in encrypted messages, as part of SETKEYs and in 
plaintext.");
+W("The receit of a PING must be answered by a PONG with identical body (the 
receiver just changes the type).");
+W("An encrypted PING must be answered by an encrypted PONG.");
+W("It does not matter if the encrypted PONG is encrypted as part of an SETKEY 
or part of an ordinary encrypted message.");
+W("The challenge number in a PING is a random number that is used to make it 
impractical for an adversary to guess the contents of the PING and thus hard to 
fake a PONG response.");
+P();
+W("The identity stored in the PING is the identity of the receiver.");
+W("If that identity does not match, the PING must be silently discarded.");
+EP();
+LAYOUT("P2P_pingpong_MESSAGE",
+       F(ARRAY(V("message size", 72, NBO_()) => 2,
+              V("request type", 2, NBO_()) => 2,
+              N("challenge", NBO_()) => 4,
+              N("Identity of receiver of PING", "") => 64)));
+
+
+ANCHOR("PONG");H4("PONG");
+BP();
+W("PONGs are responses to PINGs.");
+W("If the node is not aware of a corresponding PING (or if the challenge is 
wrong), the PONG is silently dropped.");
+W("Otherwise the appropriate action corresponding to the PING is triggered.");
+EP();
+LAYOUT("P2P_pingpong_MESSAGE",
+       F(ARRAY(V("message size", 72, NBO_()) => 2,
+              V("request type", 3, NBO_()) => 2,
+              N("challenge", NBO_()) => 4,
+              N("Identity of receiver of PING (sender for PONG)", "") => 64)));
+
+
+ANCHOR("HANGUP");H4("HANGUP");
+BP();
+W("When a HANGUP message is received, the node must stop using the current 
sessionkey (assuming the receiver is the other node involved in the 
corresponding session with the sender).");
+W("If the receiving node desires further communication with the sender, a new 
sessionkey must be exchanged.");
+W("The format of the HANGUP message is:");
+LAYOUT("P2P_hangup_MESSAGE",
+       F(ARRAY(V("message size", 68, NBO_()) => 2,
+              V("request type", 4, NBO_()) => 2,
+              N("Identity of sender", "") => 64)));
+
+
+ANCHOR("FRAGMENT");H4("FRAGMENT");
+BP();
+W("Fragments are used to communicate messages that are larger than the MTU of 
the transport.");
+W("The peer sending fragments should make sure to transmit all fragments in 
sequence.");
+W("No peer is expected to reassemble multiple fragments for the same sender at 
any time.");
+W("If the receiving peer does not receive all parts of a fragment, the entire 
message has to be discarded.");
+W("The messages constructed from fragments cannot be larger than 64k.");
+W("The format for fragments is:");
+EP();
+
+LAYOUT("P2P_fragmentation_MESSAGE",
+       F(ARRAY(N("message size (12 + X)", NBO_()) => 2,
+              V("request type", 5, NBO_()) => 2,
+              N("fragment id", NBO_()) => 4,
+              N("offset", NBO_()) => 2,
+              N("total length of fragmented message", NBO_()) => 2,           
+              N("(size - 12) bytes of fragmented message at <tt>offset</tt>", 
"") => 0)));
+BP();
+W("The N bytes of data from the fragment belong to a larger message of the 
given total size and are to be placed at the given offset.");
+W("Unlike IP fragmentation, GNUnet fragments should never be overlapping.");
+EP();
+
+
+
+ANCHOR("NOISE");H4("NOISE");
+BP();
+W("Noise is used to make it harder for adversaries to perform traffic 
analysis.");
+W("A node receiving noise should just silently ignore it.");
+W("Nodes may append noise to packets that are short to make all packets look 
more uniform in size.");
+W("Noise should only be used in encrypted traffic.");
+W("The format for noise is:");
+EP();
+LAYOUT("P2P_MESSAGE_HEADER",
+       F(ARRAY(N("message size", NBO_()) => 2,
+              V("request type", 6, NBO_()) => 2,
+              N("(size - 4) random bytes", "") => 0)));
+
+BP();
+W("The number of bytes of noise should be a multiple of 4 to preserve 
alignment.");
+W("The noise in the packet should be (pseudo) random.");
+
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_p2p_dht.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_dht.php3  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_dht.php3  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,87 +1,87 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Peer-to-Peer Protocols: DHT";
-$description="GNUnet Documentation - The DHT protocol";
-include("html_header.php3");
-
-ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: DHT");
-
-BP();
-W("DHT is a service that can be run by a subset of the GNUnet network.");
-W("In other words, not all GNUnet peers necessarily support this service.");
-W("The DHT service is implemented on top of the %s.",
-  intlink_("protocol_p2p_rpc.php3", "RPC service"));
-W("The DHT service provides an implementation of a distributed hash table.");
-W("It does provide anything that is directly useful to an end-user.");
-W("The DHT service is intended to be used by other GNUnet protocols that need 
this kind of primitive.");
-// link to 'hacking_dht' here (once that part is written).
-
-W("Since the DHT service uses RPC it does not define any new node-to-node 
network messages but rather defines five RPC functions:");
-EP();
-
-echo "<ul>\n";
-LIV(extlink_("#ping","DHT_ping"));
-LIV(extlink_("#findNode","DHT_findNode"));
-LIV(extlink_("#findValue","DHT_findValue"));
-LIV(extlink_("#store","DHT_store"));
-LIV(extlink_("#remove","DHT_remove"));
-echo "</ul>\n";
-
-BP();
-W("GNUnets DHT implementation is based on ideas from %s.",
-  extlink_("http://en.wikipedia.org/wiki/Kademlia";, "Kademlia"));
-W("There are various differences between Kademlia and the implementation in  
GNUnet.");
-W("The primary difference results from the fact that GNUnet extends the 
protocol with subtables.");
-W("Other differences result from adaptations of the original work to GNUnet.");
-W("Finally, the Kademlia paper describes the basic idea behind a protocol 
whereas GNUnet provides a concrete implementation.");
-W("As such GNUnet needs to deal with some of the quirks and specific details 
that the paper does not address.");
-EP();
-
-ANCHOR("ping"); H4("DHT_ping");
-BP();
-W("A <tt>ping</tt> message is used to determine if another peer participates 
in the DHT network and to find out which tables that peer supports.");
-W("The proper response to a <tt>ping</tt> is to send back the list of tables 
for which the responder is storing data for.");
-W("The <tt>ping</tt> request currently uses no arguments.");
-W("The resulting table list is stored in under the name <tt>tables</tt>.");
-EP();
-
-ANCHOR("findNode"); H4("DHT_findNode");
-BP();
-W("The <tt>findNode</tt> requests is used to find peers in the DHT overlay 
that participate in a particular table and that are close to a given key.");
-W("The arguments to <tt>findNode</tt> are the <tt>key</tt> and the specific 
<tt>table</tt> (both in the form of a hash code).");
-W("The response consists of a list of peer identities <tt>peers</tt> which are 
the best matching peers found by the responder for this query.");
-W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
-EP();
-
-ANCHOR("findValue"); H4("DHT_findValue");
-BP();
-W("The <tt>findValue</tt> requests asks the peer to perform a DHT lookup on a 
particular <tt>key</tt> in a particular <tt>table</tt>.");
-W("<tt>findValue</tt> requests are only transmitted to peers that have 
previously indicated that they participate in the given <tt>table</tt>.");
-W("Peers that participate in a table may only send <tt>findValue</tt> requests 
to peers that are closer to the given <tt>key</tt>.");
-W("The <tt>findValue</tt> request also specifies a <tt>timeout</tt> and the 
maximum number of results <tt>maxResults</tt>.");
-W("The RPC returns the result of the lookup operation in fields named 
<tt>data</tt>.");
-W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
-W("Peers that receive a <tt>findValue</tt> request and that do not have the 
data locally may forward the request to other peers that participate in the 
given <tt>table</tt> if those peers have an ID that is closer and if there is a 
good chance to obtain a result before the timeout.");
-EP();
-
-ANCHOR("store"); H4("DHT_store");
-BP();
-W("The <tt>store</tt> requests asks the peer to store a particular 
<tt>value</tt> under a particular <tt>key</tt> in a particular 
<tt>table</tt>.");
-W("<tt>store</tt> requests are only transmitted to peers that have previously 
indicated that they participate in the given <tt>table</tt>.");
-W("Peers that participate in a table may only send <tt>store</tt> requests to 
peers that are closer to the given <tt>key</tt>.");
-W("If the peer stores the data locally it returns its own peer identity.");
-W("If the peer forwards the store message and the storage is confirmed, it 
returns the identity of all peers that confirmed storing the data.");
-W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
-W("Peers that receive a <tt>store</tt> request and that do not have the 
capacity to store the data locally may forward the request to other peers that 
participate in the given <tt>table</tt> if those peers have an ID that is 
closer and if there is a good chance to obtain a confirmation for storing the 
data before the timeout.");
-EP();
-
-ANCHOR("remove"); H4("DHT_remove");
-BP();
-W("The <tt>remove</tt> message works just like the <tt>store</tt> message, 
only that the content is removed.");
-W("If no content is specified with the <tt>remove</tt> message this indicates 
that any kind of content under the given key is to be removed.");
-W("The <tt>remove</tt> operation may not be supported by all tables.");
-
-EP();
-
-include("html_footer.php3");
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Peer-to-Peer Protocols: DHT";
+$description="The distributed hash table (DHT) protocol in GNUnet";
+include("html_header.php3");
+
+ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: DHT");
+
+BP();
+W("DHT is a service that can be run by a subset of the GNUnet network.");
+W("In other words, not all GNUnet peers necessarily support this service.");
+W("The DHT service is implemented on top of the %s.",
+  intlink_("protocol_p2p_rpc.php3", "RPC service"));
+W("The DHT service provides an implementation of a distributed hash table.");
+W("It does provide anything that is directly useful to an end-user.");
+W("The DHT service is intended to be used by other GNUnet protocols that need 
this kind of primitive.");
+// link to 'hacking_dht' here (once that part is written).
+
+W("Since the DHT service uses RPC it does not define any new node-to-node 
network messages but rather defines five RPC functions:");
+EP();
+
+echo "<ul>\n";
+LIV(extlink_("#ping","DHT_ping"));
+LIV(extlink_("#findNode","DHT_findNode"));
+LIV(extlink_("#findValue","DHT_findValue"));
+LIV(extlink_("#store","DHT_store"));
+LIV(extlink_("#remove","DHT_remove"));
+echo "</ul>\n";
+
+BP();
+W("GNUnets DHT implementation is based on ideas from %s.",
+  extlink_("http://en.wikipedia.org/wiki/Kademlia";, "Kademlia"));
+W("There are various differences between Kademlia and the implementation in  
GNUnet.");
+W("The primary difference results from the fact that GNUnet extends the 
protocol with subtables.");
+W("Other differences result from adaptations of the original work to GNUnet.");
+W("Finally, the Kademlia paper describes the basic idea behind a protocol 
whereas GNUnet provides a concrete implementation.");
+W("As such GNUnet needs to deal with some of the quirks and specific details 
that the paper does not address.");
+EP();
+
+ANCHOR("ping"); H4("DHT_ping");
+BP();
+W("A <tt>ping</tt> message is used to determine if another peer participates 
in the DHT network and to find out which tables that peer supports.");
+W("The proper response to a <tt>ping</tt> is to send back the list of tables 
for which the responder is storing data for.");
+W("The <tt>ping</tt> request currently uses no arguments.");
+W("The resulting table list is stored in under the name <tt>tables</tt>.");
+EP();
+
+ANCHOR("findNode"); H4("DHT_findNode");
+BP();
+W("The <tt>findNode</tt> requests is used to find peers in the DHT overlay 
that participate in a particular table and that are close to a given key.");
+W("The arguments to <tt>findNode</tt> are the <tt>key</tt> and the specific 
<tt>table</tt> (both in the form of a hash code).");
+W("The response consists of a list of peer identities <tt>peers</tt> which are 
the best matching peers found by the responder for this query.");
+W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
+EP();
+
+ANCHOR("findValue"); H4("DHT_findValue");
+BP();
+W("The <tt>findValue</tt> requests asks the peer to perform a DHT lookup on a 
particular <tt>key</tt> in a particular <tt>table</tt>.");
+W("<tt>findValue</tt> requests are only transmitted to peers that have 
previously indicated that they participate in the given <tt>table</tt>.");
+W("Peers that participate in a table may only send <tt>findValue</tt> requests 
to peers that are closer to the given <tt>key</tt>.");
+W("The <tt>findValue</tt> request also specifies a <tt>timeout</tt> and the 
maximum number of results <tt>maxResults</tt>.");
+W("The RPC returns the result of the lookup operation in fields named 
<tt>data</tt>.");
+W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
+W("Peers that receive a <tt>findValue</tt> request and that do not have the 
data locally may forward the request to other peers that participate in the 
given <tt>table</tt> if those peers have an ID that is closer and if there is a 
good chance to obtain a result before the timeout.");
+EP();
+
+ANCHOR("store"); H4("DHT_store");
+BP();
+W("The <tt>store</tt> requests asks the peer to store a particular 
<tt>value</tt> under a particular <tt>key</tt> in a particular 
<tt>table</tt>.");
+W("<tt>store</tt> requests are only transmitted to peers that have previously 
indicated that they participate in the given <tt>table</tt>.");
+W("Peers that participate in a table may only send <tt>store</tt> requests to 
peers that are closer to the given <tt>key</tt>.");
+W("If the peer stores the data locally it returns its own peer identity.");
+W("If the peer forwards the store message and the storage is confirmed, it 
returns the identity of all peers that confirmed storing the data.");
+W("Optionally the response may have an entry <tt>list</tt> that lists the 
tables that the responder supports.");
+W("Peers that receive a <tt>store</tt> request and that do not have the 
capacity to store the data locally may forward the request to other peers that 
participate in the given <tt>table</tt> if those peers have an ID that is 
closer and if there is a good chance to obtain a confirmation for storing the 
data before the timeout.");
+EP();
+
+ANCHOR("remove"); H4("DHT_remove");
+BP();
+W("The <tt>remove</tt> message works just like the <tt>store</tt> message, 
only that the content is removed.");
+W("If no content is specified with the <tt>remove</tt> message this indicates 
that any kind of content under the given key is to be removed.");
+W("The <tt>remove</tt> operation may not be supported by all tables.");
+
+EP();
+
+include("html_footer.php3");
 ?>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/protocol_p2p_index.inc
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_index.inc 2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_index.inc 2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,9 +1,9 @@
 <ol>
 <li><?php intlink("protocol_p2p_core.php3","GNUnet core"); ?></li>
-<li><?php intlink("protocol_p2p_afs.php3","AFS"); ?></li>
+<li><?php intlink("protocol_p2p_afs.php3","GAP"); ?></li>
 <li><?php intlink("protocol_p2p_rpc.php3","RPC"); ?></li>
 <li><?php intlink("protocol_p2p_dht.php3","DHT"); ?></li>
 <!-- li><?php intlink("protocol_p2p_chat.php3","Chat"); ?></li -->
 <!-- li><?php intlink("protocol_p2p_tbench.php3","TBench"); ?></li -->
-<li><?php intlink("protocol_p2p_tracekit.php3","TraceKit"); ?></li>
+<!-- li><?php intlink("protocol_p2p_tracekit.php3","TraceKit"); ?></li -->
 </ol>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/protocol_p2p_rpc.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_rpc.php3  2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_rpc.php3  2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,120 +1,105 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Peer-to-Peer Protocols: RPC";
-$description="GNUnet Documentation - The RPC protocol";
-include("html_header.php3");
-
-ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: RPC");
-BP();
-W("RPC is a service that can be run by a subset of the GNUnet network.");
-W("In other words, not all GNUnet peers necessarily support this service.");
-W("A peer that does not support RPC is supposed to ignore RPC requests.");
-W("The RPC service provides reliable hop-by-hop communication.");
-W("It does provide anything that is directly useful to an end-user.");
-W("The RPC service is intended to be used by other GNUnet protocols that need 
this kind of primitive.");
-W("How to use the RPC service is described on the %s page.",
-  intlink_("hacking_rpc.php3", "RPC hacking"));
-W("The GNUnet node-to-node (or peer-to-peer) RPC procotol currently defines 
three messages that must be supported by all peers that use RPC.");
-EP();
-echo "<ul>\n";
-LIV(extlink_("#REQ","REQ"));
-LIV(extlink_("#RES","RES"));
-LIV(extlink_("#ACK","ACK"));
-echo "</ul>\n";
-BP();
-W("The most basic sequence is that a peer sends a %s to any other host to 
request the execution of some function.",
-  extlink_("#REQ","REQ"));
-W("The recipient of the REQ sends back a %s to communicate the successful 
execution and to return some response code.",
-  extlink_("#RES","RES"));
-W("The receiver of the RES always sends back a %s to confirm receit and 
complete the 3-way handshake.",
-  extlink_("#ACK","ACK"));
-P();
-W("If the initiator does not receive a RES, it will typically retry the REQ 
(until timing out).");
-W("Similarly, if the responder does not receive the ACK, it will retry the RES 
(until timing out).");
-W("After receiving the ACK the responder frees all resources associated with 
the REQ.");
-W("Sequence numbers are used to prevent the responder from executing the 
function multiple times.");
-EP();
-ANCHOR("REQ");H4("REQ");
-
-BP();
-W("The %s is used for both REQ and RES messages.",
-  extlink_("doxygen/html/structRPC__Message.html","RPC message"));
-P();
-W("<strong>Security considerations</strong>.");
-W("The RPC module does not provide any access checks on RPC calls.");
-W("While the peer identity of the initiator has been established, there is no 
access control mechanism.");
-W("Clients that register RPC callbacks are supposed to take care of access 
checks themselves.");
-W("The priority communicated in the RPC message is currently unchecked by the 
implementation and only used to reserve bandwidth with the core.");
-W("The fact that the priority is not checked against economic constraints 
allows an attacker to obtain more bandwidth than the common GNUnet model would 
permit.");
-W("Note that the %s service currently suffers from the same &quot;bug&quot;.",
-  intlink_("protocol_p2p_tracekit.php3", "tracekit"));
-W("Future implementations of RPC will likely expose the priority to the RPC 
function.");
-
-W("The format of the REQ message is:");
-EP();
-echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("size","42");
-rowIntEntryNBO("timestamp (unsigned)");
-rowIntEntryNBO("sequence number (unsigned)");
-rowIntEntryNBO("importance of the request (unsigned)");
-row(shortEntry_("Number of arguments (unsigned)", NBO_()),
-    shortEntry_("Length of the function name (unsigned)", NBO_()));
-rowIntEntry("Function name (variable size)");
-rowIntEntry("Arguments (variable size)");
-echo "</table>\n";
-BP();
-W("The format of the arguments is first a zero-terminated parameter name, 
followed by the size of the parameter (as an unsigned int in network byte 
order) followed by the actual argument.");
-W("The helper functions defined in %s should be used to serialize and 
deserialize the arguments.",
-  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
-          "gnunet_rpc_service.h"));
-W("Each peer is expected to use strictly monotonically increasing sequence 
numbers.");
-W("There are currently no provisions to handle the integer overflow at 
2<sup>32</sup>-1.");
-EP();
-
-ANCHOR("RES");H4("RES");
-
-BP();
-W("The %s is used for both REQ and RES messages.",
-  extlink_("doxygen/html/structRPC__Message.html","RPC message"));
-P();
-// W("<strong>Security considerations</strong>.");
-
-W("The format of the RES message is:");
-EP();
-echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("size","43");
-rowIntEntryNBO("timestamp (unsigned)");
-rowIntEntryNBO("sequence number (unsigned)");
-rowIntEntryNBO("importance of the reply (unsigned)");
-row(shortEntry_("Number of return values (unsigned)", NBO_()),
-    shortEntry_("Error code (0 for success)", NBO_()));
-rowIntEntry("Return values (variable size)");
-echo "</table>\n";
-BP();
-W("The number of return values must be 0 if a non-zero error code is 
returned.");
-W("The sequence number must be identical to the number from the REQ message.");
-W("The format of the return values is first a zero-terminated return value 
identifier, followed by the size of the return value (as an unsigned int in 
network byte order) followed by the actual value.");
-W("The helper functions defined in %s should be used to serialize and 
deserialize the return values.",
-  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
-          "gnunet_rpc_service.h"));
-W("Note that GNUnet RPCs can have multiple return values.");
-W("The most common error code returned by the RPC service is to indicate that 
no function under the given name has been registered at this peer.");
-EP();
-
-ANCHOR("ACK");H4("ACK");
-BP();
-W("An %s is purely a notification that a RES was received.",
-  extlink_("doxygen/html/structRPC__ACK__Message.html","ACK message"));
-W("The format of an ACK is the following:");
-echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("8","44");
-rowIntEntryNBO("sequence number (unsigned)");
-echo "</table>\n";
-
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Peer-to-Peer Protocols: RPC";
+$description="Protocol for remote procedure calls in GNUnet";
+include("html_header.php3");
+
+ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: RPC");
+BP();
+W("RPC is a service that can be run by a subset of the GNUnet network.");
+W("In other words, not all GNUnet peers necessarily support this service.");
+W("A peer that does not support RPC is supposed to ignore RPC requests.");
+W("The RPC service provides reliable hop-by-hop communication.");
+W("It does provide anything that is directly useful to an end-user.");
+W("The RPC service is intended to be used by other GNUnet protocols that need 
this kind of primitive.");
+W("How to use the RPC service is described on the %s page.",
+  intlink_("hacking_rpc.php3", "RPC hacking"));
+W("The GNUnet node-to-node (or peer-to-peer) RPC procotol currently defines 
three messages that must be supported by all peers that use RPC.");
+EP();
+echo "<ul>\n";
+LILI("#REQ","REQ");
+LILI("#RES","RES");
+LILI("#ACK","ACK");
+echo "</ul>\n";
+BP();
+W("The most basic sequence is that a peer sends a %s to any other host to 
request the execution of some function.",
+  extlink_("#REQ","REQ"));
+W("The recipient of the REQ sends back a %s to communicate the successful 
execution and to return some response code.",
+  extlink_("#RES","RES"));
+W("The receiver of the RES always sends back a %s to confirm receit and 
complete the 3-way handshake.",
+  extlink_("#ACK","ACK"));
+P();
+W("If the initiator does not receive a RES, it will typically retry the REQ 
(until timing out).");
+W("Similarly, if the responder does not receive the ACK, it will retry the RES 
(until timing out).");
+W("After receiving the ACK the responder frees all resources associated with 
the REQ.");
+W("Sequence numbers are used to prevent the responder from executing the 
function multiple times.");
+EP();
+ANCHOR("REQ");H4("REQ");
+
+BP();
+W("<strong>Security considerations</strong>.");
+W("The RPC module does not provide any access checks on RPC calls.");
+W("While the peer identity of the initiator has been established, there is no 
access control mechanism.");
+W("Clients that register RPC callbacks are supposed to take care of access 
checks themselves.");
+W("The priority communicated in the RPC message is currently unchecked by the 
implementation and only used to reserve bandwidth with the core.");
+W("The fact that the priority is not checked against economic constraints 
allows an attacker to obtain more bandwidth than the common GNUnet model would 
permit.");
+W("Note that the %s service currently suffers from the same &quot;bug&quot;.",
+  intlink_("protocol_p2p_tracekit.php3", "tracekit"));
+W("Future implementations of RPC will likely expose the priority to the RPC 
function.");
+
+W("The format of the REQ message is:");
+EP();
+LAYOUT("P2P_rpc_MESSAGE",
+       F(ARRAY(N("size", NBO_()) => 2,
+               V("type", 42, NBO_()) => 2,
+              N("sequence number", NBO_()) => 4,
+              N("importance", NBO_()) => 4,
+              N("number of arguments", NBO_()) => 2,
+              N("length of the function name", NBO_()) => 2,
+              N("function name", "") => 0,
+              N("arguments (see RPC_paramSerialize)", "") => 0)));
+BP();
+W("The format of the arguments is first a zero-terminated parameter name, 
followed by the size of the parameter (as an <tt>unsigned int</tt> in network 
byte order) followed by the actual argument.");
+W("The helper functions defined in %s should be used to serialize and 
deserialize the arguments.",
+  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
+          "gnunet_rpc_service.h"));
+W("Each peer is expected to use strictly monotonically increasing sequence 
numbers.");
+W("There are currently no provisions to handle the integer overflow at 
2<sup>32</sup>-1.");
+EP();
+
+ANCHOR("RES");H4("RES");
+
+BP();
+W("The format of the RES message is:");
+EP();
+LAYOUT("P2P_rpc_MESSAGE",
+       F(ARRAY(N("size", NBO_()) => 2,
+               V("type", 43, NBO_()) => 2,
+              N("sequence number", NBO_()) => 4,
+              N("importance of the reply", NBO_()) => 4,
+              N("number of return values", NBO_()) => 2,
+              N("error code (0 for success)", NBO_()) => 2,
+              N("return values (see RPC_paramDeserialize)", "") => 0)));
+BP();
+W("The number of return values must be 0 if a non-zero error code is 
returned.");
+W("The sequence number must be identical to the number from the REQ message.");
+W("The format of the return values is first a zero-terminated return value 
identifier, followed by the size of the return value (as an unsigned int in 
network byte order) followed by the actual value.");
+W("The helper functions defined in %s should be used to serialize and 
deserialize the return values.",
+  extlink_("doxygen/html/gnunet__rpc__service_8h.html",
+          "gnunet_rpc_service.h"));
+W("Note that GNUnet RPCs can have multiple return values.");
+W("The most common error code returned by the RPC service is to indicate that 
no function under the given name has been registered at this peer.");
+EP();
+
+ANCHOR("ACK");H4("ACK");
+BP();
+W("An ACK is purely a notification that a RES was received.");
+W("The format of an ACK is the following:");
+EP();
+LAYOUT("RPC_ACK_Message",
+       F(ARRAY(V("size", 8, NBO_()) => 2,
+               V("type", 44, NBO_()) => 2,
+              N("sequence number", NBO_()) => 4)));
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_p2p_tracekit.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_p2p_tracekit.php3     2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/protocol_p2p_tracekit.php3     2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,73 +1,73 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Peer-to-Peer Protocols: Trace";
-$description="GNUnet Documentation - The Trace protocol";
-include("html_header.php3");
-
-ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: Trace");
-
-BP();
-W("The <tt>tracekit</tt> module provides a protocol that allows tracing the 
GNUnet topology.");
-W("Not all GNUnet peers support this service, in fact peers that are concerned 
about anonymity should probably not support it at all since this protocol 
reveils too much information.");
-W("The primary purpose of <tt>tracekit</tt> is to help the GNUnet developers 
in investigating problems.");
-W("The results from <tt>tracekit</tt> are not necessarily accurate.");
-W("Peers may not respond, not respond in time or the responses may be lost.");
-W("The tracekit protocol only defines two messages:");
-echo "<ul>\n";
-LIV(extlink_("#PROBE","PROBE"));
-LIV(extlink_("#REPLY","REPLY"));
-echo "</ul>\n";
-W("The most basic sequence is that a peer sends a %s to any other host to 
request topology information.",
-  extlink_("#PROBE","PROBE"));
-W("The recipient of the PROBE checks if it has seen the probe previously and 
if not forwards it to all other neighbours, sends back a %s and also forwards 
all REPLY messages received from its neighbours.",
-  extlink_("#REPLY","REPLY"));
-EP();
-ANCHOR("PROBE");H4("PROBE");
-
-BP();
-W("The format of the %s is:",
-  extlink_("doxygen/html/structTRACEKIT__p2p__PROBE.html", "PROBE message"));
-echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("40","36");
-rowIntEntryNBO("timestamp (unsigned)");
-rowIntEntryNBO("hops to go (unsigned)");
-rowIntEntryNBO("importance of the request (unsigned)");
-rowIntEntryNBO("internal client ID");
-fiveRowIntEntries("initiator peer identity");
-echo "</table>\n";
-W("If the responder has already seen a PROBE request from the same initiator 
with the same timestamp, the PROBE is discarded.");
-W("The timestamp is used by the responder who has bounded space to keep track 
of requests.");
-W("The responder is expected to discard the oldest request from the tracking 
table.");
-W("Abuse is prevented by having the responder discard requests with a 
timestamp in the future.");
-W("If a PROBE is received with a timestamp that is older than the oldest 
tracked PROBE, the request is discarded.");
-W("If the number of hops to go reaches zero the responder does not forward the 
request.");
-W("Otherwise the responder forwards the request to all neighbours with hops to 
go reduced by one.");
-W("REPLIES received from those neighbours are forwarded back to the previous 
peer that send the PROBE.");
-W("The initiator peer identity cannot be confirmed and is not checked in any 
way.");
-W("The current implementation does not use the economic system to limit the 
importance of requests.");
-EP();
-
-ANCHOR("REPLY");H4("REPLY");
-
-BP();
-W("The format of the %s is:",
-  extlink("doxygen/html/structTRACEKIT__p2p__REPLY.html", "REPLY message"));
-echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowSizeType("size","37");
-fiveRowIntEntries("initiator peer identity");
-fiveRowIntEntries("responder peer identity");
-rowIntEntryNBO("initiator timestamp (unsigned)");
-rowIntEntryNBO("internal client ID");
-rowIntEntry("Connected peers (variable size)");
-echo "</table>\n";
-W("The responder peer identity is the identity of the peer that originally 
constructed this message.");
-W("Peers forwarding REPLY messages are not supposed to modify them in any 
way.");
-W("The internal client ID is copied unchanged from the original request.");
-W("The message contains a variable number of peer IDs for each connected 
peer.");
-W("If a peer has more connected peers than what can be fit into one message, 
it may construct multiple REPLIES.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Peer-to-Peer Protocols: Trace";
+$description="GNUnet Documentation - The Trace protocol";
+include("html_header.php3");
+
+ANCHOR("protocol");H3("GNUnet Protocol: node-to-node: Trace");
+
+BP();
+W("The <tt>tracekit</tt> module provides a protocol that allows tracing the 
GNUnet topology.");
+W("Not all GNUnet peers support this service, in fact peers that are concerned 
about anonymity should probably not support it at all since this protocol 
reveils too much information.");
+W("The primary purpose of <tt>tracekit</tt> is to help the GNUnet developers 
in investigating problems.");
+W("The results from <tt>tracekit</tt> are not necessarily accurate.");
+W("Peers may not respond, not respond in time or the responses may be lost.");
+W("The tracekit protocol only defines two messages:");
+echo "<ul>\n";
+LIV(extlink_("#PROBE","PROBE"));
+LIV(extlink_("#REPLY","REPLY"));
+echo "</ul>\n";
+W("The most basic sequence is that a peer sends a %s to any other host to 
request topology information.",
+  extlink_("#PROBE","PROBE"));
+W("The recipient of the PROBE checks if it has seen the probe previously and 
if not forwards it to all other neighbours, sends back a %s and also forwards 
all REPLY messages received from its neighbours.",
+  extlink_("#REPLY","REPLY"));
+EP();
+ANCHOR("PROBE");H4("PROBE");
+
+BP();
+W("The format of the %s is:",
+  extlink_("doxygen/html/structTRACEKIT__p2p__PROBE.html", "PROBE message"));
+echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
+include("bittable.inc");
+rowSizeType("40","36");
+rowIntEntryNBO("timestamp (unsigned)");
+rowIntEntryNBO("hops to go (unsigned)");
+rowIntEntryNBO("importance of the request (unsigned)");
+rowIntEntryNBO("internal client ID");
+fiveRowIntEntries("initiator peer identity");
+echo "</table>\n";
+W("If the responder has already seen a PROBE request from the same initiator 
with the same timestamp, the PROBE is discarded.");
+W("The timestamp is used by the responder who has bounded space to keep track 
of requests.");
+W("The responder is expected to discard the oldest request from the tracking 
table.");
+W("Abuse is prevented by having the responder discard requests with a 
timestamp in the future.");
+W("If a PROBE is received with a timestamp that is older than the oldest 
tracked PROBE, the request is discarded.");
+W("If the number of hops to go reaches zero the responder does not forward the 
request.");
+W("Otherwise the responder forwards the request to all neighbours with hops to 
go reduced by one.");
+W("REPLIES received from those neighbours are forwarded back to the previous 
peer that send the PROBE.");
+W("The initiator peer identity cannot be confirmed and is not checked in any 
way.");
+W("The current implementation does not use the economic system to limit the 
importance of requests.");
+EP();
+
+ANCHOR("REPLY");H4("REPLY");
+
+BP();
+W("The format of the %s is:",
+  extlink("doxygen/html/structTRACEKIT__p2p__REPLY.html", "REPLY message"));
+echo "<table class="border" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
+include("bittable.inc");
+rowSizeType("size","37");
+fiveRowIntEntries("initiator peer identity");
+fiveRowIntEntries("responder peer identity");
+rowIntEntryNBO("initiator timestamp (unsigned)");
+rowIntEntryNBO("internal client ID");
+rowIntEntry("Connected peers (variable size)");
+echo "</table>\n";
+W("The responder peer identity is the identity of the peer that originally 
constructed this message.");
+W("Peers forwarding REPLY messages are not supposed to modify them in any 
way.");
+W("The internal client ID is copied unchanged from the original request.");
+W("The message contains a variable number of peer IDs for each connected 
peer.");
+W("If a peer has more connected peers than what can be fit into one message, 
it may construct multiple REPLIES.");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_transport.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_transport.php3        2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/protocol_transport.php3        2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,58 +1,53 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: The Protocol of the Transport Services";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-BP();
-W("GNUnet uses a special type of message to bind public keys to their current 
address.");
-W("For the UDP and TCP transport layers, an address is an IP and a port.");
-W("Other transport mechanisms (HTTP, SMTP, etc.) deploy various other forms of 
addresses.");
-W("Note that any node can have multiple addresses for the various transport 
mechanisms.");
-EP();
-
-include("protocol_transport_index.inc");
-
-BP();
-W("The configuration of the SMTP transport layer is described %s",
-  intlink_("smtp.php3","here"));
-
-W("The transport layer has, like the internet protocol (IP), best-effort 
semantics.");
-W("There is no guarantee that a message will be delivered.");
-W("We now describe how you can write your own transport mechanism for the 
GNUnet peer-to-peer framework.");
-
-EP();
-H4("How do I write a new transport mechanism for GNUnet?");
-
-BP();
-W("The best way to start implementing a new transport mechanism is to start 
with existing code that is semantically as close to the new mechanism as 
possible.");
-W("The most important criteria is if the connection is stateful and 
bidirectional (TCP, HTTP) or stateless and unidirectional (UDP, SMTP).");
-W("Since reliability and delays are handled by the applications, these 
criteria are irrelevant for choosing an implementation to evolve from.");
-P();
-
-W("Every new transport mechanism must define an identification number in %s.",
-  extlink_("doxygen/html/ports_8h.html","ports.h"));
-W("Note that this number is used purely internally in GNUnet and does not have 
to correspond to the underlying protocol in any way.");
-W("Of course it can help users to understand which transports <em>25</em>, 
<em>17</em> or <em>6</em> are if these numbers magically match well-known ports 
or IP protocol numbers.");
-P();
-W("For details on the transport API see our %s.",
-  extlink_("download/transport.ps","transport paper"));
-
-
-W("In addition to the message itself, the transport mechanism must 
communicate:");
-EP();
-echo "<ul>\n";
-LI("The sender identity (hash of public key)");
-LI("If the message is in plaintext or encrypted");
-LI("The CRC of the (plaintext) message");
-LI("The size of the message");
-echo "</ul>\n";
-BP();
-W("The transport layer implementation defines an appropriate message format to 
transmit this data.");
-W("The encapsulation format can be different for each transport.");
-W("Depending on the implementation of the transport mechanism, not all of 
these must be transmitted explicitly in each message.");
-W("For example, a stateful transport such as TCP may only transmit the sender 
identity once and use special messages to switch between plaintext and 
encrypted messages.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: The Protocol of the Transport Services";
+$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
+include("html_header.php3");
+
+BP();
+W("GNUnet uses a special type of message to bind public keys to their current 
address.");
+W("For the UDP and TCP transport layers, an address is an IP and a port.");
+W("Other transport mechanisms (HTTP, SMTP, etc.) deploy various other forms of 
addresses.");
+W("Note that any node can have multiple addresses for the various transport 
mechanisms.");
+EP();
+
+include("protocol_transport_index.inc");
+
+BP();
+W("The configuration of the SMTP transport layer is described %s",
+  intlink_("smtp.php3","here"));
+
+W("The transport layer has, like the internet protocol (IP), best-effort 
semantics.");
+W("There is no guarantee that a message will be delivered.");
+W("We now describe how you can write your own transport mechanism for the 
GNUnet peer-to-peer framework.");
+
+EP();
+H4("How do I write a new transport mechanism for GNUnet?");
+
+BP();
+W("The best way to start implementing a new transport mechanism is to start 
with existing code that is semantically as close to the new mechanism as 
possible.");
+W("The most important criteria is if the connection is stateful and 
bidirectional (TCP, HTTP) or stateless and unidirectional (UDP, SMTP).");
+W("Since reliability and delays are handled by the applications, these 
criteria are irrelevant for choosing an implementation to evolve from.");
+P();
+
+W("Every new transport mechanism must define an identification number in %s.",
+  extlink_("doxygen/html/gnunet__protocols_8h.html","gnunet_protocols.h"));
+W("Note that this number is used purely internally in GNUnet and does not have 
to correspond to the underlying protocol in any way.");
+W("Of course it can help users to understand which transports <em>25</em>, 
<em>17</em> or <em>6</em> are if these numbers magically match well-known ports 
or IP protocol numbers.");
+P();
+W("For details on the transport API see our %s.",
+  extlink_("download/transport.ps","transport paper"));
+
+
+W("In addition to the message itself, the transport mechanism must communicate 
the sender identity (hash of public key) and the size of the message.");
+P();
+W("The transport layer implementation defines an appropriate message format to 
transmit this data.");
+W("The encapsulation format can be different for each transport.");
+W("Depending on the implementation of the transport mechanism, it may not be 
necessary to transmit the sender identity or the size explicitly in each 
message.");
+W("For example, a stateful transport such as TCP may only transmit the sender 
identity once and use special messages to switch between plaintext and 
encrypted messages.");
+W("UDP on the other hand must transmit the sender identity each time.");
+W("However, the packet size of UDP makes it unnecessary to explicitly transmit 
the message size.");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_transport_tcp.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_transport_tcp.php3    2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/protocol_transport_tcp.php3    2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,24 +1,33 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet: The TCP transport service";
-$description = "Documentation for the TCP transport service protocol";
-include("html_header.php3");
-
-
-H2("The TCP transport service");
-
-BP();
-W("For the TCP transport service, the sender address has this %s:",
-  extlink_("doxygen/html/structHostAddress.html","format"));
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowIntEntryNBO("IP");
-row(shortEntry_("sender port",
-               NBO_()),
-    shortEntry_("reserved (must be 0)",
-               NBO_()));
-echo "</table>\n";
-
-include("html_footer.php3");
-?>
\ No newline at end of file
+<?php
+include("scripts.php3");
+$title = "GNUnet: The TCP transport service";
+$description = "Documentation for the TCP transport service protocol";
+include("html_header.php3");
+
+H2("The TCP transport service");
+BP();
+W("In each TCP connection, the first data that is transmitted is a welcome 
message that tells the receiver the identity of the remote peer.");
+W("That message has the following format:");
+EP();
+LAYOUT("TCPWelcome",
+       F(ARRAY(V("size", 68, NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 2,
+               N("sender identity", "") => 64)));
+BP();
+W("The individual messages exchanged over TCP then have the format:");
+EP();
+LAYOUT("TCPP2P_PACKET",
+       F(ARRAY(N("size", NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 2,
+               N("data", "") => 0)));
+BP();
+W("Here, <tt>data</tt> is the message as passed down by the GNUnet core.");
+P();
+W("For the TCP transport service, the sender address in the HELO has this 
format:");
+EP();
+LAYOUT("HostAddress",
+       F(ARRAY(N("IP", NBO_()) => 4,
+               N("port", NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 2)));
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/protocol_transport_udp.php3
===================================================================
--- GNUnet-docs/WWW/test/protocol_transport_udp.php3    2006-03-31 17:39:44 UTC 
(rev 2598)
+++ GNUnet-docs/WWW/test/protocol_transport_udp.php3    2006-04-01 11:59:15 UTC 
(rev 2599)
@@ -1,38 +1,26 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet: The UDP transport service";
-$description = "Documentation for the UDP transport service protocol";
-include("html_header.php3");
-
-
-H2("The UDP transport service");
-BP();
-W("The current UDP implementation encapsulates messages in this %s.",
-  extlink_("doxygen/html/structP2P_PACKET.html","format"));
-EP();
-
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-row(shortEntry_("size of the packet",
-               NBO_()),
-    shortEntry_("encrypted (YES=1, NO=0)",
-               NBO_()));
-rowIntEntryNBO("crc");
-fiveRowIntEntries("sender identity");
-rowIntEntry("Messages...");
-echo "</table>\n";
-BP();
-W("For the UDP transport service, the sender address has this %s:",
-  extlink_("doxygen/html/structHostAddress.html","format"));
-EP();
-echo "<table class=\"border\" border=\"0\" cellspacing=\"0\" 
cellpadding=\"0\">\n";
-include("bittable.inc");
-rowIntEntryNBO("IP");
-row(shortEntry_("sender port",
-               NBO_()),
-    shortEntry_("reserved (must be 0)",
-               NBO_()));
-echo "</table>\n";
-
-include("html_footer.php3");
+<?php
+include("scripts.php3");
+$title = "GNUnet: The UDP transport service";
+$description = "Documentation for the UDP transport service protocol";
+include("html_header.php3");
+
+H2("The UDP transport service");
+BP();
+W("The current UDP implementation encapsulates messages in this format:");
+EP();
+LAYOUT("UDPMessage",
+       F(ARRAY(N("message size", NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 2,
+               N("sender ID", NBO_()) => 64)));
+
+BP();
+W("Note that the actual data appears before this struct.");
+P();
+W("For the UDP transport service, the sender address in the HELO has this 
format:");
+EP();
+LAYOUT("HostAddress",
+       F(ARRAY(N("IP", NBO_()) => 4,
+               N("port", NBO_()) => 2,
+               V("reserved", 0, NBO_()) => 2)));
+include("html_footer.php3");
 ?>
\ No newline at end of file

Modified: GNUnet-docs/WWW/test/screenshots.php3
===================================================================
--- GNUnet-docs/WWW/test/screenshots.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/screenshots.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -9,28 +9,28 @@
 W("Besides command line tools, GNUnet provides a graphical user interface: 
%s.", extlink_("gnunetgtk.php3", "gnunet-gtk"));
 W("Here are some screenshots of gnunet-gtk and its features and ports.");
 EP();
-BP();
 IMG("gnunet-gtk-fs-status-winxp.png",
     "gnunet-gtk status page",
     "CENTER",732,544);
+BP();
 W("Overview of all pending and completed filesharing operations (Windows 
XP).");
 EP();
 
 BR();
 
-BP();
 IMG("gnunet-gtk-directory-browser.png",
     "gnunet-gtk download page",
     "CENTER",732,592);
+BP();
 W("Search and download page with thumbnails (Linux, standard GTK theme).");
 EP();
 
 BR();
 
-BP();
 IMG("gnunet-gtk-stats-winxp.png",
     "gnunet-gtk statistics page",
     "CENTER",732,534);
+BP();
 W("Statistics of outgoing network traffic (Windows XP).");
 EP();
 

Modified: GNUnet-docs/WWW/test/scripts.inc
===================================================================
--- GNUnet-docs/WWW/test/scripts.inc    2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/scripts.inc    2006-04-01 11:59:15 UTC (rev 2599)
@@ -17,7 +17,6 @@
            <td class="menu"><?php intlink("index.php","Welcome") ?></td>
            <td class="menu"><?php intlink("mailinglist.php3","Contact"); 
?></td>
            <td class="menu"><?php extlink("https://gnunet.org/drupal/";, 
"Community"); ?></td>
-           <td class="menu"><?php intlink("screenshots.php3","Screenshots"); 
?></td>
            <td class="menu"><?php intlink("faq.php3","FAQ"); ?></td>
            <td class="menu"><?php intlink("download.php3","Download"); ?></td>
            <td class="menu"><?php 
intlink("documentation.php3","Documentation"); ?></td>

Modified: GNUnet-docs/WWW/test/smtp.php3
===================================================================
--- GNUnet-docs/WWW/test/smtp.php3      2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/smtp.php3      2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,220 +1,218 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet: The SMTP Transport";
-$description="GNUnet - an anonymous distributed backup system :-)";
-include("html_header.php3");
-
-H2("The GNUnet SMTP Transport Layer");
-
-BP();
-W("This page describes the new SMTP transport service for GNUnet.");
-W("It also describes the transport layer in more detail and gives some 
benchmarking results.");
-EP();
-echo "<ol>\n";
-LIV(extlink_("#why","Why use SMTP for a peer-to-peer transport?"));
-LIV(extlink_("#how","How does it work?"));
-LIV(extlink_("#cfg","How do I configure my peer?"));
-LIV(extlink_("#tst","How do I test if it works?"));
-LIV(extlink_("#perf","How fast is it?"));
-LIV(extlink_("#doc","Is there any additional documentation?"));
-echo "</ol>\n";
-BP();
-HR();
-EP();
-ANCHOR("why");H3("Why use SMTP for a peer-to-peer transport?");
-BP();
-W("There are many reasons why one would not want to use SMTP:");
-EP();
-echo "<ul>\n";
-LI("SMTP is using more bandwidth than TCP, UDP or HTTP");
-LI("SMTP has a much higher latency.");
-LI("SMTP requires significantly more computation (encoding and decoding time)
-     for the peers.");
-LI("SMTP is significantly more complicated to configure.");
-LI("SMTP may be abused by tricking GNUnet into sending mail to
-     non-participating third parties.");
-echo "</ul>\n";
-BP();
-W("So why would anybody want to use SMTP?");
-EP();
-echo "<ul>\n";
-LI("SMTP can be used to contact peers behind NAT boxes (in virtual private 
networks).");
-LI("SMTP can be used to circumvent policies that limit or prohibit 
peer-to-peer traffic by masking as &quot;legitimate&quot; traffic.");
-LI("SMTP uses E-mail addresses which are independent of a specific IP, which 
can be useful to address peers that use dynamic IP addresses.");
-LI("SMTP can be used to initiate a connection (e.g. initial address exchange) 
and peers can then negotiate the use of a more efficient protocol (e.g. TCP) 
for the actual communication.");
-echo "</ul>\n";
-
-BP();
-W("In summary, SMTP can for example be used to send a message to a peer behind 
a NAT box that has a dynamic IP to tell the peer to establish a TCP connection 
to a peer outside of the private network.");
-W("Even an extraordinary overhead for this first message would be irrelevant 
in this type of situation.");
-EP();
-
-ANCHOR("how");H3("How does it work?");
-
-BP();
-W("When a GNUnet peer needs to send a message to another GNUnet peer that has 
advertised (only) an SMTP transport address, GNUnet base64-encodes the message 
and sends it in an E-mail to the advertised address.");
-W("The advertisement contains a <em>filter</em> which is placed in the E-mail 
header, such that the receiving host can filter the tagged E-mails and forward 
it to the GNUnet peer process.");
-W("The filter can be specified individually by each peer and be changed over 
time.");
-W("This makes it impossible to censor GNUnet E-mail messages by searching for 
a generic filter.");
-EP();
-
-ANCHOR("cfg");H3("How do I configure my peer?");
-
-BP();
-W("First, you need to configure <tt>procmail</tt> to filter your inbound 
E-mail for GNUnet traffic.");
-W("The GNUnet messages must be delivered into a pipe, for example 
<tt>/tmp/gnunet.smtp</tt>.");
-W("You also need to define a <em>filter</em> that is used by procmail to 
detect GNUnet messages.");
-W("You are free to choose whichever filter you like, but you should make sure 
that it does not occur in your other E-mail.");
-W("In our example, we will use <tt>X-mailer: GNUnet</tt>.");
-W("The <tt>~/.procmailrc</tt> configuration file then looks like this:");
-EP();
-
-PRE(":0:\n" .
-    "* ^X-mailer: GNUnet\n" .
-    "/tmp/gnunet.smtp\n" .
-    "# where do you want your other e-mail delivered to\n" .
-    "# (default: /var/spool/mail/$USER)\n" .
-    ":0:\n" .
-    "/var/spool/mail/$USER\n");
-
-BP();
-W("After adding this file, first make sure that your regular E-mail still 
works (e.g. by sending an E-mail to yourself).");
-W("Then edit the GNUnet configuration.");
-W("In the section <tt>SMTP</tt> you need to specify your E-mail address under 
<tt>EMAIL</tt>, your mail server (for outgoing mail) under <tt>SERVER</tt>, 
your hostname under <tt>SENDERHOSTNAME</tt>, the filter (<em>X-mailer: 
GNUnet</em> in the example) under <tt>FILTER</tt> and the name of the pipe 
under <tt>PIPE</tt>.");
-W("The completed section could then look like this:");
-EP();
-
-PRE("EMAIL = address@hidden" .
-    "MTU = 65536\n" .
-    "PORT = 25\n" .
-    "SERVER = mail.gnu.org\n" .
-    "SENDERHOSTNAME = www.gnu.org\n" .
-    "FILTER = \"X-mailer: GNUnet\"\n" .
-    "PIPE = /tmp/gnunet.smtp");
-    
-BP();
-W("Finally, you need to add <tt>smtp</tt> to the list of <tt>TRANSPORTS</tt> 
in the <tt>GNUNETD</tt> section.");
-W("GNUnet peers will use the E-mail address that you specified to contact your 
peer until the advertisement times out.");
-W("Thus, if you are not sure if everything works properly or if you are not 
planning to be online for a long time, you may want to configure this timeout 
to be short, e.g. just one hour.");
-W("For this, set <tt>HELOEXPIRES</tt> to <tt>1</tt> in the <tt>GNUNETD</tt> 
section.");
-P();
-W("This should be it, but you may probably want to %s it first.\n",
-  extlink_("#tst","test"));
-
-ANCHOR("tst");H3("How do I test if it works?");
-
-BP();
-W("Any transport can be subjected to some rudimentary tests using the 
<tt>gnunet-transport-check</tt> tool.");
-W("The tool sends a message to the local node via the transport and checks 
that a valid message is received.");
-W("While this test does not involve other peers and can not check if firewalls 
or other network obstacles prohibit proper operation, this is a great testcase 
for the SMTP transport since it tests pretty much nearly all of the 
functionality.");
-P();
-
-W("<tt>gnunet-transport-check</tt> should only be used without running 
<tt>gnunetd</tt> at the same time.");
-W("By default, <tt>gnunet-transport-check</tt> tests all transports that are 
specified in the configuration file.");
-W("But you can specifically test SMTP by giving the option 
<tt>--transport=smtp</tt>.");
-P();
-
-W("Note that this test always checks if a transport can receive and send.");
-W("While you can configure most transports to only receive or only send 
messages, this test will only work if you have configured the transport to send 
and receive messages.");
-
-EP();
-ANCHOR("perf");H3("How fast is it?");
-
-BP();
-W("We have measured the performance of the UDP, TCP and SMTP transport layer 
directly and when used from an application using the GNUnet core.");
-W("Measureing just the transport layer gives the better view of the actual 
overhead of the protocol, whereas evaluating the transport from the application 
puts the overhead into perspective from a practical point of view.");
-P();
-
-W("The loopback measurements of the SMTP transport were performed on three 
different machines spanning a range of modern SMTP configurations.");
-W("We used a PIII-800 running RedHat 7.3 with the <em>Purdue</em> Computer 
Science configuration which includes filters for spam.");
-W("We also used a Xenon 2 GHZ with a vanilla <em>RedHat</em> 8.0 sendmail 
configuration.");
-W("Furthermore, we used qmail on a PIII-1000 running Sorcerer GNU Linux 
(<em>SGL</em>).");
-W("The numbers for UDP and TCP are provided using the SGL configuration.");
-W("The qmail benchmark uses qmail&rsquo;s internal filtering whereas the 
sendmail benchmarks relies on procmail to filter and deliver the mail.");
-W("We used the transport layer to send a message of b bytes (excluding 
transport protocol headers) directly to the local machine.");
-W("This way, network latency and packet loss on the wire have no impact on the 
timings.");
-W("n messages were sent sequentially over the transport layer, sending message 
i+1 after the i-th message was received.");
-W("All messages were sent over the same connection and the time to establish 
the connection was not taken into account since this overhead is miniscule in 
practice -- as long as a connection is used for a significant number of 
messages.");
-EP();
-
-echo "<center>\n";
-?>
-<table border="0" cellspacing="0" cellpadding="0" width="90%">
-       <tr>
-               <th class="tbl"><?php W("Transport"); ?></th>
-               <th class="tbl">UDP</th>
-               <th class="tbl">TCP</th>
-               <th class="tbl">SMTP (Purdue sendmail)</th>
-               <th class="tbl">SMTP (RH 8.0)</th>
-               <th class="tbl">SMTP (SGL qmail)</th>
-       </tr>
-       <tr>
-               <th class="tbl" stlye="text-align: right;">   11 bytes</th>
-               <td class="tbl" stlye="text-align: right;">31 ms</td>
-               <td class="tbl" stlye="text-align: right;">55 ms</td>
-               <td class="tbl" stlye="text-align: right;"> 781 s     </td>
-               <td class="tbl" stlye="text-align: right;">77 s </td>
-               <td class="tbl" stlye="text-align: right;">24 s </td>
-       </tr>
-       <tr>
-               <th class="tbl" stlye="text-align: right;">  407 bytes</th>
-               <td class="tbl" stlye="text-align: right;">37 ms</td>
-               <td class="tbl" stlye="text-align: right;">62 ms</td>
-               <td class="tbl" stlye="text-align: right;"> 789 s     </td>
-               <td class="tbl" stlye="text-align: right;">78 s </td>
-               <td class="tbl" stlye="text-align: right;">25 s </td>
-       </tr>
-       <tr>
-               <th class="tbl" stlye="text-align: right;">1,221 bytes</th>
-               <td class="tbl" stlye="text-align: right;">46 ms</td>
-               <td class="tbl" stlye="text-align: right;">73 ms</td>
-               <td class="tbl" stlye="text-align: right;"> 804 s     </td>
-               <td class="tbl" stlye="text-align: right;">78 s </td>
-               <td class="tbl" stlye="text-align: right;">25 s </td>
-       </tr>
-</table>
-<?php
-
-echo "</center>\n";
-BP();
-
-W("The benchmarks show that UDP and TCP are, as expected, both significantly 
faster compared with any of the SMTP services.");
-W("Among the SMTP implementations, there can be significant differences 
depending on the SMTP configuration.");
-W("Filtering with an external tool like procmail that needs to re-parse its 
configuration for each mail can be very expensive.");
-W("Applying spam filters can also significantly impact the performance of the 
underlying SMTP implementation.");
-W("The microbenchmark showa that SMTP can be a viable solution for initiating 
peer-to-peer sessions: a couple of seconds to connect to a peer are probably 
not even going to be noticed by users.");
-
-W("The next benchmark measures the possible throughput for a transport.");
-W("Throughput can be measured by sending multiple messages in parallel and 
measureing packet loss.");
-W("Note that not only UDP but also the TCP transport can actually loose 
messages since the TCP implementation drops messages if the <tt>write</tt> to 
the socket would block.");
-W("While the SMTP protocol never drops messages itself, it is often so slow 
that only a fraction of the messages can be sent and received in the given 
time-bounds.");
-W("For this benchmark we report the message loss after allowing t time for 
sending m messages.");
-W("If messages were not sent (or received) after an overall timeout of t, they 
were considered lost.");
-W("The benchmark was performed using two Xeon 2 GHZ machiens running RedHat 
8.0 with sendmail.");
-W("The machines were connected with a direct 100 MBit ethernet connection.");
-
-W("Figures %s, %s and %s show that the throughput for messages of size 1,200 
octects is 2,343 kbps, 3,310 kbps and 6 kbps for UDP, TCP and SMTP 
respectively.",
-  ARRAY(extlink_("udp_1200.png","udp1200"),
-       extlink_("tcp_1200.png","tcp1200"),
-       extlink_("smtp_mtus.png","smtp-MTUs")));
-W("The high per-message overhead of SMTP can be improved by increasing the 
MTU, for example, an MTU of 12,000 octets improves the throughput to 13 kbps as 
figure %s shows.",
-  extlink_("smtp_mtus.png","smtp-MTUs"));
-W("Our research paper (%s, %s) has some more details on the benchmarking 
results.",
-  ARRAY(extlink_("download/transport.ps","A4"),
-       extlink_("download/transport-us.ps","US-letter")));
-
-EP();
-ANCHOR("doc");H3("Is there any additional documentation?");
-
-BP();
-W("Sure.");
-W("We have the %s from our initial proposal, a research paper (%s, %s) that 
also discusses some security aspects of the design, a concluding %s and the 
%s.",
-  ARRAY(extlink_("download/transport-proposal.ps","slides"),
-       extlink_("download/transport.ps","A4"),
-       extlink_("download/transport-us.ps","US-letter"),
-       extlink_("download/transport-presentation.pdf","presentation"),
-       extlink_("man/gnunet-transport-check.1.html","man page for 
gnunet-transport-check")));
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet: The SMTP Transport";
+$description="GNUnet - an anonymous distributed backup system :-)";
+include("html_header.php3");
+
+H2("The GNUnet SMTP Transport Layer");
+
+BP();
+W("This page describes the new SMTP transport service for GNUnet.");
+W("It also describes the transport layer in more detail and gives some 
benchmarking results.");
+W("The performance results presented are quite old and maybe outdated at this 
point.");
+EP();
+echo "<ol>\n";
+LIV(extlink_("#why","Why use SMTP for a peer-to-peer transport?"));
+LIV(extlink_("#how","How does it work?"));
+LIV(extlink_("#cfg","How do I configure my peer?"));
+LIV(extlink_("#tst","How do I test if it works?"));
+LIV(extlink_("#perf","How fast is it?"));
+LIV(extlink_("#doc","Is there any additional documentation?"));
+echo "</ol>\n";
+
+ANCHOR("why");H3("Why use SMTP for a peer-to-peer transport?");
+BP();
+W("There are many reasons why one would not want to use SMTP:");
+EP();
+echo "<ul>\n";
+LI("SMTP is using more bandwidth than TCP, UDP or HTTP");
+LI("SMTP has a much higher latency.");
+LI("SMTP requires significantly more computation (encoding and decoding time)
+     for the peers.");
+LI("SMTP is significantly more complicated to configure.");
+LI("SMTP may be abused by tricking GNUnet into sending mail to
+     non-participating third parties.");
+echo "</ul>\n";
+BP();
+W("So why would anybody want to use SMTP?");
+EP();
+echo "<ul>\n";
+LI("SMTP can be used to contact peers behind NAT boxes (in virtual private 
networks).");
+LI("SMTP can be used to circumvent policies that limit or prohibit 
peer-to-peer traffic by masking as &quot;legitimate&quot; traffic.");
+LI("SMTP uses E-mail addresses which are independent of a specific IP, which 
can be useful to address peers that use dynamic IP addresses.");
+LI("SMTP can be used to initiate a connection (e.g. initial address exchange) 
and peers can then negotiate the use of a more efficient protocol (e.g. TCP) 
for the actual communication.");
+echo "</ul>\n";
+
+BP();
+W("In summary, SMTP can for example be used to send a message to a peer behind 
a NAT box that has a dynamic IP to tell the peer to establish a TCP connection 
to a peer outside of the private network.");
+W("Even an extraordinary overhead for this first message would be irrelevant 
in this type of situation.");
+EP();
+
+ANCHOR("how");H3("How does it work?");
+
+BP();
+W("When a GNUnet peer needs to send a message to another GNUnet peer that has 
advertised (only) an SMTP transport address, GNUnet base64-encodes the message 
and sends it in an E-mail to the advertised address.");
+W("The advertisement contains a <em>filter</em> which is placed in the E-mail 
header, such that the receiving host can filter the tagged E-mails and forward 
it to the GNUnet peer process.");
+W("The filter can be specified individually by each peer and be changed over 
time.");
+W("This makes it impossible to censor GNUnet E-mail messages by searching for 
a generic filter.");
+EP();
+
+ANCHOR("cfg");H3("How do I configure my peer?");
+
+BP();
+W("First, you need to configure <tt>procmail</tt> to filter your inbound 
E-mail for GNUnet traffic.");
+W("The GNUnet messages must be delivered into a pipe, for example 
<tt>/tmp/gnunet.smtp</tt>.");
+W("You also need to define a <em>filter</em> that is used by procmail to 
detect GNUnet messages.");
+W("You are free to choose whichever filter you like, but you should make sure 
that it does not occur in your other E-mail.");
+W("In our example, we will use <tt>X-mailer: GNUnet</tt>.");
+W("The <tt>~/.procmailrc</tt> configuration file then looks like this:");
+EP();
+
+PRE(":0:\n" .
+    "* ^X-mailer: GNUnet\n" .
+    "/tmp/gnunet.smtp\n" .
+    "# where do you want your other e-mail delivered to\n" .
+    "# (default: /var/spool/mail/$USER)\n" .
+    ":0:\n" .
+    "/var/spool/mail/$USER\n");
+
+BP();
+W("After adding this file, first make sure that your regular E-mail still 
works (e.g. by sending an E-mail to yourself).");
+W("Then edit the GNUnet configuration.");
+W("In the section <tt>SMTP</tt> you need to specify your E-mail address under 
<tt>EMAIL</tt>, your mail server (for outgoing mail) under <tt>SERVER</tt>, 
your hostname under <tt>SENDERHOSTNAME</tt>, the filter (<em>X-mailer: 
GNUnet</em> in the example) under <tt>FILTER</tt> and the name of the pipe 
under <tt>PIPE</tt>.");
+W("The completed section could then look like this:");
+EP();
+
+PRE("EMAIL = address@hidden" .
+    "MTU = 65536\n" .
+    "PORT = 25\n" .
+    "SERVER = mail.gnu.org\n" .
+    "SENDERHOSTNAME = www.gnu.org\n" .
+    "FILTER = \"X-mailer: GNUnet\"\n" .
+    "PIPE = /tmp/gnunet.smtp");
+    
+BP();
+W("Finally, you need to add <tt>smtp</tt> to the list of <tt>TRANSPORTS</tt> 
in the <tt>GNUNETD</tt> section.");
+W("GNUnet peers will use the E-mail address that you specified to contact your 
peer until the advertisement times out.");
+W("Thus, if you are not sure if everything works properly or if you are not 
planning to be online for a long time, you may want to configure this timeout 
to be short, e.g. just one hour.");
+W("For this, set <tt>HELLOEXPIRES</tt> to <tt>1</tt> in the <tt>GNUNETD</tt> 
section.");
+P();
+W("This should be it, but you may probably want to %s it first.\n",
+  extlink_("#tst","test"));
+
+ANCHOR("tst");H3("How do I test if it works?");
+
+BP();
+W("Any transport can be subjected to some rudimentary tests using the 
<tt>gnunet-transport-check</tt> tool.");
+W("The tool sends a message to the local node via the transport and checks 
that a valid message is received.");
+W("While this test does not involve other peers and can not check if firewalls 
or other network obstacles prohibit proper operation, this is a great testcase 
for the SMTP transport since it tests pretty much nearly all of the 
functionality.");
+P();
+
+W("<tt>gnunet-transport-check</tt> should only be used without running 
<tt>gnunetd</tt> at the same time.");
+W("By default, <tt>gnunet-transport-check</tt> tests all transports that are 
specified in the configuration file.");
+W("But you can specifically test SMTP by giving the option 
<tt>--transport=smtp</tt>.");
+P();
+
+W("Note that this test always checks if a transport can receive and send.");
+W("While you can configure most transports to only receive or only send 
messages, this test will only work if you have configured the transport to send 
and receive messages.");
+
+EP();
+ANCHOR("perf");H3("How fast is it?");
+
+BP();
+W("We have measured the performance of the UDP, TCP and SMTP transport layer 
directly and when used from an application using the GNUnet core.");
+W("Measureing just the transport layer gives the better view of the actual 
overhead of the protocol, whereas evaluating the transport from the application 
puts the overhead into perspective from a practical point of view.");
+P();
+
+W("The loopback measurements of the SMTP transport were performed on three 
different machines spanning a range of modern SMTP configurations.");
+W("We used a PIII-800 running RedHat 7.3 with the <em>Purdue</em> Computer 
Science configuration which includes filters for spam.");
+W("We also used a Xenon 2 GHZ with a vanilla <em>RedHat</em> 8.0 sendmail 
configuration.");
+W("Furthermore, we used qmail on a PIII-1000 running Sorcerer GNU Linux 
(<em>SGL</em>).");
+W("The numbers for UDP and TCP are provided using the SGL configuration.");
+W("The qmail benchmark uses qmail&rsquo;s internal filtering whereas the 
sendmail benchmarks relies on procmail to filter and deliver the mail.");
+W("We used the transport layer to send a message of b bytes (excluding 
transport protocol headers) directly to the local machine.");
+W("This way, network latency and packet loss on the wire have no impact on the 
timings.");
+W("n messages were sent sequentially over the transport layer, sending message 
i+1 after the i-th message was received.");
+W("All messages were sent over the same connection and the time to establish 
the connection was not taken into account since this overhead is miniscule in 
practice -- as long as a connection is used for a significant number of 
messages.");
+EP();
+
+echo "<center>\n";
+?>
+<table border="0" cellspacing="0" cellpadding="0" width="90%">
+       <tr>
+               <th class="tbl"><?php W("Transport"); ?></th>
+               <th class="tbl">UDP</th>
+               <th class="tbl">TCP</th>
+               <th class="tbl">SMTP (Purdue sendmail)</th>
+               <th class="tbl">SMTP (RH 8.0)</th>
+               <th class="tbl">SMTP (SGL qmail)</th>
+       </tr>
+       <tr>
+               <th class="tbl" stlye="text-align: right;">   11 bytes</th>
+               <td class="tbl" stlye="text-align: right;">31 ms</td>
+               <td class="tbl" stlye="text-align: right;">55 ms</td>
+               <td class="tbl" stlye="text-align: right;"> 781 s     </td>
+               <td class="tbl" stlye="text-align: right;">77 s </td>
+               <td class="tbl" stlye="text-align: right;">24 s </td>
+       </tr>
+       <tr>
+               <th class="tbl" stlye="text-align: right;">  407 bytes</th>
+               <td class="tbl" stlye="text-align: right;">37 ms</td>
+               <td class="tbl" stlye="text-align: right;">62 ms</td>
+               <td class="tbl" stlye="text-align: right;"> 789 s     </td>
+               <td class="tbl" stlye="text-align: right;">78 s </td>
+               <td class="tbl" stlye="text-align: right;">25 s </td>
+       </tr>
+       <tr>
+               <th class="tbl" stlye="text-align: right;">1,221 bytes</th>
+               <td class="tbl" stlye="text-align: right;">46 ms</td>
+               <td class="tbl" stlye="text-align: right;">73 ms</td>
+               <td class="tbl" stlye="text-align: right;"> 804 s     </td>
+               <td class="tbl" stlye="text-align: right;">78 s </td>
+               <td class="tbl" stlye="text-align: right;">25 s </td>
+       </tr>
+</table>
+<?php
+
+echo "</center>\n";
+BP();
+
+W("The benchmarks show that UDP and TCP are, as expected, both significantly 
faster compared with any of the SMTP services.");
+W("Among the SMTP implementations, there can be significant differences 
depending on the SMTP configuration.");
+W("Filtering with an external tool like procmail that needs to re-parse its 
configuration for each mail can be very expensive.");
+W("Applying spam filters can also significantly impact the performance of the 
underlying SMTP implementation.");
+W("The microbenchmark showa that SMTP can be a viable solution for initiating 
peer-to-peer sessions: a couple of seconds to connect to a peer are probably 
not even going to be noticed by users.");
+
+W("The next benchmark measures the possible throughput for a transport.");
+W("Throughput can be measured by sending multiple messages in parallel and 
measureing packet loss.");
+W("Note that not only UDP but also the TCP transport can actually loose 
messages since the TCP implementation drops messages if the <tt>write</tt> to 
the socket would block.");
+W("While the SMTP protocol never drops messages itself, it is often so slow 
that only a fraction of the messages can be sent and received in the given 
time-bounds.");
+W("For this benchmark we report the message loss after allowing t time for 
sending m messages.");
+W("If messages were not sent (or received) after an overall timeout of t, they 
were considered lost.");
+W("The benchmark was performed using two Xeon 2 GHZ machiens running RedHat 
8.0 with sendmail.");
+W("The machines were connected with a direct 100 MBit ethernet connection.");
+
+W("Figures %s, %s and %s show that the throughput for messages of size 1,200 
octects is 2,343 kbps, 3,310 kbps and 6 kbps for UDP, TCP and SMTP 
respectively.",
+  ARRAY(extlink_("udp_1200.png","udp1200"),
+       extlink_("tcp_1200.png","tcp1200"),
+       extlink_("smtp_mtus.png","smtp-MTUs")));
+W("The high per-message overhead of SMTP can be improved by increasing the 
MTU, for example, an MTU of 12,000 octets improves the throughput to 13 kbps as 
figure %s shows.",
+  extlink_("smtp_mtus.png","smtp-MTUs"));
+W("Our research paper (%s, %s) has some more details on the benchmarking 
results.",
+  ARRAY(extlink_("download/transport.ps","A4"),
+       extlink_("download/transport-us.ps","US-letter")));
+
+EP();
+ANCHOR("doc");H3("Is there any additional documentation?");
+
+BP();
+W("Sure.");
+W("We have the %s from our initial proposal, a research paper (%s, %s) that 
also discusses some security aspects of the design and a concluding %s.",
+  ARRAY(extlink_("download/transport-proposal.ps","slides"),
+       extlink_("download/transport.ps","A4"),
+       extlink_("download/transport-us.ps","US-letter"),
+       extlink_("download/transport-presentation.pdf","presentation")));
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/translate.php
===================================================================
--- GNUnet-docs/WWW/test/translate.php  2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/translate.php  2006-04-01 11:59:15 UTC (rev 2599)
@@ -38,7 +38,7 @@
   die();
  }
 H2("Original Text");
-echo $text;
+echo htmlentities($text);
 H2("Translation");
 W("Destination language: ");
 W($lang);
@@ -48,7 +48,7 @@
 echo "<input type=hidden name=\"xlang\" value=\"$xlang\">\n";
 echo "<input type=hidden name=\"back\" value=\"$back\">\n";
 W("Translated text:");
-echo "<input size=\"80\" maxlength=\"65535\" name=\"translation\">\n";
+echo "<input size=\"80%\" maxlength=\"65535\" name=\"translation\">\n";
 echo "<input type=submit value=\"" .
      TRANSLATE_("I hereby give this translation into the Public Domain 
(commit)") .
      "\">\n";

Modified: GNUnet-docs/WWW/test/user.php3
===================================================================
--- GNUnet-docs/WWW/test/user.php3      2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/user.php3      2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,25 +1,24 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Using GNUnet";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-H2("End-User Documentation");
-BP();
-W("GNUnet is a framework for peer-to-peer networking.");
-W("This means that based on a common codebase, GNUnet will be able to run a 
diverse set of applications.");
-W("The only useful application at the moment is %s.",
-  intlink_("user_afs.php3","anonymous file sharing"));
-echo ".";
-W("In order to use any GNUnet application, a user must first install the 
software, then do some basic configuration of the framework and finally 
configure the specific application itself.");
-W("The configuration of the framework involves setting up the network and the 
specification which applications should be used.");
-P();
-
-W("The following pages describe first how to compile and configure GNUnet and 
then detail how to configure and use applications built with GNUnet.");
-EP();
-
-include("user_index.inc");
-
-P();
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Using GNUnet";
+$description="Information for users (overview)";
+include("html_header.php3");
+
+H2("End-User Documentation");
+BP();
+W("GNUnet is a framework for peer-to-peer networking.");
+W("This means that based on a common codebase, GNUnet will be able to run a 
diverse set of applications.");
+W("The only useful application at the moment is %s.",
+  intlink_("user_afs.php3","anonymous file sharing"));
+W("In order to use any GNUnet application, a user must first install the 
software, then do some basic configuration of the framework and finally 
configure the specific application itself.");
+W("The configuration of the framework involves setting up the network and the 
specification which applications should be used.");
+P();
+
+W("The following pages describe first how to compile and configure GNUnet and 
then detail how to configure and use applications built with GNUnet.");
+EP();
+
+include("user_index.inc");
+
+P();
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/user_afs.php3
===================================================================
--- GNUnet-docs/WWW/test/user_afs.php3  2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/user_afs.php3  2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,601 +1,557 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Using GNUnet for Anonymous File Sharing";
-$description="GNUnet Documentation - Anonymous File Sharing with GNUnet";
-include("html_header.php3");
-H2("Anonymous File Sharing with GNUnet");
-?>
-<ul>
- <li><?php extlink("#concepts","Concepts"); ?>
-  <ul>
-<?php
- LI(extlink_("#files","Files"));
- LI(extlink_("#keywords","Keywords"));
- LI(extlink_("#directories","Directories"));
- LI(extlink_("#namespaces","Namespaces"));
- LI(extlink_("#advertisements","Advertisements"));
- LI(extlink_("#collections","Collections"));
- LI(extlink_("#example","Example"));
-?>
-</ul></li>
-<li><?php extlink("#configuration","Configuration"); ?>
-  <ul>
-   <li><?php extlink("#mysql","Setting up the mysql database"); ?></li>
-  </ul></li>
-
- <li><?php extlink("#afscommands","Commands for Anonymous File Sharing"); ?>
-  <ul>
-<?php
- LI(extlink_("#gnunetinsert","gnunet-insert"));
- LI(extlink_("#gnunetsearch","gnunet-search"));
- LI(extlink_("#gnunetdownload","gnunet-download"));
- LI(extlink_("#gnunetdelete","gnunet-delete"));
- LI(extlink_("#gnunetdirectory","gnunet-directory"));
- LI(extlink_("#gnunetpseudonym","gnunet-pseudonym"));
- LI(extlink_("#GUI","gnunet-gtk"));
-echo "</ul></li></ul>\n";
-
-ANCHOR("concepts"); H3("Concepts");
-
-BP();
-W("Sharing files in GNUnet is not quite as simple as in traditional file 
sharing systems.");
-W("For example, it is not sufficient to just place files into a specific 
directory to share them.");
-W("In addition to anonymous routing GNUnet attempts to give users a better 
experience in searching for content.");
-W("GNUnet uses cryptography to safely break content into smaller pieces that 
can be obtained from different sources without allowing participants to corrupt 
files.");
-W("GNUnet makes it difficult for an adversary to send back bogus search 
results.");
-W("GNUnet enables content providers to group related content and to establish 
a reputation.");
-W("Furthermore, GNUnet allows updates to certain content to be made 
available.");
-W("This section is supposed to introduce users to the concepts that are used 
to achive this goals.");
-EP();
-
-ANCHOR("files"); H4("Files");
-BP();
-W("A file in GNUnet is just a sequence of bytes.");
-W("Any file-format is allowed and the maximum file size is theoretically 
2<sup>64</sup> bytes, except that it would take an impractical amount of time 
to share such a file.");
-W("GNUnet itself never interprets the contents of shared files, except when 
using %s to obtain keywords.",
-  intlink_("/libextractor/index.php", "libextractor"));
-EP();
-
-ANCHOR("keywords"); H4("Keywords");
-BP();
-W("Keywords are the most simple mechanism to find files on GNUnet.");
-W("Keywords are case-sensitive and the search string must always match exactly 
the keyword used by the person providing the file.");
-W("Keywords are never transmitted in plaintext, for details see the %s paper.",
-  extlink_("download/ecrs.ps", "ECRS"));
-W("Since providing keywords by hand for each shared file is tedious, GNUnet 
uses %s to help automate this process.",
-  intlink_("/libextractor/index.php", "libextractor"));
-W("Starting a keyword search on a slow machine can take a while since the 
keyword search involves computing a fresh RSA key to fomulate the request.");
-EP();
-
-ANCHOR("directories"); H4("Directories");
-BP();
-W("A directory in GNUnet is a list of file identifiers with meta-data.");
-W("The file identifiers provide sufficient information about the files to 
allow downloading the contents.");
-W("Once a directory has been created, it cannot be changed since it is treated 
just like an ordinary file by the network.");
-EP();
-
-ANCHOR("namespaces"); H4("Namespaces");
-BP();
-W("A namespace is a set of files that were signed by the same pseudonym.");
-W("A pseudonym is essentially a public-private RSA key.");
-W("Note that a pseudonym is NOT bound to a GNUnet peer.");
-W("There can be multiple pseudonyms for a single user, and users could share 
pseudonym keys (out-of-band).");
-W("Files (or directories) that have been signed and placed into a namespace 
can be updated.");
-W("Updates are identified as authentic if the same secret key was used to sign 
the update.");
-W("Namespaces are also useful to establish a reputation, since all of the 
content in the namespace comes from the same entity (which does not have to be 
the same person).");
-EP();
-
-ANCHOR("advertisements"); H4("Advertisements");
-BP();
-W("Advertisements are used to notify other users about the existence of a 
namespace.");
-W("Advertisements are propagated using the normal keyword search.");
-W("When an advertisement is received (in response to a search), it is NOT 
displayed immediately.");
-W("Instead, the namespace is added to the list of namespaces available in the 
namespace-search dialogs of <tt>gnunet-gtk</tt> and printed by 
<tt>gnunet-pseudonym</tt>.");
-W("Whenever a namespace is created, an appropriate advertisement can be 
generated.");
-W("The default keyword for the advertising of namespaces is 
<tt>namespace</tt>.");
-EP();
-
-ANCHOR("collections"); H4("Collections");
-
-BP();
-W("A collection is an automatically managed namespace.");
-W("The root of the namespace points to a directory with all of the files 
inserted by the user since the collection was initiated.");
-W("The root is updated sporadically each time a new file is inserted.");
-W("The construction of the directory and the update of the namespace are done 
automatically by GNUnet on each insertion and does not require work from the 
user.");
-W("Collections are advertised under the keyword <tt>collection</tt>.");
-EP();
-
-ANCHOR("example"); H4("Example");
-
-BP();
-W("Here is how to start a collection:");
-EP();
-PRE("$ gnunet-pseudonym -a -C NICKNAME -D DESCRIPTION -r AUTHORNAME\n" .
-    "$ gnunet-insert FILENAME\n" .
-    "$ gnunet-search collection\n" .
-    "$ gnunet-gtk");
-BP();
-W("In <tt>gnunet-gtk</tt> select <tt>Advanced-Search Namespace</tt>.");
-W("In the dialog, select the NICKNAME from the list of namespace 
identifiers.");
-W("The search key identifier will be filled out automatically to point to the 
root of the namespace.");
-W("The search should yield a directory which contains the file FILENAME.");
-W("After inserting additional files, additional directories with more files 
will show up in the search.");
-W("To stop the collection, use");
-EP();
-PRE("$ gnunet-pseudonym -E");
-BP();
-W("Note that the UI may not always be very pretty for collections since this 
is a new feature.");
-EP();
-
-ANCHOR("configuration");H3("File-sharing options in gnunet.conf");
-
-BP();
-W("This section describes the options in gnunet.conf that relate to anonymous 
file sharing.");
-W("Most options are in the configuration file for the gnunetd daemon, the 
others are specfically marked as client options.");
-EP();
-
-ANCHOR("gnunet.conf.diskquota");H4("FS: DISKQUOTA");
-
-BP();
-W("Use this option to specify how much space GNUnet is allowed to use on the 
drive.");
-W("This does not include indexed files.");
-W("The value is specified in MB, the default is 1024.");
-W("Note that whenever you change this value, GNUnet may have to reorganize the 
database, which can take quite some time on the next start (obviously depending 
on the previous size of the database).");
-P();
-
-W("Large amounts of storage space may also have some impact on memory use, a 
typical value is around 250 kb memory per gigabyte of storage space.");
-W("Note that indexing files (instead of inserting, indexing is the default, 
insertion can be enforced with the <tt>-n</tt> switch) is much cheaper; the 
files will cause less memory usage, use less space in the database and the 
operation will be faster.");
-
-
-EP();
-ANCHOR("gnunet.conf.indexdirectory"); H4("FS: INDEX-DIRECTORY");
-
-BP();
-W("This option specifies the name of the directory where indexed files are 
either copied to or symlinked from.");
-W("When a file is indexed with the option <tt>-l</tt> and if <tt>gnunetd</tt> 
and the inserting process run on the same machine, then a symbolic link is 
created from the index-directory to that file.");
-W("Without the <tt>-l</tt> option or if <tt>gnunetd</tt> runs on a different 
machine, a copy of the file is made instead.");
-W("Note that the indexing process does a lot more than just this, thus moving 
files over to the index directory by hand will NOT share these files.");
-EP();
-
-ANCHOR("gnunet.conf.activemigration");H4("FS: ACTIVEMIGRATION");
-
-BP();
-W("Setting this option to <tt>YES</tt> allows <tt>gnunetd</tt> to migrate data 
to the local machine.");
-W("Setting this option to <tt>YES</tt> is highly recommended for efficiency.");
-W("Its also the default.");
-W("If you set this value to YES, GNUnet will store content on your machine 
that you cannot decrypt.");
-W("While this may protect you from liability if the judge is sane, it may not 
(IANAL).");
-W("If you put illegal content on your machine yourself, setting this option to 
YES will probably increase your chances to get away with it since you can 
plausibly deny that you inserted the content.");
-W("Note that in either case, your anonymity would have to be broken first 
(which may be possible depending on the size of the GNUnet network and the 
strength of the adversary).");
-
-EP();
-ANCHOR("gnunet.conf.searchtimeout");H4("FS: SEARCHTIMEOUT");
-
-BP();
-W("This is a client option respected by <tt>gnunet-search</tt> and 
<tt>gnunet-gtk</tt>.");
-w("After how many seconds should <tt>gnunet-search</tt> give up searching?");
-W("<tt>gnunet-search</tt> will exit after this period of time.");
-W("The option does not specify how long the individual search query lives in 
the network.");
-W("For typical values <tt>gnunet-search</tt> will retransmit the search query 
multiple times in the given search interval.");
-W("The default is 300 seconds.");
-
-EP();
-ANCHOR("gnunet.conf.extractors");H4("FS: EXTRACTORS");
-
-BP();
-W("This is a client option respected by <tt>gnunet-insert</tt> and 
<tt>gnunet-gtk</tt>.");
-W("This option specifies which additional extractors <tt>gnunet-insert</tt> 
should use for keyword extraction.");
-W("The default set of extractors from your local libextractor installation is 
always used.");
-W("Typically, an extractor for splitting keywords at word boundaries is added 
here.");
-
-EP();
-ANCHOR("gnunet.conf.databasetype");H4("MODULES: sqstore");
-
-BP();
-W("Which database type should be used for content?");
-W("Valid types are &quot;sqstore_sqlite&quot; and &quot;sqstore_mysql&quot;.");
-W("The libraries and header files for the specified type must have been 
available at compile time.");
-W("If the type is changed, you must stop <tt>gnunetd</tt> and run 
<tt>gnunet-update</tt> to convert the database.");
-P();
-W("The <tt>mysql</tt> module requires manual setup, described %s.",
-  extlink_("#mysql","here"));
-W("The sqlite databases only requires the installation of the respective 
database (with header files) before running configure.");
-EP();
-
-ANCHOR("mysql");H4("Setting up the mysql database");
-
-BP();
-W("Note: The mysql module does NOT work with mysql v3.23.49 due to a bug in 
mysql.");
-W("All later versions should be fine, including the 4.0.x series.");
-W("As of this writing, the current development version is 4.0.16-log on 
debian/unstable.");
-EP();
-
-H5("Highlights");
-BP();
-W("Pros:");
-EP();
-echo "<ul><li>";
-W("On up-to-date hardware where mysql can be used comfortably, the overall 
performance is fairly good (according to our tests).");
-echo "</li><li>";
-W("It is often possible to recover the mysql database from internal 
inconsistencies.");
-echo "</li></ul>";
-BP();
-W("Cons:");
-EP();
-echo "<ul><li>";
-W("Memory usage");
-echo "</li><li>";
-W("Manual setup");
-echo "</li></ul>";
-
-H5("Setup Instructions");
-
-BP();
-W("First, you must have mysql including the development files (headers) 
installed on the system when you configure GNUnet.");
-W("Not all binary distributions contain the mysql module, so you may also have 
to compile GNUnet by hand.");
-W("After you have mysql installed and GNUnet compiled with mysql support, do 
the following:");
-EP();
-echo "<ol><li>";
-BP();
-W("In /etc/gnunet.conf, set");
-EP();
-PRE("DATABASETYPE = \"mysql\"");
-echo "</li><li>";
-BP();
-W("Then access mysql as root (root of the database, not of the system):");
-EP();
-PRE("$ mysql -u root -p ");
-BP();
-W("and do the following.");
-W("[You should replace \$USER with the username that will be running the 
gnunetd process].");
-EP();
-PRE("CREATE DATABASE gnunet;\n" .
-    "GRANT select,insert,update,delete,create,alter,drop ON gnunet.* TO 
address@hidden;\n" .
-    "SET PASSWORD FOR address@hidden(\"\$the_password_you_like\");\n" .
-    "FLUSH PRIVILEGES;");
-echo "</li><li>";
-BP();
-W("In the \$HOME directory of \$USER, create a &quot;.my.cnf&quot; file with 
the following lines:");
-EP();
-PRE("[client]\n" .
-    "user=\$USER\n" .
-    "password=\$the_password_you_like");
-BP();
-W("Note that .my.cnf file is a security risk since it exposes the password.");
-W("You may want to keep the file in a place where it is not easily accessed.");
-W("The \$HOME/.my.cnf can be a symbolic link.");
-W("It is also possible not to use any password if database security is no 
concern.");
-W("Note that $USER has only priviledges to mess up GNUnet&prime;s tables, 
nothing else (unless you give him more, of course).");
-EP();
-echo "</li><li>";
-BP();
-W("Finally, you may want to briefly try if the DB connection works.");
-W("First, login as \$USER.");
-W("Then use:");
-EP();
-PRE("# mysql -u \$USER -p\n" .
-    "mysql> use gnunet;");
-BP();
-W("If you get the message &quot;Database changed&quot; it probably works.");
-W("If you get &quot;ERROR 2002: Can&prime;t connect to local MySQL server 
through socket &prime;/tmp/mysql.sock&prime; (2)&quot; it may be resolvable by 
&quot;ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock&quot;");
-W("[So there may be some additional trouble depending on your mysql setup.]");
-echo "</li></ol>";
-EP();
-
-H5("REPAIRING TABLES");
-
-BP();
-W("Its probably healthy to check your tables for inconsistencies every now and 
then.");
-W("If you get odd SEGVs on gnunetd startup, it might be that the mysql 
databases have been corrupted.");
-P();
-W("The tables can be verified or fixed in the following ways:");
-EP();
-echo "<ol><li>";
-BP();
-W("by shutting down mysqld (mandatory!) and running");
-EP();
-PRE("# myisamchk -r *.MYI");
-BP();
-W("in /var/lib/mysql/gnunet/ (or wherever the tables are stored).");
-EP();
-echo "</li><li>";
-BP();
-W("Another repair command is <tt>mysqlcheck</tt>.");
-W("The usable command may depend on your mysql build/version.");
-EP();
-echo "</li><li>";
-BP();
-W("by executing ");
-EP();
-PRE("mysql> REPAIR TABLE data1024of?");
-BP();
-W("for each table in the gnunet database (USE gnunet; SHOW TABLES;)");
-EP();
-echo "</li></ol>";
-BP();
-W("If you have problems related to the mysql module, your best friend is 
probably the mysql manual.");
-W("The first thing to check is that mysql is basically operational, that you 
can connect to it, create tables, issue queries and so on.");
-EP();
-HR();
-
-
-
-
-ANCHOR("commands");H3("Commands for File Sharing");
-
-IMG("afs_small.png", "Anonymous file sharing logo", "RIGHT", 150, 115);
-BP();
-W("The only useful application that is currently available for GNUnet is 
anonymous file-sharing.");
-W("The GUI interface is described %s.",
-  extlink_("#GUI","here"));
-W("For shell-gurus, five shell commands provide the interface:");
-EP();
-
-ANCHOR("gnunetinsert");H4("gnunet-insert");
-
-BP();
-W("The command <tt>gnunet-insert</tt> can be used to add content to the 
network.");
-W("The basic format of the command is");
-EP();
-
-PRE("$ gnunet-insert [-n] [-k KEYWORDS]* [-m TYPE:VALUE] FILENAME 
[FILENAMES]*");
-
-BP();
-W("The option -k is used to specify keywords for the file that should be 
inserted.");
-W("You can supply any number of keywords, and each of the keywords will be 
sufficient to locate and retrieve the file.");
-W("The -m option is used to specify meta-data, such as descriptions.");
-W("You can use -m multiple times.");
-W("The TYPE passed must be from the list of meta-data types known to 
libextractor.");
-W("You can obtain this list by running <tt>extract -l</tt>.");
-W("Use quotes around the entire meta-data argument if the value contains 
spaces.");
-W("The meta-data is displayed to other users when they select which files to 
download.");
-W("The meta-data and the keywords are optional and maybe inferred by %s.",
-  intlink_("/libextractor/index.php", "libextactor"));
-P();
-
-W("By default, GNUnet indexes a file instead of copying it.");
-W("This is much more efficient, but requries the file to stay unaltered at the 
location where it was when it was indexed.");
-W("If you intend to move, delete or alter a file, consider using the option 
<tt>-n</tt> which will force GNUnet to make a copy of the file in the 
database.");
-W("Since it is much less efficient, this is strongly discouraged for large 
files.");
-
-W("When GNUnet indexes a file (default), GNUnet does <strong>not</strong> 
create an additional encrypted copy of the file but just computes a summary (or 
index) of the file.");
-W("That summary is approximately two percent of the size of the original file 
and is stored in GNUnet&rsquo;s %s.",
-  extlink_("#database", "database"));
-W("Whenever a request for a part of an indexed file reaches GNUnet, this part 
is encrypted on-demand and send
-out.");
-W("There is no need for an additional encrypted copy of the file to stay 
anywhere on the drive.");
-W("This is very different from other systems, such as %s, where each file that 
is put online must be in Freenet&rsquo;s database in encrypted format, doubling 
the space requirements if the user wants to preseve a directly accessible copy 
in plaintext.",
-  extlink_("http://www.freenetproject.org/","Freenet";));
-P();
-
-W("Thus indexing should be used for all files where the user will keep using 
this file (at the location given to gnunet-insert) and does not want to 
retrieve it back from GNUnet each time.");
-P();
-
-W("The option <tt>-n</tt> may be used if the user fears that the file might be 
found on his drive (assuming the computer comes under the control of an 
adversary).");
-W("When used with the <tt>-n</tt> flag, the user has a much better chance of 
denying knowledge of the existence of the file, even if it is still (encrypted) 
on the drive and the adversary is able to crack the encryption (e.g. by 
guessing the keyword.");
-P();
-W("gnunet-insert has a ton of additional options to handle namespaces and 
directories.");
-W("See the man-page for details.");
-W("If you want to remove a file that you have indexed from the local peer, use 
the tool <tt>gnunet-delete</tt> to un-index the file.");
-EP();
-
-HR();
-
-ANCHOR("gnunetsearch");H4("gnunet-search");
-BP();
-W("The command <tt>gnunet-search</tt> can be used to search for content on 
GNUnet.");
-W("The format is:");
-EP();
-
-PRE("$ gnunet-search [-t TIMEOUT] KEYWORD [AND KEYWORD]*");
-
-BP();
-W("The -t option specifies that the query should timeout after approximately 
TIMEOUT seconds.");
-W("A value of zero is interpreted as <i>no timeout</i>.");
-W("If multiple words are passed as keywords and are <strong>not</strong> 
separated by an <tt>AND</tt>, gnunet-search will concatenate them to one bigger 
keyword.");
-W("Thus,");
-EP();
-
-PRE("$ gnunet-search Das Kapital");
-
-BP();
-W("and");
-EP();
-
-PRE("$ gnunet-search \"Das Kapital\"");
-
-BP();
-W("are identical.");
-W("You can use AND to separate keywords.");
-W("In that case, gnunet-search will only display results that match all the 
keywords.");
-W("<tt>gnunet-search</tt> cannot do multiple independent queries 
(&quot;OR&quot;); you must use multiple processes for that.");
-
-P();
-W("Search results are printed by gnunet-search like this:");
-EP();
-PRE("$ gnunet-download -o &quot;COPYING&quot; -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992\n"
 .
-    "=&gt; The GNU Public License &lt;= (mimetype: text/plain)");
-
-BP();
-W("The first line is the command you would have to enter to download the 
file.");
-W("The argument passed to <tt>-o</tt> is the suggested filename (you may 
change it to whatever you like).");
-W("The <tt>--</tt> is followed by key for decrypting the file, the query for 
searching the file, a checksum (in hexadecimal) finally the size of the file in 
bytes.");
-W("The second line contains the description of the file; here this is 
&quot;The GNU Public License&quot; and the mime-type (see the options for 
gnunet-insert on how to change these).");
-
-EP();
-
-ANCHOR("gnunetdownload");H4("gnunet-download");
-BP();
-W("In order to download a file, you need the three values returned by 
<tt>gnunet-search</tt>.");
-W("You can then use the tool <tt>gnunet-download</tt> to obtain the file:");
-EP();
-PRE("$ gnunet-download -f FILENAME -- GNUNETURL");
-BP();
-W("FILENAME specifies the name of the file where GNUnet is supposed to write 
the result.");
-W("Existing files are overwritten.");
-W("If you want to download the GPL from the previous example, you do the 
following:");
-EP();
-PRE("$ gnunet-download -o \"COPYING\" -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992");
-BP();
-W("If you ever have to abort a download, you can continue it at any time by 
re-issuing <tt>gnunet-download</tt> with the same filename.");
-W("In that case, GNUnet will <strong>not</strong> download blocks again that 
are already present.");
-W("GNUnet&rsquo;s %s will ensure file integrity, even if the existing file was 
not downloaded from GNUnet in the first place.",
-  intlink_("encoding.php3","file-encoding mechanism"));
-W("You may want to use the <tt>-V</tt> switch (must be added before the 
<tt>--</tt>) to turn on verbose reporting.");
-W("In this case, <tt>gnunet-download</tt> will print the current number of 
bytes downloaded whenever new data was received.");
-EP();
-HR();
-BP();
-W("The option -c CONFIGFILE can be passed to each of the commands to override 
the default location of the configuration file.");
-W("The option -v shows the current version number.");
-W("Use -h to get a short description of the options.");
-EP();
-
-ANCHOR("gnunetdelete");H4("gnunet-delete");
-BP();
-W("<tt>gnunet-delete</tt> can be used to un-index files that were inserted 
into GNUnet (works only for files that were inserted locally and that are still 
present on the local drive).");
-EP();
-
-ANCHOR("gnunetdirectory");H4("gnunet-directory");
-BP();
-W("Directories are shared just like ordinary files.");
-W("If you download a directory with <tt>gnunet-download</tt>, you can use 
<tt>gnunet-directory</tt> to list its contents.");
-W("The contents of a directory are File Identifiers (FIs).");
-W("An FI contains all the information required by <tt>gnunet-download</tt> to 
retrieve the file.");
-W("Additionally, FIs can contain the mime-type, description, a filename and 
other meta information.");
-P();
-W("In order to make it possible to assemble directories, GNUnet stores all 
locally known FIs in a plaintext database, the FI database.");
-
-P("This <tt>gnunet-directory</tt> can also be used to list the contents of the 
FI database.");
-W("The option <tt>-l</tt> causes the display of all known FI entries.");
-W("The FI database can be flushed using the <tt>-k</tt> option.");
-W("There is currently no way to selectively remove a specific entry.");
-EP();
-
-HR();
-BP();
-W("Note that there is no command line tool to create a directory from the FI 
database.");
-W("To create a directory from the command line, you must use 
<tt>gnunet-insert</tt>.");
-W("The main use of the FI database is for building directories (and namespace 
entries) with <tt>gnunet-gtk</tt>.");
-
-EP();
-ANCHOR("gnunetpseudonym");
-H4("gnunet-pseudonym");
-BP();
-W("By default this tool lists all locally available pseudonyms.");
-W("With the <tt>-C NICK</tt> option it can also be used to create a new 
pseudonym.");
-W("A pseudonym is the virtual identity of the entity in control of a 
namespace.");
-W("Anyone can create any number of pseudonyms.");
-W("Note that creating a pseudonym can take a few minutes depending on the 
performance of the machine used.");
-P();
-W("With the <tt>-D NICK</tt> option pseudonyms can be deleted.");
-W("Once the pseudonym has been deleted it is impossible to add content to the 
corresponding namespace.");
-W("Deleting the pseudonym does not make the namespace or any content in it 
unavailable.");
-EP();
-H5("Advertising namespaces");
-BP();
-W("Each namespace is associated with meta-data that describes the namespace.");
-W("This meta-data is provided by the user at the time that the pseudonym was 
created.");
-W("The meta-data is published in what is called a namespace advertisement.");
-W("These advertisements are exchanged within GNUnet in two ways.");
-W("First, the 'all-zeros' content identifier in the namespace always contains 
the advertisement (if it exists).");
-W("This allows for a simply lookup of the description for a given namespace.");
-W("More importantly, the advertisement can also be found using normal 
keyword-searches.");
-W("This way, users can learn about new namespaces without relying on 
out-of-band communication or directories.");
-W("When a pseudonym is created, the namespace is by default advertised under 
the keyword <tt>namespace</tt>.");
-W("When a keyword-search finds a namespace advertisement, it is automatically 
stored in the local GNUnet state-database.");
-W("The advertisement is preserved for tools like <tt>gnunet-pseudonym</tt> and 
<tt>gnunet-gtk</tt> that can reproduce them when appropriate.");
-EP();
-H5("Meta-data in the namespace advertisement");
-BP();
-W("While the namespace is uniquely identified by its ID, another way to refer 
to the namespace is to use the NICKNAME.");
-W("The NICKNAME can be freely chosen by the creator of the namespace and hence 
conflicts are possible.");
-W("If a GNUnet client learns about more than one namespace using the same 
NICKNAME, the ID is appended to the NICKNAME go get a unique identifier.");
-W("The advertisement also contains meta-data describing the content of the 
namespace.");
-W("Naturally all of this information is <tt>optional</tt> and maybe 
<tt>incorrect</tt> since it is provided by the user and cannot be verified.");
-W("An item of particular interest in the namespace advertisement is the 
ROOT.");
-W("The ROOT is the identifier of a designated file in the namespace.");
-W("The idea is that the ROOT can be used to advertise an entry point to the 
content of the namespace.");
-P();
-W("Note that currently all of the meta-data must be provided at the time where 
the namespace is created and cannot be updated later.");
-W("Furthermore, the namespace advertisement can only be published under a 
single keyword (this is purely a UI limitation).");
-EP();
-
-
-ANCHOR("GUI");H4("gnunet-gtk");
-BP();
-W("<tt>gnunet-gtk</tt> is not yet available for GNUnet 0.7.x.");
-/*
-W("<tt>gnunet-gtk</tt> is the GTK+ interface for GNUnet.");
-W("It can currently only be used to search for and download files from the 
network.");
-W("gnunet-gtk can also be used to insert files into the network.");
-W("If you want to insert lots of files, you&rsquo;re probably better of using 
%s.",
-  extlink_("#gnunetinsert","gnunet-insert"));
-P();
-W("After <tt>gnunet-gtk</tt> was started, you should see the following:");
-IMG("gtk-startup.png","GNUnet GTK startup window","CENTER",788,332);
-W("Enter the query into the input line at the bottom and click on search.");
-W("A register card will open in the main window.");
-W("In that card, search results obtained from the network will be listed once 
they arrive.");
-W("<tt>gnunet-gtk</tt> will keep searching for the query until you close that 
card.");
-W("No duplicate results will be displayed.");
-
-IMG("gtk-search.png", "This window displays the search results", "CENTER", 
788, 332);
-
-W("You can enter additional queries or select a file to download from the 
list.");
-W("The size of the file is displayed in bytes.");
-W("Mind that the description was supplied by the user inserting the file and 
may not be accurate.");
-W("After you click on the download button, the entry selected will be removed 
from the results list and a dialog will prompt you for the filename that you 
want to give to the file.");
-W("If you choose an existing file, that file will be overwritten without any 
warnings.");
-W("If the existing file contains the same data (even in parts) as the file 
that you are trying to download, those parts will not be downloaded again.");
-W("You can use this feature to continue downloads that were incomplete.");
-W("After you gave a filename, click on <i>ok</i>.");
-W("The dialog will disappear and <tt>gnunet-gtk</tt> will start the 
download.");
-W("The download overview window shows the progress for each download:");
-
-IMG("gtk-downloads.png", "download progress", "CENTER", 788, 332);
-
-W("You can abort downloads by selecting them in this window and clicking on 
&quot;Remove selected entries&quot;.");
-W("This will leave the parts of the file that were already downloaded on the 
drive.");
-W("Closing the download list does not affect the downloads, they will continue 
in the background.");
-W("But note that exiting <tt>gnunet-gtk</tt> will implicitly abort all 
downloads.");
-W("Be advised that the download usually starts very slowly, then speeds up, 
and eventually declines a bit again at the end.");
-W("This is perfectly normal.");
-W("Go get a coffee while doing the download -- or do a couple in parallel.");
-W("GNUnet uses a lot more time (but not that much more bandwidth) because it 
delays processing to make traffic analysis hard.");
-W("Even downloading a file from your local harddrive (that you inserted 
yourself) can take a couple of minutes!");
-W("The good news is that the delays currently experienced are likely to become 
smaller whenever the traffic on GNUnet increases.");
-W("This is one of the reasons why the download is fastest in the middle of the 
process.");
-P();
-W("In order to insert a file, use the <tt>File</tt> menu.");
-W("A dialog will pop up and prompt you to choose the file to insert:");
-IMG("gtk-insert.png", "choose file to insert", "CENTER",451,415);
-P();
-W("Select the file and press <tt>ok</tt>.");
-W("Next you will have to provide a description and keywords and choose if you 
want to <tt>index</tt> or <tt>insert</tt> the file (choose index if the file 
will not be moved or deleted to safe space):");
-IMG("gtk-insert2.png", "choose file to insert", "CENTER",408, 428);
-P();
-IMG("gtk-insert3.png", "adding keywords", "CENTER",408,428);
-P();
-W("Finally, press ok and watch GNUnet making the file available:");
-IMG("gtk-inserting.png", "insertion in progress", "CENTER", 178, 73);
-P();
-W("You can search, insert and download in parallel:");
-IMG("gtk-bigshot.png", "The big picture.", "CENTER", 599, 427);
-
-W("<tt>gnunet-gtk</tt> also allows you to handle directories.");
-W("Downloading a directory automatically opens the contents of the directory 
in a new frame in the notebook.");
-W("You can create and insert a new directory from the known FIs in the FI 
database using <tt>advanced-assemble directory</tt>.");
-IMG("gtk-assemble-directory.png", "assemble a directory", "CENTER", 628, 508);
-P();
-W("Pseudonyms, the public-private key pair that allows publishing documents in 
a namespace can also be managed with <tt>gnunet-gtk</tt>.");
-W("The functionality provided is equivalent to <tt>gnunet-pseudonym</tt>.");
-W("Once a pseudonym has been created, files and directories can be placed in 
the namespace defined by the pseudonym.");
-IMG("gnunet-gtk-namespace.png", "Inserting into a namespace.", "CENTER", 788, 
608);
-W("<tt>gnunet-gtk</tt> also offers the option to search a given namespace.");
-W("Just as <tt>gnunet-pseudonym</tt> can print a list of all known namespace 
advertisements, the namespace search in <tt>gnunet-gtk</tt> offers access to 
the list of advertised namespaces and the respective meta-data.");
-IMG("gnunet-namespace-search.png", "Searching a namespace.", "CENTER", 658, 
348);
-EP();
-*/
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Using GNUnet for File Sharing";
+$description="Configuring and using GNUnet for (anonymous) file sharing";
+include("html_header.php3");
+H2("File Sharing with GNUnet");
+
+afslogo();
+echo "<ul>\n";
+LILI("#concepts","Concepts");
+echo "<ul>\n";
+LILI("#files","Files");
+LILI("#keywords","Keywords");
+LILI("#directories","Directories");
+LILI("#namespaces","Namespaces");
+LILI("#advertisements","Advertisements");
+LILI("#collections","Collections");
+LILI("#example","Example");
+echo "</ul>\n";
+LILI("#configuration","Configuration"); 
+echo "<ul>\n";
+LILI("#mysql","Setting up the mysql database");
+echo "</ul>\n";
+LILI("#afscommands","Shell Commands for File Sharing"); 
+echo "<ul>\n";
+LILI("#gnunetinsert","gnunet-insert");
+LILI("#gnunetsearch","gnunet-search");
+LILI("#gnunetdownload","gnunet-download");
+LILI("#gnunetunindex","gnunet-unindex");
+LILI("#gnunetdirectory","gnunet-directory");
+LILI("#gnunetpseudonym","gnunet-pseudonym");
+echo "</ul>\n";
+LILI("gnunetgtk.php3","gnunet-gtk");
+echo "</ul>\n";
+
+ANCHOR("concepts"); H3("Concepts");
+
+BP();
+W("Sharing files in GNUnet is not quite as simple as in traditional file 
sharing systems.");
+W("For example, it is not sufficient to just place files into a specific 
directory to share them.");
+W("In addition to anonymous routing GNUnet attempts to give users a better 
experience in searching for content.");
+W("GNUnet uses cryptography to safely break content into smaller pieces that 
can be obtained from different sources without allowing participants to corrupt 
files.");
+W("GNUnet makes it difficult for an adversary to send back bogus search 
results.");
+W("GNUnet enables content providers to group related content and to establish 
a reputation.");
+W("Furthermore, GNUnet allows updates to certain content to be made 
available.");
+W("This section is supposed to introduce users to the concepts that are used 
to achive this goals.");
+EP();
+
+ANCHOR("files"); H4("Files");
+BP();
+W("A file in GNUnet is just a sequence of bytes.");
+W("Any file-format is allowed and the maximum file size is theoretically 
2<sup>64</sup> bytes, except that it would take an impractical amount of time 
to share such a file.");
+W("GNUnet itself never interprets the contents of shared files, except when 
using %s to obtain keywords.",
+  intlink_("/libextractor/index.php", "libextractor"));
+EP();
+
+ANCHOR("keywords"); H4("Keywords");
+BP();
+W("Keywords are the most simple mechanism to find files on GNUnet.");
+W("Keywords are case-sensitive and the search string must always match exactly 
the keyword used by the person providing the file.");
+W("Keywords are never transmitted in plaintext, for details see the %s paper.",
+  extlink_("download/ecrs.ps", "ECRS"));
+W("Since providing keywords by hand for each shared file is tedious, GNUnet 
uses %s to help automate this process.",
+  intlink_("/libextractor/index.php", "libextractor"));
+W("Starting a keyword search on a slow machine can take a while since the 
keyword search involves computing a fresh RSA key to fomulate the request.");
+EP();
+
+ANCHOR("directories"); H4("Directories");
+BP();
+W("A directory in GNUnet is a list of file identifiers with meta-data.");
+W("The file identifiers provide sufficient information about the files to 
allow downloading the contents.");
+W("Once a directory has been created, it cannot be changed since it is treated 
just like an ordinary file by the network.");
+EP();
+
+ANCHOR("namespaces"); H4("Namespaces");
+BP();
+W("A namespace is a set of files that were signed by the same pseudonym.");
+W("A pseudonym is essentially a public-private RSA key.");
+W("Note that a pseudonym is NOT bound to a GNUnet peer.");
+W("There can be multiple pseudonyms for a single user, and users could share 
pseudonym keys (out-of-band).");
+W("Files (or directories) that have been signed and placed into a namespace 
can be updated.");
+W("Updates are identified as authentic if the same secret key was used to sign 
the update.");
+W("Namespaces are also useful to establish a reputation, since all of the 
content in the namespace comes from the same entity (which does not have to be 
the same person).");
+EP();
+
+ANCHOR("advertisements"); H4("Advertisements");
+BP();
+W("Advertisements are used to notify other users about the existence of a 
namespace.");
+W("Advertisements are propagated using the normal keyword search.");
+W("When an advertisement is received (in response to a search), it is NOT 
displayed immediately.");
+W("Instead, the namespace is added to the list of namespaces available in the 
namespace-search dialogs of <tt>gnunet-gtk</tt> and printed by 
<tt>gnunet-pseudonym</tt>.");
+W("Whenever a namespace is created, an appropriate advertisement can be 
generated.");
+W("The default keyword for the advertising of namespaces is 
<tt>namespace</tt>.");
+EP();
+
+ANCHOR("collections"); H4("Collections");
+
+BP();
+W("A collection is an automatically managed namespace.");
+W("The root of the namespace points to a directory with all of the files 
inserted by the user since the collection was initiated.");
+W("The root is updated sporadically each time a new file is inserted.");
+W("The construction of the directory and the update of the namespace are done 
automatically by GNUnet on each insertion and does not require work from the 
user.");
+W("Collections are advertised under the keyword <tt>collection</tt>.");
+EP();
+
+ANCHOR("example"); H4("Example");
+
+BP();
+W("Here is how to start a collection:");
+EP();
+PRE("$ gnunet-pseudonym -a -C NICKNAME -D DESCRIPTION -r AUTHORNAME\n" .
+    "$ gnunet-insert FILENAME\n" .
+    "$ gnunet-search collection\n" .
+    "$ gnunet-gtk");
+BP();
+W("In <tt>gnunet-gtk</tt> select <tt>Advanced-Search Namespace</tt>.");
+W("In the dialog, select the NICKNAME from the list of namespace 
identifiers.");
+W("The search key identifier will be filled out automatically to point to the 
root of the namespace.");
+W("The search should yield a directory which contains the file FILENAME.");
+W("After inserting additional files, additional directories with more files 
will show up in the search.");
+W("To stop the collection, use");
+EP();
+PRE("$ gnunet-pseudonym -E");
+BP();
+W("Note that the UI may not always be very pretty for collections since this 
is a new feature.");
+EP();
+
+ANCHOR("configuration");H3("File-sharing options in gnunet.conf");
+
+BP();
+W("This section describes the options in gnunet.conf that relate to anonymous 
file sharing.");
+W("Most options are in the configuration file for the gnunetd daemon, the 
others are specfically marked as client options.");
+EP();
+
+ANCHOR("gnunet.conf.diskquota");H4("FS: DISKQUOTA");
+
+BP();
+W("Use this option to specify how much space GNUnet is allowed to use on the 
drive.");
+W("This does not include indexed files.");
+W("The value is specified in MB, the default is 1024.");
+W("Note that whenever you change this value, GNUnet may have to reorganize the 
database, which can take quite some time on the next start (obviously depending 
on the previous size of the database).");
+P();
+
+W("Large amounts of storage space may also have some impact on memory use, a 
typical value is around 250 kb memory per gigabyte of storage space.");
+W("Note that indexing files (instead of inserting, indexing is the default, 
insertion can be enforced with the <tt>-n</tt> switch) is much cheaper; the 
files will cause less memory usage, use less space in the database and the 
operation will be faster.");
+
+
+EP();
+ANCHOR("gnunet.conf.indexdirectory"); H4("FS: INDEX-DIRECTORY");
+
+BP();
+W("This option specifies the name of the directory where indexed files are 
either copied to or symlinked from.");
+W("When a file is indexed with the option <tt>-l</tt> and if <tt>gnunetd</tt> 
and the inserting process run on the same machine, then a symbolic link is 
created from the index-directory to that file.");
+W("Without the <tt>-l</tt> option or if <tt>gnunetd</tt> runs on a different 
machine, a copy of the file is made instead.");
+W("Note that the indexing process does a lot more than just this, thus moving 
files over to the index directory by hand will NOT share these files.");
+EP();
+
+ANCHOR("gnunet.conf.activemigration");H4("FS: ACTIVEMIGRATION");
+
+BP();
+W("Setting this option to <tt>YES</tt> allows <tt>gnunetd</tt> to migrate data 
to the local machine.");
+W("Setting this option to <tt>YES</tt> is highly recommended for efficiency.");
+W("Its also the default.");
+W("If you set this value to YES, GNUnet will store content on your machine 
that you cannot decrypt.");
+W("While this may protect you from liability if the judge is sane, it may not 
(IANAL).");
+W("If you put illegal content on your machine yourself, setting this option to 
YES will probably increase your chances to get away with it since you can 
plausibly deny that you inserted the content.");
+W("Note that in either case, your anonymity would have to be broken first 
(which may be possible depending on the size of the GNUnet network and the 
strength of the adversary).");
+
+EP();
+ANCHOR("gnunet.conf.searchtimeout");H4("FS: SEARCHTIMEOUT");
+
+BP();
+W("This is a client option respected by <tt>gnunet-search</tt> and 
<tt>gnunet-gtk</tt>.");
+w("After how many seconds should <tt>gnunet-search</tt> give up searching?");
+W("<tt>gnunet-search</tt> will exit after this period of time.");
+W("The option does not specify how long the individual search query lives in 
the network.");
+W("For typical values <tt>gnunet-search</tt> will retransmit the search query 
multiple times in the given search interval.");
+W("The default is 300 seconds.");
+
+EP();
+ANCHOR("gnunet.conf.extractors");H4("FS: EXTRACTORS");
+
+BP();
+W("This is a client option respected by <tt>gnunet-insert</tt> and 
<tt>gnunet-gtk</tt>.");
+W("This option specifies which additional extractors <tt>gnunet-insert</tt> 
should use for keyword extraction.");
+W("The default set of extractors from your local libextractor installation is 
always used.");
+W("Typically, an extractor for splitting keywords at word boundaries is added 
here.");
+
+EP();
+ANCHOR("gnunet.conf.databasetype");H4("MODULES: sqstore");
+
+BP();
+W("Which database type should be used for content?");
+W("Valid types are &quot;sqstore_sqlite&quot; and &quot;sqstore_mysql&quot;.");
+W("The libraries and header files for the specified type must have been 
available at compile time.");
+W("If the type is changed, you must stop <tt>gnunetd</tt> and run 
<tt>gnunet-update</tt> to convert the database.");
+P();
+W("The <tt>mysql</tt> module requires manual setup, described %s.",
+  extlink_("#mysql","here"));
+W("The sqlite databases only requires the installation of the respective 
database (with header files) before running configure.");
+EP();
+
+ANCHOR("mysql");H4("Setting up the mysql database");
+
+BP();
+W("MySQL 4.1 is required since GNUnet uses prepared statements.");
+W("First, here are some performance numbers comparing MySQL and SQlite:");
+?>
+<table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th class="tbl">DB</th>
+ <th class="tbl">MySQL 4</th>
+ <th class="tbl">MySQL 5</th>
+ <th class="tbl">SQlite</th>
+ </tr>
+ <tr>
+ <th class="tbl">1.6 GHZ AMD 64<br>
+     GNU/Linux, gcc 3.3.5<br>
+     IO: 53.67 MB/sec</th>
+ <td class="tbl">Upload: 615 MB, 350s (1714 kbps)<br>
+        <br>
+ </td>
+ <td class="tbl">&nbsp;</td>
+ <td class="tbl">Upload: 615 MB, 424s (1414 kbps)<br>
+        <br>
+ </td>
+ </tr>
+ <tr>
+       <th class="tbl">
+               3 GHZ Pentium 4<br>
+               Windows XP, gcc 3.4.2<br>
+       </th>
+       <td class="tbl">
+               Upload: 615 MB, 6062s (99 kbps)
+       </td>
+       <td class="tbl">
+               Upload: 615 MB, 1388s (433 kbps)
+       </td>
+       <td class="tbl">
+               Upload: 615 MB, 517s (1162 kbps)
+       </td>
+ </tr>
+</table>
+<?php
+EP();
+H5("Highlights");
+BP();
+W("Pros:");
+EP();
+echo "<ul>";
+LI("On up-to-date hardware where mysql can be used comfortably, the overall 
performance is fairly good (according to our tests).");
+LI("It is often possible to recover the mysql database from internal 
inconsistencies.");
+echo "</ul>";
+BP();
+W("Cons:");
+EP();
+echo "<ul>";
+LI("Memory usage");
+LI("Manual setup");
+echo "</ul>";
+
+H5("Setup Instructions");
+
+BP();
+W("First, you must have mysql including the development files (headers) 
installed on the system when you configure GNUnet.");
+W("Not all binary distributions contain the mysql module, so you may also have 
to compile GNUnet by hand.");
+W("After you have mysql installed and GNUnet compiled with mysql support, do 
the following:");
+EP();
+echo "<ol><li>";
+BP();
+W("In /etc/gnunet.conf, set");
+EP();
+PRE("DATABASETYPE = \"mysql\"");
+echo "</li><li>";
+BP();
+W("Then access mysql as root (root of the database, not of the system):");
+EP();
+PRE("$ mysql -u root -p ");
+BP();
+W("and do the following.");
+W("[You should replace \$USER with the username that will be running the 
gnunetd process].");
+EP();
+PRE("CREATE DATABASE gnunet;\n" .
+    "GRANT select,insert,update,delete,create,alter,drop ON gnunet.* TO 
address@hidden;\n" .
+    "SET PASSWORD FOR address@hidden(\"\$the_password_you_like\");\n" .
+    "FLUSH PRIVILEGES;");
+echo "</li><li>";
+BP();
+W("In the \$HOME directory of \$USER, create a &quot;.my.cnf&quot; file with 
the following lines:");
+EP();
+PRE("[client]\n" .
+    "user=\$USER\n" .
+    "password=\$the_password_you_like");
+BP();
+W("Note that .my.cnf file is a security risk since it exposes the password.");
+W("You may want to keep the file in a place where it is not easily accessed.");
+W("The \$HOME/.my.cnf can be a symbolic link.");
+W("It is also possible not to use any password if database security is no 
concern.");
+W("Note that $USER has only priviledges to mess up GNUnet&prime;s tables, 
nothing else (unless you give him more, of course).");
+EP();
+echo "</li><li>";
+BP();
+W("Finally, you may want to briefly try if the DB connection works.");
+W("First, login as \$USER.");
+W("Then use:");
+EP();
+PRE("# mysql -u \$USER -p\n" .
+    "mysql> use gnunet;");
+BP();
+W("If you get the message &quot;Database changed&quot; it probably works.");
+W("If you get &quot;ERROR 2002: Can&prime;t connect to local MySQL server 
through socket &prime;/tmp/mysql.sock&prime; (2)&quot; it may be resolvable by 
&quot;ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock&quot;");
+W("So there may be some additional trouble depending on your mysql setup.");
+echo "</li></ol>";
+EP();
+
+H5("REPAIRING TABLES");
+
+BP();
+W("Its probably healthy to check your tables for inconsistencies every now and 
then.");
+W("If you get odd SEGVs on gnunetd startup, it might be that the mysql 
databases have been corrupted.");
+P();
+W("The tables can be verified or fixed in the following ways:");
+EP();
+echo "<ol><li>";
+BP();
+W("by shutting down mysqld (mandatory!) and running");
+EP();
+PRE("# myisamchk -r *.MYI");
+BP();
+W("in /var/lib/mysql/gnunet/ (or wherever the tables are stored).");
+EP();
+echo "</li><li>";
+BP();
+W("Another repair command is <tt>mysqlcheck</tt>.");
+W("The usable command may depend on your mysql build/version.");
+EP();
+echo "</li><li>";
+BP();
+W("by executing ");
+EP();
+PRE("mysql> REPAIR TABLE data1024of?");
+BP();
+W("for each table in the gnunet database (USE gnunet; SHOW TABLES;)");
+EP();
+echo "</li></ol>";
+BP();
+W("If you have problems related to the mysql module, your best friend is 
probably the mysql manual.");
+W("The first thing to check is that mysql is basically operational, that you 
can connect to it, create tables, issue queries and so on.");
+EP();
+HR();
+
+
+
+
+ANCHOR("commands");H3("Commands for File Sharing");
+
+IMG("afs_small.png", "Anonymous file sharing logo", "RIGHT", 150, 115);
+BP();
+W("The only useful application that is currently available for GNUnet is 
anonymous file-sharing.");
+W("The GUI interface is described %s.",
+  extlink_("#GUI","here"));
+W("For shell-gurus, five shell commands provide the interface:");
+EP();
+
+ANCHOR("gnunetinsert");H4("gnunet-insert");
+
+BP();
+W("The command <tt>gnunet-insert</tt> can be used to add content to the 
network.");
+W("The basic format of the command is");
+EP();
+
+PRE("$ gnunet-insert [-n] [-k KEYWORDS]* [-m TYPE:VALUE] FILENAME 
[FILENAMES]*");
+
+BP();
+W("The option -k is used to specify keywords for the file that should be 
inserted.");
+W("You can supply any number of keywords, and each of the keywords will be 
sufficient to locate and retrieve the file.");
+W("The -m option is used to specify meta-data, such as descriptions.");
+W("You can use -m multiple times.");
+W("The TYPE passed must be from the list of meta-data types known to 
libextractor.");
+W("You can obtain this list by running <tt>extract -l</tt>.");
+W("Use quotes around the entire meta-data argument if the value contains 
spaces.");
+W("The meta-data is displayed to other users when they select which files to 
download.");
+W("The meta-data and the keywords are optional and maybe inferred by %s.",
+  intlink_("/libextractor/index.php", "libextactor"));
+P();
+
+W("By default, GNUnet indexes a file instead of copying it.");
+W("This is much more efficient, but requries the file to stay unaltered at the 
location where it was when it was indexed.");
+W("If you intend to move, delete or alter a file, consider using the option 
<tt>-n</tt> which will force GNUnet to make a copy of the file in the 
database.");
+W("Since it is much less efficient, this is strongly discouraged for large 
files.");
+
+W("When GNUnet indexes a file (default), GNUnet does <strong>not</strong> 
create an additional encrypted copy of the file but just computes a summary (or 
index) of the file.");
+W("That summary is approximately two percent of the size of the original file 
and is stored in GNUnet&rsquo;s %s.",
+  extlink_("#database", "database"));
+W("Whenever a request for a part of an indexed file reaches GNUnet, this part 
is encrypted on-demand and send
+out.");
+W("There is no need for an additional encrypted copy of the file to stay 
anywhere on the drive.");
+W("This is very different from other systems, such as %s, where each file that 
is put online must be in Freenet&rsquo;s database in encrypted format, doubling 
the space requirements if the user wants to preseve a directly accessible copy 
in plaintext.",
+  extlink_("http://www.freenetproject.org/","Freenet";));
+P();
+
+W("Thus indexing should be used for all files where the user will keep using 
this file (at the location given to gnunet-insert) and does not want to 
retrieve it back from GNUnet each time.");
+P();
+
+W("The option <tt>-n</tt> may be used if the user fears that the file might be 
found on his drive (assuming the computer comes under the control of an 
adversary).");
+W("When used with the <tt>-n</tt> flag, the user has a much better chance of 
denying knowledge of the existence of the file, even if it is still (encrypted) 
on the drive and the adversary is able to crack the encryption (e.g. by 
guessing the keyword.");
+P();
+W("gnunet-insert has a ton of additional options to handle namespaces and 
directories.");
+W("See the man-page for details.");
+W("If you want to remove a file that you have indexed from the local peer, use 
the tool <tt>gnunet-unindex</tt> to un-index the file.");
+EP();
+
+HR();
+
+ANCHOR("gnunetsearch");H4("gnunet-search");
+BP();
+W("The command <tt>gnunet-search</tt> can be used to search for content on 
GNUnet.");
+W("The format is:");
+EP();
+
+PRE("$ gnunet-search [-t TIMEOUT] KEYWORD [AND KEYWORD]*");
+
+BP();
+W("The -t option specifies that the query should timeout after approximately 
TIMEOUT seconds.");
+W("A value of zero is interpreted as <i>no timeout</i>.");
+W("If multiple words are passed as keywords and are <strong>not</strong> 
separated by an <tt>AND</tt>, gnunet-search will concatenate them to one bigger 
keyword.");
+W("Thus,");
+EP();
+
+PRE("$ gnunet-search Das Kapital");
+
+BP();
+W("and");
+EP();
+
+PRE("$ gnunet-search \"Das Kapital\"");
+
+BP();
+W("are identical.");
+W("You can use AND to separate keywords.");
+W("In that case, gnunet-search will only display results that match all the 
keywords.");
+W("<tt>gnunet-search</tt> cannot do multiple independent queries 
(&quot;OR&quot;); you must use multiple processes for that.");
+
+P();
+W("Search results are printed by gnunet-search like this:");
+EP();
+PRE("$ gnunet-download -o &quot;COPYING&quot; -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992\n"
 .
+    "=&gt; The GNU Public License &lt;= (mimetype: text/plain)");
+
+BP();
+W("The first line is the command you would have to enter to download the 
file.");
+W("The argument passed to <tt>-o</tt> is the suggested filename (you may 
change it to whatever you like).");
+W("The <tt>--</tt> is followed by key for decrypting the file, the query for 
searching the file, a checksum (in hexadecimal) finally the size of the file in 
bytes.");
+W("The second line contains the description of the file; here this is 
&quot;The GNU Public License&quot; and the mime-type (see the options for 
gnunet-insert on how to change these).");
+
+EP();
+
+ANCHOR("gnunetdownload");H4("gnunet-download");
+BP();
+W("In order to download a file, you need the three values returned by 
<tt>gnunet-search</tt>.");
+W("You can then use the tool <tt>gnunet-download</tt> to obtain the file:");
+EP();
+PRE("$ gnunet-download -o FILENAME -- GNUNETURL");
+BP();
+W("FILENAME specifies the name of the file where GNUnet is supposed to write 
the result.");
+W("Existing files are overwritten.");
+W("If you want to download the GPL from the previous example, you do the 
following:");
+EP();
+PRE("$ gnunet-download -o \"COPYING\" -- 
gnunet://afs/N8RCF3TETLRU9CV1PAS7M2H9QDB36AE3.K9JO8IP7KTNFO23S3VB4TFUKLD7SO5AS.0466DC92.17992");
+BP();
+W("If you ever have to abort a download, you can continue it at any time by 
re-issuing <tt>gnunet-download</tt> with the same filename.");
+W("In that case, GNUnet will <strong>not</strong> download blocks again that 
are already present.");
+W("GNUnet&rsquo;s %s will ensure file integrity, even if the existing file was 
not downloaded from GNUnet in the first place.",
+  intlink_("encoding.php3","file-encoding mechanism"));
+W("You may want to use the <tt>-V</tt> switch (must be added before the 
<tt>--</tt>) to turn on verbose reporting.");
+W("In this case, <tt>gnunet-download</tt> will print the current number of 
bytes downloaded whenever new data was received.");
+EP();
+HR();
+BP();
+W("The option -c CONFIGFILE can be passed to each of the commands to override 
the default location of the configuration file.");
+W("The option -v shows the current version number.");
+W("Use -h to get a short description of the options.");
+EP();
+
+ANCHOR("gnunetunindex");H4("gnunet-unindex");
+BP();
+W("<tt>gnunet-unindex</tt> can be used to un-index files that were inserted 
into GNUnet (works only for files that were inserted locally and that are still 
present on the local drive).");
+EP();
+
+ANCHOR("gnunetdirectory");H4("gnunet-directory");
+BP();
+W("Directories are shared just like ordinary files.");
+W("If you download a directory with <tt>gnunet-download</tt>, you can use 
<tt>gnunet-directory</tt> to list its contents.");
+W("The contents of a directory are File Identifiers (FIs).");
+W("An FI contains all the information required by <tt>gnunet-download</tt> to 
retrieve the file.");
+W("Additionally, FIs can contain the mime-type, description, a filename and 
other meta information.");
+P();
+W("In order to make it possible to assemble directories, GNUnet stores all 
locally known FIs in a plaintext database, the FI database.");
+
+P("This <tt>gnunet-directory</tt> can also be used to list the contents of the 
FI database.");
+W("The option <tt>-l</tt> causes the display of all known FI entries.");
+W("The FI database can be flushed using the <tt>-k</tt> option.");
+W("There is currently no way to selectively remove a specific entry.");
+EP();
+
+HR();
+BP();
+W("Note that there is no command line tool to create a directory from the FI 
database.");
+W("To create a directory from the command line, you must use 
<tt>gnunet-insert</tt>.");
+W("The main use of the FI database is for building directories (and namespace 
entries) with <tt>gnunet-gtk</tt>.");
+
+EP();
+ANCHOR("gnunetpseudonym");
+H4("gnunet-pseudonym");
+BP();
+W("By default this tool lists all locally available pseudonyms.");
+W("With the <tt>-C NICK</tt> option it can also be used to create a new 
pseudonym.");
+W("A pseudonym is the virtual identity of the entity in control of a 
namespace.");
+W("Anyone can create any number of pseudonyms.");
+W("Note that creating a pseudonym can take a few minutes depending on the 
performance of the machine used.");
+P();
+W("With the <tt>-D NICK</tt> option pseudonyms can be deleted.");
+W("Once the pseudonym has been deleted it is impossible to add content to the 
corresponding namespace.");
+W("Deleting the pseudonym does not make the namespace or any content in it 
unavailable.");
+EP();
+H5("Advertising namespaces");
+BP();
+W("Each namespace is associated with meta-data that describes the namespace.");
+W("This meta-data is provided by the user at the time that the pseudonym was 
created.");
+W("The meta-data is published in what is called a namespace advertisement.");
+W("These advertisements are exchanged within GNUnet in two ways.");
+W("First, the 'all-zeros' content identifier in the namespace always contains 
the advertisement (if it exists).");
+W("This allows for a simply lookup of the description for a given namespace.");
+W("More importantly, the advertisement can also be found using normal 
keyword-searches.");
+W("This way, users can learn about new namespaces without relying on 
out-of-band communication or directories.");
+W("When a pseudonym is created, the namespace is by default advertised under 
the keyword <tt>namespace</tt>.");
+W("When a keyword-search finds a namespace advertisement, it is automatically 
stored in the local GNUnet state-database.");
+W("The advertisement is preserved for tools like <tt>gnunet-pseudonym</tt> and 
<tt>gnunet-gtk</tt> that can reproduce them when appropriate.");
+EP();
+H5("Meta-data in the namespace advertisement");
+BP();
+W("While the namespace is uniquely identified by its ID, another way to refer 
to the namespace is to use the NICKNAME.");
+W("The NICKNAME can be freely chosen by the creator of the namespace and hence 
conflicts are possible.");
+W("If a GNUnet client learns about more than one namespace using the same 
NICKNAME, the ID is appended to the NICKNAME to get a unique identifier.");
+W("The advertisement also contains meta-data describing the content of the 
namespace.");
+W("Naturally all of this information is <tt>optional</tt> and maybe 
<tt>incorrect</tt> since it is provided by the user and cannot be verified.");
+W("An item of particular interest in the namespace advertisement is the 
ROOT.");
+W("The ROOT is the identifier of a designated file in the namespace.");
+W("The idea is that the ROOT can be used to advertise an entry point to the 
content of the namespace.");
+P();
+W("Note that currently all of the meta-data must be provided at the time where 
the namespace is created and cannot be updated later.");
+W("Furthermore, the namespace advertisement can only be published under a 
single keyword (this is purely a UI limitation).");
+EP();
+
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/user_chat.php3
===================================================================
--- GNUnet-docs/WWW/test/user_chat.php3 2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/user_chat.php3 2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,15 +1,15 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: gnunet-chat";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-
-H2("gnunet-chat");
-BP();
-W("A rudimentary chat client has been implemented as reference code for how to 
implement other applications on top of the GNUnet peer-to-peer 
infrastructure.");
-W("At this point, it merely broadcasts messages to all other chat clients.");
-W("It is not really in any useable state.");
-
-EP();
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: gnunet-chat";
+$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
+include("html_header.php3");
+
+H2("gnunet-chat");
+BP();
+W("A rudimentary chat client has been implemented as reference code for how to 
implement other applications on top of the GNUnet peer-to-peer 
infrastructure.");
+W("At this point, it merely broadcasts messages to all other chat clients.");
+W("It is not really in any useable state.");
+
+EP();
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/user_gnunet.php3
===================================================================
--- GNUnet-docs/WWW/test/user_gnunet.php3       2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/user_gnunet.php3       2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,532 +1,554 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: GNUnet core";
-$description="GNUnet Documentation - a secure peer-to-peer framework starring 
anonymous file sharing with an excess based trust-economy";
-include("html_header.php3");
-H2("GNUnet Documentation: GNUnet core");
-?>
-<ul>
- <li><a href="#installation"><?php W("Installation"); ?></a></li>
- <li><a href="#gnunet.conf"><?php W("The configuration file gnunet.conf"); 
?></a></li>
- <li><a href="#coretools"><?php W("GNUnet core tools"); ?></a>
-  <ul>
-   <li><a href="#transportcheck">gnunet-transport-check</a></li>
-   <li><a href="#stats">gnunet-stats</a></li>
-   <li><a href="#peerinfo">gnunet-peer-info</a></li>
-  </ul>
- </li>
-</ul>
-<?php
-ANCHOR("installation");
-H3("Installation");
-BP();
-W("First, in addition to the %s you must download the latest version of %s and 
install that library.",
-  ARRAY(intlink_("download.php3", "GNUnet sources"),
-       extlink_("/libextractor/", "libextractor")));
-W("Libextractor requires glib (also required for GNUnet) and zlib (compression 
library, highly likely that you already have it).");
-W("Installing libextractor should be as simple as:");
-EP();
-PRE("# ./configure --prefix=\$HOME\n" .
-    "# make\n" .
-    "# make install\n");
-BP();
-W("For GNUnet, you should install gtk+ and either mysql or sqlite.");
-W("Now compile and install GNUnet using:");
-EP();
-PRE("# ./configure --prefix=\$HOME --with-extractor=\$HOME\n" .
-    "# make\n" .
-    "# make install\n");
-BP();
-W("Now test the installation using");
-EP();
-PRE("# gnunet-transport-check\n");
-BP();
-W("As a side-effect, this will generate the configuration file 
<tt>/etc/gnunet.conf</tt>.");
-W("If the test fails, you should edit the file to configure your network.");
-W("If you are using the mysql database, edit the configuration from the 
default (sqlite) to mysql.");
-W("After changing the configuration, you should always run 
<tt>gnunet-update</tt> to allow GNUnet to perform necessary internal updates.");
-W("Once configuration is complete and <tt>gnunet-update</tt> is done, start 
the server using:");
-EP();
-PRE("# gnunetd -d\n");
-BP();
-W("The &quot;-d&quot; option causes <tt>gnunetd</tt> to print all errors to 
the console and prevents <tt>gnunetd</tt> from detaching from the console.");
-W("If you get no error messages, press &quot;CTRL-C&quot; to abort 
<tt>gnunetd</tt> and restart it without the &quot;-d&quot; option.");
-W("Without the option, <tt>gnunetd</tt> will detach from the terminal and 
write errors into the logfile.");
-P();
-
-W("If you get any errors, you may have to edit the configuration file.");
-W("Likely problems are the network configuration (see below) and problems with 
the database used by the anonymous file sharing application (see %s)",
-  intlink_("user_afs.php3",
-          "Configuration and Usage of the Anonymous File Sharing 
Application"));
-W("Use the log-files and the tools described below to diagnose problems.");
-W("You may also want to increase the verbosity of the logging using the 
parameter &quot;-L DEBUG&quot;.");
-W("Read the man pages for additional information about command line options.");
-P();
-
-W("GNUnet typically requires the configuration of three basic layers.");
-w("On the lowest layer, you need to configure the transport services that 
allow GNUnet to communicate with other peers.");
-W("A simple example is the specification of the port number used by a TCP or 
UDP transport.");
-
-W("The GNUnet core needs to know certain resource limitations, such as CPU 
load and bandwidth usage.");
-W("Both the configuration of the transport services and the GNUnet core are 
described below.");
-W("Finally, the applications run on top of GNUnet may also require some 
configuration.");
-P();
-
-W("If you want to automatically start GNUnet each time your machine boots 
<tt>contrib/initgnunet</tt> contains an example script to start the server as 
user <em>gnunet</em> with a configuation in <tt>/etc/gnunet.conf</tt>.");
-W("If you installed a binary package, the installer probably already put the 
start-script into &quot;/etc/init.d/gnunetd&quot; or the appropriate location 
for your system.");
-W("Still, even in that case, you may have to activate the script.");
-EP();
-
-HR();
-
-ANCHOR("files");
-H3("The GNUnet configuration files");
-ANCHOR("gnunet.conf");
-
-BP();
-W("When a required configuration file is not present on startup, any GNUnet 
tool will attempt to create one by dumping a copy of the respective default 
configuration file to that location.");
-W("The option <tt>-c</tt> can be used for any GNUnet tool to specify an 
alternative location for the configuration file.");
-W("GNUnet uses two different configuration files (with the same syntax but 
different options), one for the server (<tt>gnunetd</tt>) and another one for 
all of the clients.");
-W("The rationale is that typcially the system administratr will setup 
<tt>gnunetd</tt> while ordinary users are executing the clients.");
-W("The default location for the configuration of <tt>gnunetd</tt> is 
<tt>/etc/gnunet.conf</tt>.");
-W("A few tools that help setup and diagnose the daemon (like 
<tt>gnunet-transport-check</tt>) also use this configuration file.");
-W("A template for this configuration is in <tt>contrib/gnunet.root</tt>.");
-W("The GNUnet clients (like <tt>gnunet-insert</tt> or <tt>gnunet-gtk</tt>) use 
a different configuration file.");
-W("All GNUnet clients expect this file to reside by default in 
<tt>\$HOME/.gnunet/gnunet.conf</tt>.");
-W("A template for this file is in <tt>contrib/gnunet.user</tt>.");
-W("If the configuration file is not found, all GNUnet tools will use the 
default configuration file and write that configuration to the location where 
the configuration file was expected.");
-W("So you can always revert to the default configuration file by deleting or 
renaming the existing file.");
-
-EP();
-
-ANCHOR("serveroptions"); H3("Server options");
-
-BP();
-W("All of the options described here refer to the server configuration.");
-W("This section describes the most important options to setup 
<tt>gnunetd</tt>.");
-W("If you are on dialup, look at %s and probably %s.",
-  ARRAY(extlink_("#gnunet.conf.heloexpires", "HELOEXPIRES"),
-       extlink_("#gnunet.conf.interfaces", "INTERFACES")));
-W("If you are behind a NAT box, look at %s.",
-  extlink_("#gnunet.conf.ip", "IP"));
-W("If you are a frontier host that is accessible from a trusted LAN and 
connected to the Internet, have a look at %s, %s and %s.",
-  ARRAY(extlink_("#gnunet.conf.trusted", "TRUSTED"),
-       extlink_("#gnunet.conf.blacklist", "BLACKLIST"),
-       extlink_("#gnunet.conf.heloexchange", "HELOEXCHANGE")));
-P();
-W("The configuration of the SMTP transport layer is described %s",
-  intlink_("smtp.php3","here"));
-EP();
-
-ANCHOR("gnunet.conf.port");H4("NETWORK: PORT");
-
-BP();
-W("With this option, you can specify to which TCP port the gnunet-clients 
should connect.");
-W("It is also the choice of the port for <tt>gnunetd</tt>.");
-W("While you can restrict access to this port using the %s option, you may 
also want to firewall this port.",
-  extlink_("#gnunet.conf.trusted", "NETWORK: TRUSTED"));
-W("A different port must be used for the TCP and UDP peer-to-peer transport 
mechanism.");
-W("The default value is <tt>2087</tt>.");
-
-EP();
-ANCHOR("gnunet.conf.interface");H4("NETWORK: INTERFACE");
-
-BP();
-W("Use this option to specify which interface GNUnet should use to try to 
determine your IP.");
-W("The interface is also used to determine the network load.");
-W("Alternatively, you can use the %s option.",
-  extlink_("#gnunet.conf.ip", "IP"));
-W("If both an interface and an IP is specified, the IP option takes 
preference.");
-
-EP();
-ANCHOR("gnunet.conf.ip");H4("NETWORK: IP");
-
-BP();
-W("This option allows you to specify the advertised IP.");
-W("If you do not specify anything, GNUnet will attempt to detect the IP.");
-W("You really need this option if you are behind a NAT box.");
-W("In that case, you have to specify the IP of the NAT box here (you can use a 
hostname, DNS is supported).");
-W("For NAT boxes with changing IP, you may want to use %s.",
-  extlink_("http://www.technopagan.org/dynamic/";, "Dynamic DNS"));
-
-EP();
-ANCHOR("gnunet.conf.heloexchange");H4("NETWORK: HELOEXCHANGE");
-
-BP();
-W("If you set this option to <tt>NO</tt> your node will not forward HELO 
messages that advertise other nodes.");
-W("This option only makes sense if your node bridges two networks that both 
contain GNUnet nodes but that can not contact each other directly.");
-W("The default value is <tt>YES</tt>.");
-W("Stick to the default if you are unsure.");
-
-EP();
-ANCHOR("gnunet.conf.trusted");H4("NETWORK: TRUSTED");
-
-BP();
-W("With this option you can specfiy which addresses are trusted enough to 
connect to gnunetd via TCP as clients.");
-W("The default is only the local host.");
-W("If you are on a trusted LAN, you may want to specify the LAN network and 
netmask.");
-W("You must use IPs, DNS lookup is not supported.");
-
-EP();
-ANCHOR("gnunet.conf.interfaces");H4("LOAD: INTERFACES");
-
-BP();
-W("Under this option you specify which interfaces GNUnet is going to monitor 
to determine the load.");
-W("If you have ethernet, the default is <tt>eth0</tt>.");
-W("If you have a modem, try <tt>ppp0</tt>.");
-W("In general, the command <tt>ifconfig</tt> (may not be in your path if you 
are logged in as a normal user, try <tt>/sbin/ifconfig</tt>) will show you the 
active devices.");
-
-EP();
-ANCHOR("gnunet.conf.basiclimiting");H4("LOAD: BASICLIMITING");
-
-BP();
-W("Use basic bandwidth limitation?");
-W("YES or NO.");
-W("The basic method notes only gnunet traffic and can be used to specify 
simple maximum bandwidth usage of GNUnet.");
-W("Choose the basic method if you don&rsquo;t want other network traffic to 
interfere with GNUnets operation, but still wish to constrain gnunet&rsquo;s 
bandwidth usage, or if you can&rsquo;t reliably measure the maximum 
capabilities of your
-connection.");
-W("The basic method might also be good when the used interface can transmit 
data to/from local network very fast compared to internet traffic (a condition 
that makes the advanced method unreliable).");
-
-P();
-
-W("The advanced bandwidth limitation measures total traffic over the chosen 
interface (including GNUnet traffic), and allows gnunetd to participate if the 
total traffic is low enough.");
-
-EP();
-ANCHOR("gnunet.conf.maxnetbpsuptotal");H4("LOAD: MAXNETBPSUPTOTAL");
-
-BP();
-W("If you use basic bandwidth limitation, this option specifies the maximum 
GNUnet can use for its internal traffic.");
-W("When using advanced limiting, use this option to specify your maximum 
upload speed (how many bytes per second your node can send).");
-W("In that case, do not specify how much you want GNUnet to use, but use the 
maximum theoretically available.");
-W("If you do not know your bandwidth, stick with the default of 50.000 
bytes.");
-
-EP();
-ANCHOR("gnunet.conf.maxnetbpsdowntotal");H4("LOAD: MAXNETBPSDOWNTOTAL");
-
-BP();
-W("Same as %s but for download speeds.",
-  extlink_("#gnunet.conf.maxnetbpsuptotal", "MAXNETBPSUPTOTAL"));
-W("Note that GNUnet can not control exactly how much data other nodes are 
sending to your machine (an approximate control is attempted, but malicious 
peers can always ignore the protocol and send more data).");
-W("The upload limit is strictly enforced.");
-W("If we are above our boundaries for the download limits, GNUnet will notify 
peers to reduce the amount of traffic until we are back inside the limits.");
-W("Note that if you disable BASICLIMITING, GNUnet will sense if non-GNUnet 
traffic is going on and only use the specified amount of bandwidth if you are 
not using it otherwise.");
-
-EP();
-ANCHOR("gnunet.conf.maxcpuload");H4("LOAD: MAXCPULOAD");
-
-BP();
-W("Up to which CPU load will GNUnet process packets from other nodes.");
-W("If the average CPU load goes over this value (like for the network, this 
includes other applications), GNUnet will start dropping packets and reduce the 
load.");
-W("GNUnet may also do fewer of the expensive message-packing computations, 
trading bandwidth for CPU time.");
-W("For example, if you are running an application that takes up all of your 
CPU power, GNUnet will pretty much not serve any other nodes (the node is 
considered <em>busy</em>).");
-W("Only if the load is under the value specified here, GNUnet will serve other 
nodes.");
-W("The default is 50, which should keep your hosts responsive enough while 
being more than sufficient for GNUnet on any modern machine.");
-
-EP();
-ANCHOR("gnunet.conf.udp.port");H4("UDP: PORT");
-
-BP();
-W("Which port should the UDP transport layer use?");
-W("If no value is specified, GNUnet will try to find a port in 
<tt>/etc/services</tt>.");
-W("If you specify 0, this means that you do not want to open UDP for receiving 
messages (but, if you load the transport module, you can still send UDP 
traffic).");
-W("The default port is 2086 as assigned to GNUnet by %s.",
-  extlink_("http://www.iana.org";, "IANA"));
-W("Since other peers will try to connect to this port, you should configure 
your firewall to let all traffic through.");
-W("UDP is a stateless protocol, thus just allowing <tt>related</tt> traffic in 
a stateful firewall will not be sufficient.");
-
-EP();
-ANCHOR("gnunet.conf.blacklist");H4("UDP: BLACKLIST");
-
-BP();
-W("If your node receives advertisements for nodes on virtual private networks, 
it should not even attempt to connect to those networks.");
-W("You can use this option to specify a list of networks that are forbidden.");
-W("gnunetd will then never attempt to communicate with these addresses.");
-W("You will get an error if your own IP address is listed here.");
-
-EP();
-ANCHOR("gnunet.conf.udp.mtu");H4("UDP: MTU");
-
-BP();
-W("This option specifies the maximum transfer unit, the maximum number of 
bytes that GNUnet will put in a UDP packet.");
-W("This does not include the IP or UDP headers.");
-W("Do not use more than your OS (and firewall) can support.");
-W("Typcially, your want to avoid fragmentation and should choose network-MTU 
minus 28.");
-W("You can determine your MTU using the <tt>ifconfig</tt> command.");
-W("For ethernet, the network MTU should be 1500 octets, resulting in 1472 
octets for the GNUnet MTU, which is also the default.");
-W("Do not use values smaller than 1200.");
-EP();
-
-ANCHOR("gnunet.conf.tcp.port");H4("TCP: PORT");
-
-BP();
-W("Which port should the TCP transport layer use?");
-W("If no value is specified, GNUnet will try to find a port in 
<tt>/etc/services</tt>.");
-W("If you specify 0, this means that you do not want to open TCP for receiving 
messages (but, if you load the transport module, you can still initiate 
bi-directional TCP connections).");
-W("Setting the TCP port to 0 is a common configuration for machines behind NAT 
boxes (these peers can then still initiate connections but other nodes will not 
attempt to connect).");
-W("The default port is 2086 as assigned to GNUnet by %s.",
-  extlink_("http://www.iana.org";, "IANA"));
-W("Since other peers will try to connect to this port, you should configure 
your firewall to let all traffic through.");
-W("Make sure that the port number you select here does not conflict with the 
client TCP port.");
-
-EP();
-ANCHOR("gnunet.conf.blacklist");H4("TCP: BLACKLIST");
-BP();
-W("If your node receives advertisements for nodes on virtual private networks, 
it should not even attempt to connect to those networks.");
-W("You can use this option to specify a list of networks that are forbidden.");
-W("gnunetd will then never attempt to communicate with these addresses.");
-W("You will get an error if your own IP address is listed here.");
-
-EP();
-ANCHOR("gnunet.conf.tcp.mtu");H4("TCP: MTU");
-
-BP();
-W("This option specifies the maximum transfer unit, the maximum number of 
bytes that GNUnet will put in a TCP packet.");
-W("This does not include the IP or TCP headers.");
-W("Typcially, your want to avoid fragmentation and should choose network-MTU 
minus 40.");
-W("For ethernet, this would result in 1460 octets, which is also the 
default.");
-W("Do not use less than 1200.");
-
-EP();
-ANCHOR("gnunet.conf.nat.limited"); H4("NAT: LIMITED");
-
-BP();
-W("The NAT transport allows connections between machines using network-address 
translation (NAT) and &quot;normal&quot; peers with a globally unique IP 
address.");
-W("Thus in practice, all GNUnet peers that support TCP should also load the 
NAT transport service, either since they need it to connect themselves or 
because it allows them to connect to other peers that require NAT support.");
-W("NAT support requires loading ethe TCP transport service (IPv4 and/or 
IPv6).");
-W("The only option for the NAT transport is &quot;LIMITED&quot;.");
-W("The default value &quot;NO&quot; is used for peers that 
<strong>either</strong> have a globally routed IP address (are not using NAT at 
all) <strong>or</strong> for peers that advertise the IP of the NAT box and 
where the NAT box forwards the TCP port to the NAT-ed IP in the LAN.");
-W("Only if you can not configure your NAT box to forward the TCP port to your 
local machine you should set LIMITED to &quot;YES&quot;.");
-P();
-W("In summary, there are three possibilities.");
-W("If you use TCP and don&prime;t use NAT on your local network, load the NAT 
transport anyway, set LIMITED to &quot;NO&quot;.");
-W("If you use NAT on your local network and have control over your NAT box, 
configure the NAT box to forward the TCP (and if possibly UDP) ports to the 
machine running <tt>gnunetd</tt>, also load the NAT transport and also set 
LIMITED to &quot;NO&quot;.");
-W("If you use NAT on your local network and do NOT have control over the NAT 
box, you <strong>must</strong> load the TCP and the NAT transport, set the 
TCP-PORT to &quot;0&quot; and LIMITED to &quot;YES&quot;.");
-P();
-W("The last option is the worst since it limits whom you can connect to and 
thus limits your anonymity.");
-W("If you are adventurous, you can supplement the last option with the SMTP 
transport, which is difficult to configure but will allow NAT-to-NAT 
communication.");
-
-EP();
-ANCHOR("gnunet.conf.heloexpires");H4("GNUNETD: HELOEXPIRES");
-BP();
-W("This option specifies how long (in minutes) your node will claim to be 
reachable under the current IP.");
-W("If you have a permanent IP, a couple of days can be a reasonable value.");
-W("If you are on dialup, you may want to choose only an hour.");
-W("The default is 1440 (1 day).");
-W("The largest acceptable value is 14400 (10 days).");
-
-EP();
-ANCHOR("gnunet.conf.loglevel");H4("GNUNETD: LOGLEVEL");
-
-BP();
-W("Loglevel, how much should be logged?");
-W("You can use NOTHING, FATAL, ERROR, FAILURE, WARNING, MESSAGE INFO, DEBUG, 
CRON or EVERYTHING (which log more and more messages in this order).");
-W("Default is WARNING.");
-W("You can override this option at the commandline with the <tt>-L</tt> 
switch.");
-
-EP();
-ANCHOR("gnunet.conf.logfile");H4("GNUNETD: LOGFILE");
-
-BP();
-W("If <tt>gnunetd</tt> is not started with the <tt>-d</tt> option, it writes 
logging messages into this file (with <tt>-d</tt> all messages are written to 
the console).");
-W(" Read this %s if you are using logrotate.",
-  
extlink_("http://mail.gnu.org/archive/html/help-gnunet/2002-08/msg00012.html";, 
"mail"));
-
-EP();
-ANCHOR("gnunet.conf.pidfile");H4("GNUNETD: PIDFILE");
-
-BP();
-W("In which file should gnunetd write the process-id of the server?");
-W("If you run gnunetd as root, you may want to choose /var/run/gnunetd.pid.");
-W("It&rsquo;s not the default since gnunetd may not have write rights at that 
location.");
-
-EP();
-ANCHOR("gnunet.conf.hosts");H4("GNUNETD: HOSTS");
-
-BP();
-W("In this directory GNUnet stores the key and last known Internet address of 
each known GNUnet node.");
-W("Each file is about 550 bytes long (different transport protocols may have 
different address sizes).");
-W("A %s of GNUnet hosts can be obtained from the GNUnet webpage.",
- extlink_("download/hosts.tar.gz", "list"));
-W("On startup, GNUnet downloads a list of initial hosts from 
<tt>http://ovmj.org/GNUnet/download/hostlist</tt>.");
-W("This list is generated using");
-EP();
-PRE("# cat ~/.gnunet/data/hosts/* > hostlist");
-
-BP();
-W("Alternative hostlist servers can be used by modifying 
<tt>gnunet.conf</tt>.");
-
-P();
-
-W("Once connected, GNUnet hosts exchange information about other hosts 
automatically.");
-W("Thus except for the initial connection, there should be no pressing need to 
obtain a new list (except if a node was offline for a long time and the old 
list aged so much that it became useless).");
-W("If hosts cannot be reached and the time that the key has been signed to be 
valid by the sender has expired, GNUnet deletes their identities from 
<tt>data/hosts/</tt>.");
-W("Note that the trust information is kept &quot;forever&quot;.");
-
-EP();
-ANCHOR("gnunet.conf.hostlisturl");H4("GNUNETD: HOSTLISTURL");
-
-BP();
-W("Whenever gnunetd needs to learn about an initial set of peers that it can 
connect to, it downloads a list of initial nodes to connect to via http.");
-W("The URL to use is specified here.");
-
-EP();
-ANCHOR("gnunet.conf.applications");H4("GNUNETD: APPLICATIONS");
-
-BP();
-W("Which applications should gnunetd support?");
-W("Specify the name of the dynamic shared object (DSO) that implements the 
service in the gnunetd core here.");
-W("Multiple DSOs can be specified, separated by spaces.");
-W("You should always specify &quot;advertising getoption topology&quot; since 
these are rather fundamental applications.");
-W("Add &quot;stats&quot; in order to be able to obtain statistics using 
<tt>gnunet-stats</tt>.");
-W("Further additions depend on which specific applications you want to use.");
-W("Possible choices are &quot;%s chat tbench tracekit&quot;.",
-  intlink_("user_afs.php3","fs"));
-
-EP();
-ANCHOR("gnunet.conf.transports");H4("GNUNETD: TRANSPORTS");
-
-BP();
-W("Which transport services should be used?");
-W("Use space-separated list of the modules, for example  &quot;udp smtp 
tcp&quot;.");
-W("If you want to use SMTP, please read the %s for details.",
-  intlink_("smtp.php3","SMTP documentation"));
-
-P();
-W("The <tt>contrib/</tt> directory contains a %s for the configuration that 
should be self-explanatory.",
-  extlink_("gnunet.conf","template"));
-
-EP();
-HR();
-
-ANCHOR("clientoptions"); H3("Client options");
-
-ANCHOR("gnunet.conf.host");
-H4("NETWORK: HOST");
-
-BP();
-W("With this option, you can specify to which host the GNUnet clients should 
connect by default.");
-W("You can override the choice you make here with the <tt>-H</tt> option.");
-W("The default, <tt>localhost</tt> should be fine.");
-
-EP();
-
-ANCHOR("gnunet.conf.port");H4("NETWORK: PORT");
-
-BP();
-W("With this option, you can specify to which TCP port the gnunet-clients 
should connect.");
-W("It is also the choice of the port for <tt>gnunetd</tt>.");
-W("While you can restrict access to this port using the %s option, you may 
also want to firewall this port.",
-  extlink_("#gnunet.conf.trusted", "NETWORK: TRUSTED"));
-W("A different port must be used for the TCP and UDP peer-to-peer transport 
mechanism.");
-W("The default value is <tt>2087</tt>.");
-EP();
-
-HR();
-
-ANCHOR("coretools");
-H3("GNUnet core tools");
-
-ANCHOR("transportcheck");
-H4("gnunet-transport-check");
-
-BP();
-W("The <tt>gnunet-transport-check</tt> tool checks if a transport is 
configured correctly.");
-W("By default the tool checks if the transport is at least able to send a 
message to its own address.");
-W("This test is called the <em>loopback mode</em>.");
-W("This mode is useful to check basic transport functionality when new 
transports are implemented or when GNUnet is ported to a new platform.");
-W("By default, <tt>gnunet-transport-check</tt> tests all the transports that 
are currently specified in the configuration file.");
-P();
-W("With the option <tt>-p</tt> it is possible to run 
<tt>gnunet-transport-check</tt> in <em>ping mode</em>.");
-W("In ping mode <tt>gnunet-transport-check</tt> performs an http download of 
the peer list specified in the configuration (HOSTLISTURL option) and attempts 
to connect to each of these peers (if a matching transport is configured).");
-W("This way the tool is able to catch a variety of problems, including 
problems relating to NAT boxes, the firewall configuration and virtual private 
networks (VPNs).");
-W("Note that it is perfectly normal that not all peers from the hostlist can 
be reached, but for both common transports (tcp and udp) at least a few should 
succeed.");
-W("The default time that <tt>gnunet-transport-check</tt> waits for a reply is 
15s.");
-W("For a quick test the timeout can be reduced, for example to 500 ms with the 
option <tt>-T 500</tt>.");
-P();
-W("Note that you can not run <tt>gnunet-transport-check</tt> while 
<tt>gnunetd</tt> is running!");
-W("You must stop <tt>gnunetd</tt> before testing transports.");
-W("The output of <tt>gnunet-transport-check</tt> looks something like this:");
-EP();
-
-PRE("$ gnunet-transport-check\n" .
-    "Testing transport(s) udp tcp\n" .
-    "Transport OK, 0ms for 1 messages of size 11 bytes.\n" .
-    "Transport OK, 0ms for 1 messages of size 11 bytes.\n");
-
-BP();
-W("And for ping mode:");
-EP();
-
-PRE("$ gnunet-transport-check -p\n" .
-    "Available transport(s): udp tcp\n" .
-    ".....................\n" .
-    "8 out of 21 peers contacted successfully (0 times transport 
unavailable).\n");
-
-ANCHOR("peerinfo");
-H4("gnunet-peer-info");
-
-BP();
-W("The <tt>gnunet-peer-info</tt> tool displays the internet addresses and the 
identities of all GNUnet peers that the local peer is aware of.");
-W("The output looks like this:");
-EP();
-
-PRE("$ gnunet-peer-info\n" .
-    "F149393582FDEF31BB745ACD7AE21D9B65CFAC09 at address 121.49.31.144:2086 
(TCP)\n" .
-    "B58DC6FC400042A54CDD830C403216C3BCDC9DDC at address 92.57.67.117:2086 
(TCP)\n" .
-    "2F7A9C9A4D62E128EDD5D444346F129F9916CAC8 at address 10.54.15.110:2086 
(TCP)\n" .
-    "1BA51B8DFC0D3B055D3ACB237CA162BD770E46C9 at address 31.272.130.13:2086 
(TCP)\n" .
-    "FC9DEC9C16919AA31B1085C6DA14EF04A0B91CB5 at address 47.7.61.33:2086 
(TCP)\n" .
-    "A825E479D9B0A955AC401BEEA3D5CA7BE92B78D1 at address 101.182.95.42:2086 
(TCP)\n" .
-    "7DC4C7B9C295ADD8D15FC5253457F53DAC20D0E1 at address 221.13.9.90:2086 
(TCP)\n" .
-    "3507BFAFFD3C05BA13F512C78456C4D3035E6948 at address 164.175.1.19:2086 
(TCP)\n" .
-    "CB6DB904F1C519D30317470193B701D014703004 at address 124.15.21.31:2086 
(TCP)\n" .
-    "9CB8D759542525AE7E06ADD8239150325B81DEB9 at address 107.117.351.44:2086 
(TCP)\n" .
-    "087C52178DEAE7502983AA174D9FEE373608C7FE at address 95.15.1.71:2086 
(TCP)\n" .
-    "42F91CAB229B3119F80A0D447A12FE867B60895F at address 23.99.191.24:2086 
(TCP)\n" .
-    "8E846CAA7B75C1F88D3ADF94FCC89D6C8C95E1FF at address 85.42.211.167:2086 
(TCP)\n");
-
-ANCHOR("stats");H4("gnunet-stats");
-
-BP();
-W("<tt>gnunet-stats</tt> is a little tool that displays statistics.");
-W("Unlike the other core tools, it uses the client configuration and only 
works if <tt>gnunetd</tt> is already running.");
-W("<tt>gnunet-stats</tt> also only works if the <tt>stats</tt> module is 
loaded as an application.");
-W("The numbers are for the current gnunetd process only.");
-W("The output looks similar to the following example, but depends on which 
modules you have loaded and what your node has been doing so far.");
-EP();
-
-PRE("$ gnunet-stats\n" .
-    "Uptime (seconds)                                            :             
  47\n" .
-    "% of allowed network load                                   :             
   0\n" .
-    "% of allowed cpu load                                       :             
   0\n" .
-    "# bytes of noise received                                   :             
   0\n" .
-    "# bytes received from clients                               :             
   8\n" .
-    "# times outgoing msg sent (bandwidth ok)                    :             
   0\n" .
-    "# times outgoing msg dropped (bandwidth stressed)           :             
   0\n" .
-    "# times incoming msg accepted (cpu ok)                      :             
   0\n" .
-    "# times incoming msg dropped (cpu overloaded)               :             
   0\n" .
-    "# sessionkeys received                                      :             
   0\n" .
-    "# valid sessionkeys received                                :             
   0\n" .
-    "# sessionkeys sent                                          :             
   0\n" .
-    "# connections shutdown                                      :             
   0\n" .
-    "# currently connected nodes                                 :             
   0\n" .
-    "# bytes noise sent                                          :             
   0\n" .
-    "# encrypted bytes sent                                      :             
   0\n" .
-    "# bytes decrypted                                           :             
   0\n" .
-    "# ping messages sent                                        :             
   0\n" .
-    "# ping messages received                                    :             
   0\n" .
-    "# pong messages sent                                        :             
   0\n" .
-    "# pong messages received                                    :             
   0\n" .
-    "# HELO messages received from http server                   :             
  34\n" .
-    "# HELO messages received overall                            :             
   1\n" .
-    "# valid HELO messages received                              :             
   0\n" .
-    "# HELO messages forwarded from other peers                  :             
   0\n" .
-    "# HELO messages originated                                  :             
   0\n");
-
-BP();
-W("The number of connected hosts is the nummber of hosts that the local node 
is directly connected to (1 hop).");
-W("The total number of hosts in the network must be larger or equal to this 
number.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: GNUnet core setup";
+$description="How to configure the GNUnet peer-to-peer framework (excluding 
GNUnet applications)";
+include("html_header.php3");
+H2("GNUnet Documentation: GNUnet core");
+?>
+<ul>
+ <li><a href="#installation"><?php W("Installation"); ?></a></li>
+ <li><a href="#gnunet.conf"><?php W("The configuration file gnunet.conf"); 
?></a></li>
+ <li><a href="#coretools"><?php W("GNUnet core tools"); ?></a>
+  <ul>
+   <li><a href="#transportcheck">gnunet-transport-check</a></li>
+   <li><a href="#stats">gnunet-stats</a></li>
+   <li><a href="#peerinfo">gnunet-peer-info</a></li>
+  </ul>
+ </li>
+</ul>
+<?php
+ANCHOR("installation");
+H3("Installation");
+BP();
+W("First, in addition to the %s you must download the latest version of %s and 
install that library.",
+  ARRAY(intlink_("download.php3", "GNUnet sources"),
+       extlink_("/libextractor/", "libextractor")));
+W("libextractor has itself various mandatory and optional dependencies.");
+W("Please check the dependency list, both GNUnet and libextractor contain a 
file README.debian that lists the current package dependencies for Debian.");
+W("There maybe files for other distributions, or you might be able to find 
equivalent packages for your distribution.");
+W("Installing libextractor should be as simple as:");
+EP();
+PRE("$ ./configure --prefix=\$HOME\n" .
+    "$ make\n" .
+    "# make install\n");
+BP();
+W("For GNUnet, you should again check the dependency list.");
+W("Now compile and install GNUnet using:");
+EP();
+PRE("$ ./configure --prefix=\$HOME --with-extractor=\$HOME\n" .
+    "$ make\n" .
+    "# make install\n");
+BP();
+
+W("Finally, you probably want to compile <tt>gnunet-gtk</tt>:");
+EP();
+PRE("$ ./configure --prefix=\$HOME --with-extractor=\$HOME 
--with-gnunet=\$HOME\n" .
+    "$ make\n" .
+    "# make install\n");
+BP();
+W("If you are updating from a version from the 0.7.x series, you should (after 
stopping gnunetd) run:");
+EP();
+PRE("# gnunet-update\n");
+BP();
+W("This should trigger all necessary changes.");
+W("If you are updating from a version before 0.7.0pre2, you must delete your 
old GNUnet directories.");
+W("Note that you will also have to run <tt>gnunet-update</tt> after certain 
changes to the <tt>gnunetd.conf</tt> configuration file.");
+W("<tt>gnunetd</tt> will immediately exit with an error message if 
<tt>gnunet-update</tt> must be run.");
+
+P();
+
+W("If you are using GNUnet for the first time (or if you deleted all of your 
old files) you will probably want to run <tt>gnunet-setup</tt> at this point.");
+W("The setup tool supports various styles of user interfaces.");
+W("Invoke <tt>gnunet-setup</tt> without arguments to see the various styles 
supported on your platform.");
+W("Using one of the wizards should allow a quick initial configuration.");
+
+P();
+
+W("After finishing the configuration with <tt>gnunet-setup</tt>, you can test 
the installation using");
+EP();
+PRE("# gnunet-transport-check\n");
+PRE("# gnunet-transport-check -p\n");
+BP();
+W("The first command tests your local transports (basics), the second one 
connectivity to the rest of the peer-to-peer network (ping).");
+W("If the test fails (i.e. <tt>gnunet-transport-check -p</tt> reports being 
able to connect to 0 peers), you should revisit your configuration, in 
particular your network setup.");
+W("Again, after changing the configuration, you should always run 
<tt>gnunet-update</tt> to allow GNUnet to perform necessary internal updates.");
+W("Note that it is <tt>normal</tt> for the NAT transport to be reported as 
not-working in some configurations.");
+W("Once configuration is complete and <tt>gnunet-update</tt> is done, start 
the server using:");
+EP();
+PRE("# gnunetd -d\n");
+BP();
+W("The &quot;-d&quot; option causes <tt>gnunetd</tt> to print all errors to 
the console and prevents <tt>gnunetd</tt> from detaching from the console.");
+
+W("If you get any errors, you may have to edit the configuration file.");
+W("Some errors maybe related to the specific applications that are being used, 
so consult the documentation there.");
+W("Use the log-files and the tools described below to diagnose problems.");
+W("You may also want to increase the verbosity of the logging using the 
parameter &quot;-L DEBUG&quot;.");
+W("Read the man pages for additional information about command line options.");
+P();
+W("Once everything works and you get no error messages, press 
&quot;CTRL-C&quot; to abort <tt>gnunetd</tt> and restart it without the 
&quot;-d&quot; option.");
+W("Without the option, <tt>gnunetd</tt> will detach from the terminal and 
write errors into the logfile.");
+P();
+W("If you want to automatically start GNUnet each time your machine boots 
<tt>contrib/initgnunet</tt> contains an example script to start the server as 
user <em>gnunet</em> with a configuation in <tt>/etc/gnunet.conf</tt>.");
+W("If you installed a binary package, the installer probably already put the 
start-script into &quot;/etc/init.d/gnunetd&quot; or the appropriate location 
for your system.");
+W("Still, even in that case, you may have to activate the script.");
+
+EP();
+
+H3("General notes about the configuration");
+BP();
+
+W("GNUnet typically requires the configuration of four basic layers.");
+w("On the lowest layer, you need to configure the transport services that 
allow GNUnet to communicate with other peers.");
+W("A simple example is the specification of the port number used by a TCP or 
UDP transport.");
+
+W("The GNUnet core needs to know certain resource limitations, such as CPU 
load and bandwidth usage.");
+W("Both the configuration of the transport services and the GNUnet core are 
described below.");
+W("Additionally, the applications run on top of GNUnet may also require some 
configuration.");
+W("Finally, the user interface(s) that are used to interact with 
<tt>gnunetd</tt> are configured in a per-user configuration file.");
+EP();
+
+HR();
+
+ANCHOR("files");
+H3("The GNUnet configuration files");
+ANCHOR("gnunet.conf");
+
+BP();
+W("When a required configuration file is not present on startup, any GNUnet 
tool will attempt to create one by dumping a copy of the respective default 
configuration file to that location.");
+W("The option <tt>-c</tt> can be used for any GNUnet tool to specify an 
alternative location for the configuration file.");
+W("GNUnet uses two different configuration files (with the same syntax but 
different options), one for the server (<tt>gnunetd</tt>) and another one for 
all of the clients.");
+W("The rationale is that typcially the system administrator will setup 
<tt>gnunetd</tt> while ordinary users are executing the clients.");
+P();
+W("The default location for the configuration of <tt>gnunetd</tt> is 
<tt>/etc/gnunetd.conf</tt>.");
+W("If <tt>gnunetd</tt> is run as an ordinary user and cannot access a 
configuration in <tt>/etc/gnunetd.conf</tt> it will automatically fall back to 
<tt>\$HOME/.gnunet/gnunetd.conf</tt>.");
+W("A few tools that help setup and diagnose the daemon (like 
<tt>gnunet-transport-check</tt>) also use this configuration file.");
+W("A template for this configuration is in <tt>contrib/gnunet.root</tt>.");
+P();
+W("The GNUnet clients (like <tt>gnunet-insert</tt> or <tt>gnunet-gtk</tt>) use 
a different configuration file.");
+W("All GNUnet clients expect this file to reside by default in 
<tt>\$HOME/.gnunet/gnunet.conf</tt>.");
+W("A template for this file is in <tt>contrib/gnunet.user</tt>.");
+W("If the configuration file is not found, all GNUnet tools will use the 
default configuration file and write that configuration to the location where 
the configuration file was expected.");
+W("So you can always revert to the default configuration file by deleting or 
renaming the existing file.");
+
+EP();
+
+ANCHOR("serveroptions"); H3("Server options");
+
+BP();
+W("All of the options described here refer to the server configuration.");
+W("This section describes the most important options to setup 
<tt>gnunetd</tt>.");
+W("If you are on dialup, look at %s and probably %s.",
+  ARRAY(extlink_("#gnunet.conf.helloexpires", "HELLOEXPIRES"),
+       extlink_("#gnunet.conf.interfaces", "INTERFACES")));
+W("If you are behind a NAT box, look at %s.",
+  extlink_("#gnunet.conf.ip", "IP"));
+W("If you are a frontier host that is accessible from a trusted LAN and 
connected to the Internet, have a look at %s, %s and %s.",
+  ARRAY(extlink_("#gnunet.conf.trusted", "TRUSTED"),
+       extlink_("#gnunet.conf.blacklist", "BLACKLIST"),
+       extlink_("#gnunet.conf.heloexchange", "HELLOEXCHANGE")));
+P();
+W("The configuration of the SMTP transport layer is described %s",
+  intlink_("smtp.php3","here"));
+EP();
+
+ANCHOR("gnunet.conf.port");H4("NETWORK: PORT");
+
+BP();
+W("With this option, you can specify to which TCP port the gnunet-clients 
should connect.");
+W("It is also the choice of the port for <tt>gnunetd</tt>.");
+W("While you can restrict access to this port using the %s option, you may 
also want to firewall this port.",
+  extlink_("#gnunet.conf.trusted", "NETWORK: TRUSTED"));
+W("A different port must be used for the TCP and UDP peer-to-peer transport 
mechanism.");
+W("The default value is <tt>2087</tt>.");
+
+EP();
+ANCHOR("gnunet.conf.interface");H4("NETWORK: INTERFACE");
+
+BP();
+W("Use this option to specify which interface GNUnet should use to try to 
determine your IP.");
+W("The interface is also used to determine the network load.");
+W("Alternatively, you can use the %s option.",
+  extlink_("#gnunet.conf.ip", "IP"));
+W("If both an interface and an IP is specified, the IP option takes 
preference.");
+
+EP();
+ANCHOR("gnunet.conf.ip");H4("NETWORK: IP");
+
+BP();
+W("This option allows you to specify the advertised IP.");
+W("If you do not specify anything, GNUnet will attempt to detect the IP.");
+W("You really need this option if you are behind a NAT box.");
+W("In that case, you have to specify the IP of the NAT box here (you can use a 
hostname, DNS is supported).");
+W("For NAT boxes with changing IP, you may want to use %s.",
+  extlink_("http://www.technopagan.org/dynamic/";, "Dynamic DNS"));
+
+EP();
+ANCHOR("gnunet.conf.helloexchange");H4("NETWORK: HELLOEXCHANGE");
+
+BP();
+W("If you set this option to <tt>NO</tt> your node will not forward HELLO 
messages that advertise other nodes.");
+W("This option only makes sense if your node bridges two networks that both 
contain GNUnet nodes but that can not contact each other directly.");
+W("The default value is <tt>YES</tt>.");
+W("Stick to the default if you are unsure.");
+
+EP();
+ANCHOR("gnunet.conf.trusted");H4("NETWORK: TRUSTED");
+
+BP();
+W("With this option you can specfiy which addresses are trusted enough to 
connect to gnunetd via TCP as clients.");
+W("The default is only the local host.");
+W("If you are on a trusted LAN, you may want to specify the LAN network and 
netmask.");
+W("You must use IPs, DNS lookup is not supported.");
+
+EP();
+ANCHOR("gnunet.conf.interfaces");H4("LOAD: INTERFACES");
+
+BP();
+W("Under this option you specify which interfaces GNUnet is going to monitor 
to determine the load.");
+W("If you have ethernet, the default is <tt>eth0</tt>.");
+W("If you have a modem, try <tt>ppp0</tt>.");
+W("In general, the command <tt>ifconfig</tt> (may not be in your path if you 
are logged in as a normal user, try <tt>/sbin/ifconfig</tt>) will show you the 
active devices.");
+
+EP();
+ANCHOR("gnunet.conf.basiclimiting");H4("LOAD: BASICLIMITING");
+
+BP();
+W("Use basic bandwidth limitation?");
+W("YES or NO.");
+W("The basic method notes only gnunet traffic and can be used to specify 
simple maximum bandwidth usage of GNUnet.");
+W("Choose the basic method if you don&rsquo;t want other network traffic to 
interfere with GNUnets operation, but still wish to constrain gnunet&rsquo;s 
bandwidth usage, or if you can&rsquo;t reliably measure the maximum 
capabilities of your
+connection.");
+W("The basic method might also be good when the used interface can transmit 
data to/from local network very fast compared to internet traffic (a condition 
that makes the advanced method unreliable).");
+
+P();
+
+W("The advanced bandwidth limitation measures total traffic over the chosen 
interface (including GNUnet traffic), and allows gnunetd to participate if the 
total traffic is low enough.");
+
+EP();
+ANCHOR("gnunet.conf.maxnetbpsuptotal");H4("LOAD: MAXNETBPSUPTOTAL");
+
+BP();
+W("If you use basic bandwidth limitation, this option specifies the maximum 
GNUnet can use for its internal traffic.");
+W("When using advanced limiting, use this option to specify your maximum 
upload speed (how many bytes per second your node can send).");
+W("In that case, do not specify how much you want GNUnet to use, but use the 
maximum theoretically available.");
+W("If you do not know your bandwidth, stick with the default of 50,000 bytes 
per second.");
+
+EP();
+ANCHOR("gnunet.conf.maxnetbpsdowntotal");H4("LOAD: MAXNETBPSDOWNTOTAL");
+
+BP();
+W("Same as %s but for download speeds.",
+  extlink_("#gnunet.conf.maxnetbpsuptotal", "MAXNETBPSUPTOTAL"));
+W("Note that GNUnet can not control exactly how much data other nodes are 
sending to your machine (an approximate control is attempted, but malicious 
peers can always ignore the protocol and send more data).");
+W("The upload limit is strictly enforced.");
+W("If we are above our boundaries for the download limits, GNUnet will notify 
peers to reduce the amount of traffic until we are back inside the limits.");
+W("Note that if you disable BASICLIMITING, GNUnet will sense if non-GNUnet 
traffic is going on and only use the specified amount of bandwidth if you are 
not using it otherwise.");
+
+EP();
+ANCHOR("gnunet.conf.maxcpuload");H4("LOAD: MAXCPULOAD");
+
+BP();
+W("Up to which CPU load will GNUnet process packets from other nodes.");
+W("If the average CPU load goes over this value (like for the network, this 
includes other applications), GNUnet will start dropping packets and reduce the 
load.");
+W("GNUnet may also do fewer of the expensive message-packing computations, 
trading bandwidth for CPU time.");
+W("For example, if you are running an application that takes up all of your 
CPU power, GNUnet will pretty much not serve any other nodes (the node is 
considered <em>busy</em>).");
+W("Only if the load is under the value specified here, GNUnet will serve other 
nodes.");
+W("The default is 50, which should keep your hosts responsive enough while 
being more than sufficient for GNUnet on any modern machine.");
+
+EP();
+ANCHOR("gnunet.conf.udp.port");H4("UDP: PORT");
+
+BP();
+W("Which port should the UDP transport layer use?");
+W("If no value is specified, GNUnet will try to find a port in 
<tt>/etc/services</tt>.");
+W("If you specify 0, this means that you do not want to open UDP for receiving 
messages (but, if you load the transport module, you can still send UDP 
traffic).");
+W("The default port is 2086 as assigned to GNUnet by %s.",
+  extlink_("http://www.iana.org";, "IANA"));
+W("Since other peers will try to connect to this port, you should configure 
your firewall to let all traffic through.");
+W("UDP is a stateless protocol, thus just allowing <tt>related</tt> traffic in 
a stateful firewall will not be sufficient.");
+
+EP();
+ANCHOR("gnunet.conf.blacklist");H4("UDP: BLACKLIST");
+
+BP();
+W("If your node receives advertisements for nodes on virtual private networks, 
it should not even attempt to connect to those networks.");
+W("You can use this option to specify a list of networks that are forbidden.");
+W("gnunetd will then never attempt to communicate with these addresses.");
+W("You will get an error if your own IP address is listed here.");
+
+EP();
+ANCHOR("gnunet.conf.udp.mtu");H4("UDP: MTU");
+
+BP();
+W("This option specifies the maximum transfer unit, the maximum number of 
bytes that GNUnet will put in a UDP packet.");
+W("This does not include the IP or UDP headers.");
+W("Do not use more than your OS (and firewall) can support.");
+W("Typcially, your want to avoid fragmentation and should choose network-MTU 
minus 28.");
+W("You can determine your MTU using the <tt>ifconfig</tt> command.");
+W("For ethernet, the network MTU should be 1500 octets, resulting in 1472 
octets for the GNUnet MTU, which is also the default.");
+W("Do not use values smaller than 1200.");
+EP();
+
+ANCHOR("gnunet.conf.tcp.port");H4("TCP: PORT");
+
+BP();
+W("Which port should the TCP transport layer use?");
+W("If no value is specified, GNUnet will try to find a port in 
<tt>/etc/services</tt>.");
+W("If you specify 0, this means that you do not want to open TCP for receiving 
messages (but, if you load the transport module, you can still initiate 
bi-directional TCP connections).");
+W("Setting the TCP port to 0 is a common configuration for machines behind NAT 
boxes (these peers can then still initiate connections but other nodes will not 
attempt to connect).");
+W("The default port is 2086 as assigned to GNUnet by %s.",
+  extlink_("http://www.iana.org";, "IANA"));
+W("Since other peers will try to connect to this port, you should configure 
your firewall to let all traffic through.");
+W("Make sure that the port number you select here does not conflict with the 
client TCP port.");
+
+EP();
+ANCHOR("gnunet.conf.blacklist");H4("TCP: BLACKLIST");
+BP();
+W("If your node receives advertisements for nodes on virtual private networks, 
it should not even attempt to connect to those networks.");
+W("You can use this option to specify a list of networks that are forbidden.");
+W("gnunetd will then never attempt to communicate with these addresses.");
+W("You will get an error if your own IP address is listed here.");
+
+EP();
+ANCHOR("gnunet.conf.tcp.mtu");H4("TCP: MTU");
+
+BP();
+W("This option specifies the maximum transfer unit, the maximum number of 
bytes that GNUnet will put in a TCP packet.");
+W("This does not include the IP or TCP headers.");
+W("Typcially, your want to avoid fragmentation and should choose network-MTU 
minus 40.");
+W("For ethernet, this would result in 1460 octets, which is also the 
default.");
+W("Do not use less than 1200.");
+
+EP();
+ANCHOR("gnunet.conf.nat.limited"); H4("NAT: LIMITED");
+
+BP();
+W("The NAT transport allows connections between machines using network-address 
translation (NAT) and &quot;normal&quot; peers with a globally unique IP 
address.");
+W("Thus in practice, all GNUnet peers that support TCP should also load the 
NAT transport service, either since they need it to connect themselves or 
because it allows them to connect to other peers that require NAT support.");
+W("NAT support requires loading ethe TCP transport service (IPv4 and/or 
IPv6).");
+W("The only option for the NAT transport is &quot;LIMITED&quot;.");
+W("The default value &quot;NO&quot; is used for peers that 
<strong>either</strong> have a globally routed IP address (are not using NAT at 
all) <strong>or</strong> for peers that advertise the IP of the NAT box and 
where the NAT box forwards the TCP port to the NAT-ed IP in the LAN.");
+W("Only if you can not configure your NAT box to forward the TCP port to your 
local machine you should set LIMITED to &quot;YES&quot;.");
+P();
+W("In summary, there are three possibilities.");
+W("If you use TCP and don&prime;t use NAT on your local network, load the NAT 
transport anyway, set LIMITED to &quot;NO&quot;.");
+W("If you use NAT on your local network and have control over your NAT box, 
configure the NAT box to forward the TCP (and if possibly UDP) ports to the 
machine running <tt>gnunetd</tt>, also load the NAT transport and also set 
LIMITED to &quot;NO&quot;.");
+W("If you use NAT on your local network and do NOT have control over the NAT 
box, you <strong>must</strong> load the TCP and the NAT transport, set the 
TCP-PORT to &quot;0&quot; and LIMITED to &quot;YES&quot;.");
+P();
+W("The last option is the worst since it limits whom you can connect to and 
thus limits your anonymity.");
+W("If you are adventurous, you can supplement the last option with the SMTP 
transport, which is difficult to configure but will allow NAT-to-NAT 
communication.");
+
+EP();
+ANCHOR("gnunet.conf.helloexpires");H4("GNUNETD: HELLOEXPIRES");
+BP();
+W("This option specifies how long (in minutes) your node will claim to be 
reachable under the current IP.");
+W("If you have a permanent IP, a couple of days can be a reasonable value.");
+W("If you are on dialup, you may want to choose only an hour.");
+W("The default is 1440 (1 day).");
+W("The largest acceptable value is 14400 (10 days).");
+
+EP();
+ANCHOR("gnunet.conf.loglevel");H4("GNUNETD: LOGLEVEL");
+
+BP();
+W("Loglevel, how much should be logged?");
+W("You can use NOTHING, FATAL, ERROR, FAILURE, WARNING, MESSAGE INFO, DEBUG, 
CRON or EVERYTHING (which log more and more messages in this order).");
+W("Default is WARNING.");
+W("You can override this option at the commandline with the <tt>-L</tt> 
switch.");
+
+EP();
+ANCHOR("gnunet.conf.logfile");H4("GNUNETD: LOGFILE");
+
+BP();
+W("If <tt>gnunetd</tt> is not started with the <tt>-d</tt> option, it writes 
logging messages into this file (with <tt>-d</tt> all messages are written to 
the console).");
+W(" Read this %s if you are using logrotate.",
+  
extlink_("http://mail.gnu.org/archive/html/help-gnunet/2002-08/msg00012.html";, 
"mail"));
+
+EP();
+ANCHOR("gnunet.conf.pidfile");H4("GNUNETD: PIDFILE");
+
+BP();
+W("In which file should gnunetd write the process-id of the server?");
+W("If you run gnunetd as root, you may want to choose /var/run/gnunetd.pid.");
+W("It&rsquo;s not the default since gnunetd may not have write rights at that 
location.");
+
+EP();
+ANCHOR("gnunet.conf.hosts");H4("GNUNETD: HOSTS");
+
+BP();
+W("In this directory GNUnet stores the key and last known Internet address of 
each known GNUnet node.");
+W("Each file is about 600 bytes long (different transport protocols may have 
different address sizes).");
+W("On startup, GNUnet downloads a list of initial hosts from the specified 
<tt>HOSTLISTURL</tt>.");
+W("The files listed in the <tt>HOSTLISTURL</tt> are generated using:");
+EP();
+PRE("$ cat /var/lib/GNUnet/data/hosts/* > hostlist");
+BP();
+W("Running the command above and offering the generated <tt>hostlist</tt> file 
on a webserver is all it takes to run your own hostlist server.");
+W("<tt>gnunetd</tt> will try to download peer advertisements from a (random) 
server specified in the <tt>HOSTLISTURL</tt> only if too few peers are 
connected for a longer period of time.");
+P();
+W("Once connected, GNUnet hosts exchange information about other hosts 
automatically.");
+W("Thus except for the initial connection, there should be no pressing need to 
obtain a new list (except if a node was offline for a long time and the old 
list aged so much that it became useless).");
+W("If hosts cannot be reached and the time that the key has been signed to be 
valid by the sender has expired, GNUnet deletes their identities from 
<tt>data/hosts/</tt>.");
+W("Note that the trust information is kept &quot;forever&quot;.");
+
+EP();
+ANCHOR("gnunet.conf.hostlisturl");H4("GNUNETD: HOSTLISTURL");
+
+BP();
+W("Whenever <tt>gnunetd</tt> needs to learn about an initial set of peers that 
it can connect to, it downloads a list of initial nodes to connect to via 
http.");
+W("The URL to use is specified here.");
+W("Multiple URLs can be specified separated by spaces.");
+
+EP();
+ANCHOR("gnunet.conf.applications");H4("GNUNETD: APPLICATIONS");
+
+BP();
+W("Which applications should <tt>gnunetd</tt> support?");
+W("Specify the name of the dynamic shared object (DSO) that implements the 
service in the gnunetd core here.");
+W("Multiple DSOs can be specified, separated by spaces.");
+W("You should always specify &quot;advertising getoption&quot; since these are 
rather fundamental applications.");
+W("Add &quot;stats&quot; in order to be able to obtain statistics using 
<tt>gnunet-stats</tt>.");
+W("Add &quot;traffic&quot; to see statistics about traffic (also used by 
anonymous file sharing for cover traffic estimates).");
+W("Further additions depend on which specific applications you want to use.");
+W("Possible choices include &quot;%s chat tbench tracekit&quot;.",
+  intlink_("user_afs.php3","fs"));
+
+EP();
+ANCHOR("gnunet.conf.transports");H4("GNUNETD: TRANSPORTS");
+
+BP();
+W("Which transport services should be used?");
+W("Use space-separated list of the modules, for example  &quot;udp smtp tcp 
nat&quot;.");
+W("If you want to use SMTP, please read the %s for details.",
+  intlink_("smtp.php3","SMTP documentation"));
+
+P();
+W("The <tt>gnunet-setup</tt> tool also contains help texts for the various 
options.");
+
+EP();
+HR();
+
+ANCHOR("clientoptions"); H3("Client options");
+BP();
+W("These are options that should be specified in the per-user 
<tt>gnunet.conf</tt> configuration files.");
+W("They apply to the various user interfaces for GNUnet.");
+EP();
+ANCHOR("gnunet.conf.host");
+H4("NETWORK: HOST");
+
+BP();
+W("With this option, you can specify to which host the GNUnet clients should 
connect by default.");
+W("You can override the choice you make here with the <tt>-H</tt> option.");
+W("The default, <tt>localhost</tt> should be fine.");
+
+EP();
+
+ANCHOR("gnunet.conf.port");H4("NETWORK: PORT");
+
+BP();
+W("With this option, you can specify to which TCP port the gnunet-clients 
should connect.");
+W("It is also the choice of the port for <tt>gnunetd</tt>.");
+W("While you can restrict access to this port using the %s option, you may 
also want to firewall this port.",
+  extlink_("#gnunet.conf.trusted", "NETWORK: TRUSTED"));
+W("A different port must be used for the TCP and UDP peer-to-peer transport 
mechanism.");
+W("The default value is <tt>2087</tt>.");
+EP();
+
+HR();
+
+ANCHOR("coretools");
+H3("GNUnet core tools");
+
+ANCHOR("transportcheck");
+H4("gnunet-transport-check");
+
+BP();
+W("The <tt>gnunet-transport-check</tt> tool checks if a transport is 
configured correctly.");
+W("By default the tool checks if the transport is at least able to send a 
message to its own address.");
+W("This test is called the <em>loopback mode</em>.");
+W("This mode is useful to check basic transport functionality when new 
transports are implemented or when GNUnet is ported to a new platform.");
+W("By default, <tt>gnunet-transport-check</tt> tests all the transports that 
are currently specified in the configuration file.");
+P();
+W("With the option <tt>-p</tt> it is possible to run 
<tt>gnunet-transport-check</tt> in <em>ping mode</em>.");
+W("In ping mode <tt>gnunet-transport-check</tt> performs an http download of 
the peer list specified in the configuration (HOSTLISTURL option) and attempts 
to connect to each of these peers (if a matching transport is configured).");
+W("This way the tool is able to catch a variety of problems, including 
problems relating to NAT boxes, the firewall configuration and virtual private 
networks (VPNs).");
+W("Note that it is perfectly normal that not all peers from the hostlist can 
be reached, but for both common transports (tcp and udp) at least a few should 
succeed.");
+W("The default time that <tt>gnunet-transport-check</tt> waits for a reply is 
15s.");
+W("For a quick test the timeout can be reduced, for example to 500 ms with the 
option <tt>-T 500</tt>.");
+P();
+W("Note that you can not run <tt>gnunet-transport-check</tt> while 
<tt>gnunetd</tt> is running!");
+W("You must stop <tt>gnunetd</tt> before testing transports.");
+W("The output of <tt>gnunet-transport-check</tt> looks something like this:");
+EP();
+
+PRE("$ gnunet-transport-check\n" .
+    "Testing transport(s) udp tcp\n" .
+    "Transport OK, 0ms for 1 messages of size 11 bytes.\n" .
+    "Transport OK, 0ms for 1 messages of size 11 bytes.\n");
+
+BP();
+W("And for ping mode:");
+EP();
+
+PRE("$ gnunet-transport-check -p\n" .
+    "Available transport(s): udp tcp\n" .
+    ".....................\n" .
+    "8 out of 21 peers contacted successfully (0 times transport 
unavailable).\n");
+
+ANCHOR("peerinfo");
+H4("gnunet-peer-info");
+
+BP();
+W("The <tt>gnunet-peer-info</tt> tool displays the identities, trust earned 
and Internet addresses of all GNUnet peers that the local peer is aware of.");
+W("The output looks like this:");
+EP();
+
+PRE("$ gnunet-peer-info\n" .
+    "Peer \'CJ4J...\' with trust 31 and address \'31.79.24.1:2086 (TCP)\'\n" .
+    "Peer \'FA65...\' with trust  0 and address \'80.16.46.2:2086 (UDP)\'");
+
+ANCHOR("stats");H4("gnunet-stats");
+
+BP();
+W("<tt>gnunet-stats</tt> is a little tool that displays statistics.");
+W("Unlike the other core tools, it uses the client configuration and only 
works if <tt>gnunetd</tt> is already running.");
+W("<tt>gnunet-stats</tt> also only works if the <tt>stats</tt> module is 
loaded as an application.");
+W("The numbers are for the current <tt>gnunetd</tt> process only.");
+W("The output looks similar to the following example, but depends on which 
modules you have loaded and what your node has been doing so far.");
+EP();
+
+PRE("$ gnunet-stats\n" .
+    "Uptime (seconds)                                            :             
  47\n" .
+    "% of allowed network load                                   :             
   0\n" .
+    "% of allowed cpu load                                       :             
   0\n" .
+    "# bytes of noise received                                   :             
   0\n" .
+    "# bytes received from clients                               :             
   8\n" .
+    "# times outgoing msg sent (bandwidth ok)                    :             
   0\n" .
+    "# times outgoing msg dropped (bandwidth stressed)           :             
   0\n" .
+    "# times incoming msg accepted (cpu ok)                      :             
   0\n" .
+    "# times incoming msg dropped (cpu overloaded)               :             
   0\n" .
+    "# sessionkeys received                                      :             
   0\n" .
+    "# valid sessionkeys received                                :             
   0\n" .
+    "# sessionkeys sent                                          :             
   0\n" .
+    "# connections shutdown                                      :             
   0\n" .
+    "# currently connected nodes                                 :             
   0\n" .
+    "# bytes noise sent                                          :             
   0\n" .
+    "# encrypted bytes sent                                      :             
   0\n" .
+    "# bytes decrypted                                           :             
   0\n" .
+    "# ping messages sent                                        :             
   0\n" .
+    "# ping messages received                                    :             
   0\n" .
+    "# pong messages sent                                        :             
   0\n" .
+    "# pong messages received                                    :             
   0\n" .
+    "# HELLO messages received from http server                  :             
  34\n" .
+    "# HELLO messages received overall                           :             
   1\n" .
+    "# valid HELLO messages received                             :             
   0\n" .
+    "# HELLO messages forwarded from other peers                 :             
   0\n" .
+    "# HELLO messages originated                                 :             
   0\n");
+
+BP();
+W("The number of connected hosts is the nummber of hosts that the local node 
is directly connected to (1 hop).");
+W("The total number of hosts in the network must be larger or equal to this 
number.");
+EP();
+
+include("html_footer.php3");
+?>

Modified: GNUnet-docs/WWW/test/user_index.inc
===================================================================
--- GNUnet-docs/WWW/test/user_index.inc 2006-03-31 17:39:44 UTC (rev 2598)
+++ GNUnet-docs/WWW/test/user_index.inc 2006-04-01 11:59:15 UTC (rev 2599)
@@ -1,8 +1,13 @@
-<ol>
- <li><?php intlink("user_gnunet.php3","Compilation and Configuration of 
GNUnet"); ?></li>
- <li><?php intlink("user_afs.php3","Configuration and Usage of GNUnet&rsquo;s 
Anonymous file sharing"); ?></li>
- <li><?php intlink("user_chat.php3","Broadcast chat"); ?></li>
-  <!-- li><?php intlink("user_tbench.php3","Measureing the transport 
performance"); ?></li -->
-  <!-- li><?php intlink("user_tracekit.php3","Tracing the GNUnet topology"); 
?></li -->
- <li><?php intlink("user_testbed.php3","Deploying a GNUnet P2P testbed"); 
?></li>
-</ol>
+<?php 
+echo "<ol>\n";
+LILI("user_gnunet.php3","Compilation and Configuration of GNUnet");
+LILI("user_afs.php3","Configuration and Usage of GNUnet&rsquo;s (anonymous) 
file sharing");
+echo "<ul>\n";
+LILI("gnunetgtk.php3","Using <tt>gnunet-gtk</tt>");
+echo "</ul>\n";
+// LILI("user_chat.php3","Broadcast chat");
+// LILI("user_tbench.php3","Measureing the transport performance");
+// LILI("user_tracekit.php3","Tracing the GNUnet topology");
+// LILI("user_testbed.php3","Deploying a GNUnet P2P testbed"); 
+echo "</ol>\n";
+?>

Modified: GNUnet-docs/WWW/test/user_testbed.php3
===================================================================
--- GNUnet-docs/WWW/test/user_testbed.php3      2006-03-31 17:39:44 UTC (rev 
2598)
+++ GNUnet-docs/WWW/test/user_testbed.php3      2006-04-01 11:59:15 UTC (rev 
2599)
@@ -1,75 +1,75 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Documentation: Deploying a GNUnet P2P testbed";
-$description="GNUnet Documentation - An introduction to gnunet-testbed.";
-include("html_header.php3");
-
-H2("Deploying a GNUnet P2P testbed");
-
-BP();
-W("A P2P testbed is an environment in which P2P developers can test new 
ideas.");
-W("Ordinary users can help developers by making their machines available for 
testing.");
-W("This document describes how users can setup their machines to participate 
in a testbed (and details the risks involved) and how developers can use the 
testing infrastructure.");
-
-EP();
-H3("Setting up a testbed client");
-
-BP();
-W("Since setting up a testbed client is quite trivial, the most difficult step 
is to decide if it is a good idea.");
-W("The benefits of providing a client to developers are obvious, the 
developers may be able to develop and test their free software faster.");
-W("On the other hand, the risks are plentiful.");
-W("Setting up a testbed client will allow developers to run <em>arbitrary</em> 
code on the local machine.");
-W("This is a huge security risk.");
-W("While it is possible (and definitely advised) to restrict access to 
developers that use a specific IP, this is still equivalent to giving the 
developers a TELNET account.");
-W("Yes, I said TELNET, not SSH.");
-W("The connection used at the moment is by default not encrypted and not 
authenticated.");
-W("An advanced setup may add an SSH tunnel, but even then you grant developers 
direct access to your machine, with the explicit purpose of running new code.");
-W("The only piece of good news is that <tt>gnunetd</tt> does not require 
root-rights, so you do not have to grant root-access.");
-W("Of course, there are plenty more local root exploits out there than remote 
root exploits.");
-P();
-W("Still reading?");
-W("Ok, then here&prime;s how to do the setup.");
-W("This assumes that you have configured <tt>gnunetd</tt> for normal operation 
already.");
-W("For running a testbed peer, you need to add <tt>testbed</tt> to the list of 
<tt>APPLICATIONS</tt> in <tt>gnunet.conf</tt>.");
-W("You can keep all other applications, too, but you don&prime;t have to.");
-W("Developers will be able to add and remove application services as they 
please anyway -- as long as testbed is present.");
-W("Furthermore, you need to specify the IP address(es) of the developers under 
<tt>TRUSTED</tt>.");
-W("This will allow developers to connect to the peer.");
-W("Note that you may have to punch a hole into your firewall since this 
connection uses the client port (TCP/2087 by default), and not the peer-to-peer 
transports.");
-W("If you want to use an SSH tunnel, exchange an SSH key with the developers 
instead.");
-W("Developers can then use that to connect to the service via loopback.");
-W("Finally, the developers must be notified about the availability of your new 
test-peer.");
-W("The developers may be using an automatic web-based registration system, in 
which case you should follow the instructions there.");
-W("Note that that system could also be advertising an SSH key.");
-W("If there is no web-based registration system, you may want to contact the 
developers directly with your IP and port (you may have changed the 2086 
default).");
-
-EP();
-H3("Setting up a testbed meta-server");
-
-BP();
-W("The purpose of a testbed meta-server is to maintain a list of available 
peers for running tests.");
-W("A meta-server is typically a WWW server which is contacted by peers that 
register and unregister their service.");
-W("The <tt>contrib/</tt> directory contains a few PHP scripts that can be used 
to setup a meta-server that uses an MySQL database to store the list of 
available peers.");
-W("The scripts can be used to create a list of available IP addresses which is 
then fed into <tt>gnunet-testbed</tt>.");
-
-EP();
-H3("Using <tt>gnunet-testbed</tt>");
-BP();
-W("<tt>gnunet-testbed</tt> is the application that exercises control over the 
testbed peers.");
-W("It uses the same %s to communicate with the peers that all of the other 
GNUnet tools use.",
-  intlink_("protocol_cs.php3",
-           "basic client-server protocol"));
-W("The only major difference is that <tt>gnunet-testbed</tt> connects to 
multiple <tt>gnunetd</tt> servers at the same time.");
-W("<tt>gnunet-testbed</tt> excercises its control over the peers by sending 
them various commands.");
-W("The commands include network topology management, loading and unloading of 
other application modules, uploading of files (including code that can then be 
loaded as a module!), configuration, statistics and the execution of arbitrary 
commands.");
-W("<tt>gnunet-testbed</tt> features a shell (default is BASH) to script the 
execution.");
-W("BASH was chosen since this relieves the developers from implementing a new 
scripting language and the users from learning a new toy language.");
-W("When invoked, <tt>gnunet-testbed</tt> opens a BASH shell with the 
<tt>@GTB@</tt> prompt.");
-W("At that prompt, additional testbed specific commands are available in 
addition to everything else that can be done with the shell.");
-W("The results of the testbed commands (standard output and return values, to 
be precise), can be processed with other bash commands in the usual way.");
-W("For documentation on BASH itself, see <tt>man bash</tt>.");
-W("The complete list of testbed specific commands is changing frequently and 
should be documented in the <tt>gnunet-testbed</tt> man page.");
-EP();
-
-include("html_footer.php3");
-?>
+<?php
+include("scripts.php3");
+$title = "GNUnet Documentation: Deploying a GNUnet P2P testbed";
+$description="GNUnet Documentation - An introduction to gnunet-testbed.";
+include("html_header.php3");
+
+H2("Deploying a GNUnet P2P testbed");
+
+BP();
+W("A P2P testbed is an environment in which P2P developers can test new 
ideas.");
+W("Ordinary users can help developers by making their machines available for 
testing.");
+W("This document describes how users can setup their machines to participate 
in a testbed (and details the risks involved) and how developers can use the 
testing infrastructure.");
+
+EP();
+H3("Setting up a testbed client");
+
+BP();
+W("Since setting up a testbed client is quite trivial, the most difficult step 
is to decide if it is a good idea.");
+W("The benefits of providing a client to developers are obvious, the 
developers may be able to develop and test their free software faster.");
+W("On the other hand, the risks are plentiful.");
+W("Setting up a testbed client will allow developers to run <em>arbitrary</em> 
code on the local machine.");
+W("This is a huge security risk.");
+W("While it is possible (and definitely advised) to restrict access to 
developers that use a specific IP, this is still equivalent to giving the 
developers a TELNET account.");
+W("Yes, I said TELNET, not SSH.");
+W("The connection used at the moment is by default not encrypted and not 
authenticated.");
+W("An advanced setup may add an SSH tunnel, but even then you grant developers 
direct access to your machine, with the explicit purpose of running new code.");
+W("The only piece of good news is that <tt>gnunetd</tt> does not require 
root-rights, so you do not have to grant root-access.");
+W("Of course, there are plenty more local root exploits out there than remote 
root exploits.");
+P();
+W("Still reading?");
+W("Ok, then here&prime;s how to do the setup.");
+W("This assumes that you have configured <tt>gnunetd</tt> for normal operation 
already.");
+W("For running a testbed peer, you need to add <tt>testbed</tt> to the list of 
<tt>APPLICATIONS</tt> in <tt>gnunet.conf</tt>.");
+W("You can keep all other applications, too, but you don&prime;t have to.");
+W("Developers will be able to add and remove application services as they 
please anyway -- as long as testbed is present.");
+W("Furthermore, you need to specify the IP address(es) of the developers under 
<tt>TRUSTED</tt>.");
+W("This will allow developers to connect to the peer.");
+W("Note that you may have to punch a hole into your firewall since this 
connection uses the client port (TCP/2087 by default), and not the peer-to-peer 
transports.");
+W("If you want to use an SSH tunnel, exchange an SSH key with the developers 
instead.");
+W("Developers can then use that to connect to the service via loopback.");
+W("Finally, the developers must be notified about the availability of your new 
test-peer.");
+W("The developers may be using an automatic web-based registration system, in 
which case you should follow the instructions there.");
+W("Note that that system could also be advertising an SSH key.");
+W("If there is no web-based registration system, you may want to contact the 
developers directly with your IP and port (you may have changed the 2086 
default).");
+
+EP();
+H3("Setting up a testbed meta-server");
+
+BP();
+W("The purpose of a testbed meta-server is to maintain a list of available 
peers for running tests.");
+W("A meta-server is typically a WWW server which is contacted by peers that 
register and unregister their service.");
+W("The <tt>contrib/</tt> directory contains a few PHP scripts that can be used 
to setup a meta-server that uses an MySQL database to store the list of 
available peers.");
+W("The scripts can be used to create a list of available IP addresses which is 
then fed into <tt>gnunet-testbed</tt>.");
+
+EP();
+H3("Using <tt>gnunet-testbed</tt>");
+BP();
+W("<tt>gnunet-testbed</tt> is the application that exercises control over the 
testbed peers.");
+W("It uses the same %s to communicate with the peers that all of the other 
GNUnet tools use.",
+  intlink_("protocol_cs.php3",
+           "basic client-server protocol"));
+W("The only major difference is that <tt>gnunet-testbed</tt> connects to 
multiple <tt>gnunetd</tt> servers at the same time.");
+W("<tt>gnunet-testbed</tt> excercises its control over the peers by sending 
them various commands.");
+W("The commands include network topology management, loading and unloading of 
other application modules, uploading of files (including code that can then be 
loaded as a module!), configuration, statistics and the execution of arbitrary 
commands.");
+W("<tt>gnunet-testbed</tt> features a shell (default is BASH) to script the 
execution.");
+W("BASH was chosen since this relieves the developers from implementing a new 
scripting language and the users from learning a new toy language.");
+W("When invoked, <tt>gnunet-testbed</tt> opens a BASH shell with the 
<tt>@GTB@</tt> prompt.");
+W("At that prompt, additional testbed specific commands are available in 
addition to everything else that can be done with the shell.");
+W("The results of the testbed commands (standard output and return values, to 
be precise), can be processed with other bash commands in the usual way.");
+W("For documentation on BASH itself, see <tt>man bash</tt>.");
+W("The complete list of testbed specific commands is changing frequently and 
should be documented in the <tt>gnunet-testbed</tt> man page.");
+EP();
+
+include("html_footer.php3");
+?>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]