char *const *args,
const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- unsigned long long topology_num;
- unsigned long long connect_topology_num;
- unsigned long long blacklist_topology_num;
- unsigned long long connect_topology_option_num;
- char *connect_topology_option_modifier_string;
+ char * topology_str;
+ char * connect_topology_str;
+ char * blacklist_topology_str;
+ char * connect_topology_option_str;
+ char * connect_topology_option_modifier_string;
sched = s;
ok = 1;
return;
}
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "topology",
- &topology_num))
- topology = topology_num;
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string(cfg, "testing", "topology",
+ &topology_str)) && (GNUNET_NO == GNUNET_TESTING_topology_get(&topology, topology_str)))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid topology `%s' given for section %s option %s\n", topology_str, "TESTING", "TOPOLOGY");
+ topology = GNUNET_TESTING_TOPOLOGY_CLIQUE; /* Defaults to NONE, so set better default here */
+ }
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "connect_topology",
- &connect_topology_num))
- connection_topology = connect_topology_num;
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string(cfg, "testing", "connect_topology",
+ &connect_topology_str)) && (GNUNET_NO == GNUNET_TESTING_topology_get(&connection_topology, connect_topology_str)))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid connect topology `%s' given for section %s option %s\n", connect_topology_str, "TESTING", "CONNECT_TOPOLOGY");
+ }
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "connect_topology_option",
- &connect_topology_option_num))
- connect_topology_option = connect_topology_option_num;
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string(cfg, "testing", "connect_topology_option",
+ &connect_topology_option_str)) && (GNUNET_NO == GNUNET_TESTING_topology_option_get(&connect_topology_option, connect_topology_option_str)))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid connect topology option `%s' given for section %s option %s\n", connect_topology_option_str, "TESTING", "CONNECT_TOPOLOGY_OPTION");
+ connect_topology_option = GNUNET_TESTING_TOPOLOGY_OPTION_ALL; /* Defaults to NONE, set to ALL */
+ }
if (GNUNET_YES ==
GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "connect_topology_option_modifier",
&blacklist_transports))
blacklist_transports = NULL;
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "blacklist_topology",
- &blacklist_topology_num))
- blacklist_topology = blacklist_topology_num;
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string(cfg, "testing", "blacklist_topology",
+ & blacklist_topology_str)) && (GNUNET_NO == GNUNET_TESTING_topology_get(&blacklist_topology, blacklist_topology_str)))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid topology `%s' given for section %s option %s\n", topology_str, "TESTING", "BLACKLIST_TOPOLOGY");
+ }
if (GNUNET_SYSERR ==
GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "num_peers",
#define VERBOSE_TESTING GNUNET_NO
+#define VERBOSE_TOPOLOGY GNUNET_NO
+
#define DEBUG_CHURN GNUNET_NO
/**
typedef int (*GNUNET_TESTING_ConnectionProcessor)
(struct GNUNET_TESTING_PeerGroup *pg, unsigned int first, unsigned int second);
+/**
+ * Strings representing topologies in enum
+ */
+static char * GNUNET_TESTING_TopologyStrings[] =
+{
+ /**
+ * A clique (everyone connected to everyone else).
+ */
+ "CLIQUE",
+
+ /**
+ * Small-world network (2d torus plus random links).
+ */
+ "SMALL_WORLD",
+
+ /**
+ * Small-world network (ring plus random links).
+ */
+ "SMALL_WORLD_RING",
+
+ /**
+ * Ring topology.
+ */
+ "RING",
+
+ /**
+ * 2-d torus.
+ */
+ "2D_TORUS",
+
+ /**
+ * Random graph.
+ */
+ "ERDOS_RENYI",
+
+ /**
+ * Certain percentage of peers are unable to communicate directly
+ * replicating NAT conditions
+ */
+ "INTERNAT",
+
+ /**
+ * Scale free topology.
+ */
+ "SCALE_FREE",
+
+ /**
+ * All peers are disconnected.
+ */
+ "NONE"
+};
+
+/**
+ * Options for connecting a topology as strings.
+ */
+static char * GNUNET_TESTING_TopologyOptionStrings[] =
+{
+ /**
+ * Try to connect all peers specified in the topology.
+ */
+ "CONNECT_ALL",
+
+ /**
+ * Choose a random subset of connections to create.
+ */
+ "CONNECT_RANDOM_SUBSET",
+
+ /**
+ * Create at least X connections for each peer.
+ */
+ "CONNECT_MINIMUM",
+
+ /**
+ * Using a depth first search, create one connection
+ * per peer. If any are missed (graph disconnected)
+ * start over at those peers until all have at least one
+ * connection.
+ */
+ "CONNECT_DFS",
+
+ /**
+ * No options specified.
+ */
+ "CONNECT_NONE"
+};
+
/**
* Context for handling churning a peer group
*/
*/
static int outstanding_connects;
+/**
+ * Get a topology from a string input.
+ *
+ * @param topology where to write the retrieved topology
+ * @param topology_string The string to attempt to
+ * get a configuration value from
+ * @return GNUNET_YES if topology string matched a
+ * known topology, GNUNET_NO if not
+ */
+int
+GNUNET_TESTING_topology_get(enum GNUNET_TESTING_Topology *topology, char * topology_string)
+{
+ int found = 0;
+ int curr = 0;
+
+ if (topology_string == NULL)
+ return GNUNET_NO;
+
+ do
+ {
+ if (strcmp(GNUNET_TESTING_TopologyStrings[curr], topology_string) == 0)
+ {
+ found = GNUNET_YES;
+ break;
+ }
+ curr++;
+ } while (strcmp(GNUNET_TESTING_TopologyStrings[curr], "NONE") != 0);
+ *topology = curr;
+ if (found)
+ return GNUNET_YES;
+ else
+ return GNUNET_NO;
+}
+
+/**
+ * Get connect topology option from string input.
+ *
+ * @param topology where to write the retrieved topology
+ * @param topology_string The string to attempt to
+ * get a configuration value from
+ * @return GNUNET_YES if string matched a known
+ * topology option, GNUNET_NO if not
+ */
+int
+GNUNET_TESTING_topology_option_get(enum GNUNET_TESTING_TopologyOption *topology, char * topology_string)
+{
+ int found = 0;
+ int curr = 0;
+
+ if (topology_string == NULL)
+ return GNUNET_NO;
+
+ do
+ {
+ if (strcmp(GNUNET_TESTING_TopologyOptionStrings[curr], topology_string) == 0)
+ {
+ found = GNUNET_YES;
+ break;
+ }
+ curr++;
+ } while (strcmp(GNUNET_TESTING_TopologyOptionStrings[curr], "CONNECT_NONE") != 0);
+ *topology = curr;
+ if (found)
+ return GNUNET_YES;
+ else
+ return GNUNET_NO;
+}
/**
* Function to iterate over options. Copies
switch (topology)
{
case GNUNET_TESTING_TOPOLOGY_CLIQUE:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating clique topology\n"));
#endif
num_connections = create_clique (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating small world (ring) topology\n"));
#endif
num_connections = create_small_world_ring (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating small world (2d-torus) topology\n"));
#endif
num_connections = create_small_world (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_RING:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating ring topology\n"));
#endif
num_connections = create_ring (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_2D_TORUS:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating 2d torus topology\n"));
#endif
num_connections = create_2d_torus (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_ERDOS_RENYI:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating Erdos-Renyi topology\n"));
#endif
num_connections = create_erdos_renyi (pg, &add_allowed_connections);
break;
case GNUNET_TESTING_TOPOLOGY_INTERNAT:
-#if VERBOSE_TESTING
+#if VERBOSE_TOPOLOGY
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Creating InterNAT topology\n"));
#endif
switch (topology)
{
case GNUNET_TESTING_TOPOLOGY_CLIQUE:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating clique topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating clique CONNECT topology\n"));
+#endif
create_clique (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating small world (ring) topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating small world (ring) CONNECT topology\n"));
+#endif
create_small_world_ring (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating small world (2d-torus) topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating small world (2d-torus) CONNECT topology\n"));
+#endif
create_small_world (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_RING:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating ring topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating ring CONNECT topology\n"));
+#endif
create_ring (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_2D_TORUS:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating 2d torus topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating 2d torus CONNECT topology\n"));
+#endif
create_2d_torus (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_ERDOS_RENYI:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating Erdos-Renyi topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating Erdos-Renyi CONNECT topology\n"));
+#endif
create_erdos_renyi (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_INTERNAT:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating InterNAT topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating InterNAT CONNECT topology\n"));
+#endif
create_nated_internet (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_SCALE_FREE:
- #if VERBOSE_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Creating Scale Free topology\n"));
- #endif
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating Scale Free CONNECT topology\n"));
+#endif
create_scale_free (pg, &add_actual_connections);
break;
case GNUNET_TESTING_TOPOLOGY_NONE:
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Creating no CONNECT topology\n"));
+#endif
copy_allowed_topology(pg);
break;
default:
switch (options)
{
- case GNUNET_TESTING_TOPOLOGY_OPTION_RANDOM:
+ case GNUNET_TESTING_TOPOLOGY_OPTION_RANDOM:
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Connecting random subset (%'.2f percent) of possible peers\n"), 100 * option_modifier);
+#endif
choose_random_connections(pg, option_modifier);
break;
- case GNUNET_TESTING_TOPOLOGY_OPTION_MINIMUM:
+ case GNUNET_TESTING_TOPOLOGY_OPTION_MINIMUM:
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Connecting a minimum of %u peers each (if possible)\n"), (unsigned int)option_modifier);
+#endif
choose_minimum(pg, (unsigned int)option_modifier);
break;
- case GNUNET_TESTING_TOPOLOGY_OPTION_DFS:
+ case GNUNET_TESTING_TOPOLOGY_OPTION_DFS:
+#if VERBOSE_TOPOLOGY
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Using DFS to connect a minimum of %u peers each (if possible)\n"), (unsigned int)option_modifier);
+#endif
perform_dfs(pg, (int)option_modifier);
break;
case GNUNET_TESTING_TOPOLOGY_OPTION_NONE: