guix-env: some update.
[oweals/gnunet.git] / src / testbed / testbed_api_topology.c
index 1f7d11b27312e58d378f33c911a90d7f4962f5af..7bc36d1b4798a29c6b0e5170b1334f86542c8d82 100644 (file)
@@ -260,7 +260,7 @@ struct TopologyContext
  * A array of names representing topologies. Should be in sync with enum
  * GNUNET_TESTBED_TopologyOption
  */
-const char *topology_strings[] = {
+static const char *topology_strings[] = {
 
     /**
      * A clique (everyone connected to everyone else).  No options. If there are N
@@ -268,7 +268,7 @@ const char *topology_strings[] = {
      */
   "CLIQUE",
 
-    /**
+    /*
      * Small-world network (2d torus plus random links).  Followed
      * by the number of random links to add (unsigned int).
      */
@@ -285,6 +285,11 @@ const char *topology_strings[] = {
      */
   "RING",
 
+    /**
+     * Star topology.  No options.
+     */
+  "STAR",
+
     /**
      * 2-d torus.  No options.
      */
@@ -341,7 +346,8 @@ const char *topology_strings[] = {
  *          operation has executed successfully.
  */
 static void
-overlay_link_completed (void *cls, struct GNUNET_TESTBED_Operation *op,
+overlay_link_completed (void *cls,
+                        struct GNUNET_TESTBED_Operation *op,
                         const char *emsg)
 {
   struct OverlayLink *link = cls;
@@ -361,10 +367,13 @@ overlay_link_completed (void *cls, struct GNUNET_TESTBED_Operation *op,
     if (0 != overlay->retry_cnt)
     {
       LOG (GNUNET_ERROR_TYPE_WARNING,
-           "Error while establishing a link: %s -- Retrying\n", emsg);
+           "Error while establishing a link: %s -- Retrying\n",
+           emsg);
       retry_entry = GNUNET_new (struct RetryListEntry);
       retry_entry->link = link;
-      GNUNET_CONTAINER_DLL_insert_tail (overlay->rl_head, overlay->rl_tail, retry_entry);
+      GNUNET_CONTAINER_DLL_insert_tail (overlay->rl_head,
+                                        overlay->rl_tail,
+                                        retry_entry);
     }
   }
   else
@@ -381,18 +390,24 @@ overlay_link_completed (void *cls, struct GNUNET_TESTBED_Operation *op,
     {
       link = retry_entry->link;
       link->op =
-          GNUNET_TESTBED_overlay_connect (overlay->op_cls, &overlay_link_completed,
-                                          link, overlay->peers[link->A],
+          GNUNET_TESTBED_overlay_connect (overlay->op_cls,
+                                          &overlay_link_completed,
+                                          link,
+                                          overlay->peers[link->A],
                                           overlay->peers[link->B]);
       overlay->nlinks++;
-      GNUNET_CONTAINER_DLL_remove (overlay->rl_head, overlay->rl_tail, retry_entry);
+      GNUNET_CONTAINER_DLL_remove (overlay->rl_head,
+                                   overlay->rl_tail,
+                                   retry_entry);
       GNUNET_free (retry_entry);
     }
     return;
   }
   if (NULL != overlay->comp_cb)
   {
-    overlay->comp_cb (overlay->comp_cb_cls, overlay->nsuccess, overlay->nfailures);
+    overlay->comp_cb (overlay->comp_cb_cls,
+                      overlay->nsuccess,
+                      overlay->nfailures);
   }
 }
 
@@ -416,7 +431,8 @@ opstart_overlay_configure_topology (void *cls)
   for (p = 0; p < tc->link_array_size; p++)
   {
     overlay->link_array[p].op =
-        GNUNET_TESTBED_overlay_connect (overlay->op_cls, &overlay_link_completed,
+        GNUNET_TESTBED_overlay_connect (overlay->op_cls,
+                                        &overlay_link_completed,
                                         &overlay->link_array[p],
                                         overlay->peers[overlay->link_array[p].A],
                                         overlay->peers[overlay->link_array[p].B]);
@@ -465,7 +481,9 @@ oprelease_overlay_configure_topology (void *cls)
  * @return
  */
 static void
-make_link (unsigned int offset, uint32_t A, uint32_t B,
+make_link (unsigned int offset,
+           uint32_t A,
+           uint32_t B,
            struct TopologyContext *tc)
 {
   GNUNET_assert (A != B);
@@ -521,7 +539,8 @@ gen_topo_line (struct TopologyContext *tc)
 
       overlay = &tc->u.overlay;
       overlay->link_array =
-          GNUNET_malloc (sizeof (struct OverlayLink) * tc->link_array_size);
+        GNUNET_new_array (tc->link_array_size,
+                          struct OverlayLink);
     }
     break;
   case TOPOLOGYCONTEXT_TYPE_UNDERLAY:
@@ -530,7 +549,8 @@ gen_topo_line (struct TopologyContext *tc)
 
       underlay = &tc->u.underlay;
       underlay->link_array =
-          GNUNET_malloc (sizeof (struct UnderlayLink) * tc->link_array_size);
+        GNUNET_new_array (tc->link_array_size,
+                          struct UnderlayLink);
     }
     break;
   }
@@ -539,6 +559,48 @@ gen_topo_line (struct TopologyContext *tc)
 }
 
 
+/**
+ * Generates star topology
+ *
+ * @param tc the topology context
+ */
+static void
+gen_topo_star (struct TopologyContext *tc)
+{
+  unsigned int cnt;
+
+  tc->link_array_size = tc->num_peers - 1;
+  switch (tc->type)
+  {
+  case TOPOLOGYCONTEXT_TYPE_OVERLAY:
+    {
+      struct TopologyContextOverlay *overlay;
+
+      overlay = &tc->u.overlay;
+      overlay->link_array =
+        GNUNET_new_array (tc->link_array_size,
+                          struct OverlayLink);
+    }
+    break;
+  case TOPOLOGYCONTEXT_TYPE_UNDERLAY:
+    {
+      struct TopologyContextUnderlay *underlay;
+
+      underlay = &tc->u.underlay;
+      underlay->link_array =
+        GNUNET_new_array (tc->link_array_size,
+                          struct UnderlayLink);
+    }
+    break;
+  }
+  for (cnt = tc->link_array_size; cnt; cnt--)
+    make_link (cnt - 1,
+               0,
+               cnt,
+               tc);
+}
+
+
 /**
  * Generates ring topology
  *
@@ -1085,9 +1147,11 @@ gen_topo_from_file (struct TopologyContext *tc,
              other_peer_id);
       while (('\n' != data[offset]) && ('|' != data[offset]) && (offset < fs))
         offset++;
-      if ('\n' == data[offset])
+      if ( (offset < fs) &&
+           ('\n' == data[offset]) )
         state = PEER_INDEX;
-      else if ('|' == data[offset])
+      else if ( (offset < fs) &&
+                ('|' == data[offset]) )
       {
         state = OTHER_PEER_INDEX;
         offset++;
@@ -1278,6 +1342,9 @@ GNUNET_TESTBED_overlay_configure_topology_va (void *op_cls,
   case GNUNET_TESTBED_TOPOLOGY_LINE:
     gen_topo_line (tc);
     break;
+  case GNUNET_TESTBED_TOPOLOGY_STAR:
+    gen_topo_star (tc);
+    break;
   case GNUNET_TESTBED_TOPOLOGY_RING:
     gen_topo_ring (tc);
     break;
@@ -1426,6 +1493,7 @@ GNUNET_TESTBED_topology_get_ (enum GNUNET_TESTBED_TopologyOption *topology,
     {
       if (NULL != topology)
         *topology = (enum GNUNET_TESTBED_TopologyOption) cnt;
+      GNUNET_assert (GNUNET_TESTBED_TOPOLOGY_OPTION_END != (enum GNUNET_TESTBED_TopologyOption) cnt);
       return GNUNET_YES;
     }
   }
@@ -1492,6 +1560,9 @@ GNUNET_TESTBED_underlay_construct_ (int num_peers,
   case GNUNET_TESTBED_TOPOLOGY_LINE:
     gen_topo_line (&tc);
     break;
+  case GNUNET_TESTBED_TOPOLOGY_STAR:
+    gen_topo_star (&tc);
+    break;
   case GNUNET_TESTBED_TOPOLOGY_RING:
     gen_topo_ring (&tc);
     break;