[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r31278 - gnunet/src/testbed
From: |
gnunet |
Subject: |
[GNUnet-SVN] r31278 - gnunet/src/testbed |
Date: |
Wed, 11 Dec 2013 15:44:13 +0100 |
Author: harsha
Date: 2013-12-11 15:44:13 +0100 (Wed, 11 Dec 2013)
New Revision: 31278
Added:
gnunet/src/testbed/testbed_api_underlay.c
Modified:
gnunet/src/testbed/testbed_api_peers.h
Log:
- add underlay api implementation
Modified: gnunet/src/testbed/testbed_api_peers.h
===================================================================
--- gnunet/src/testbed/testbed_api_peers.h 2013-12-11 14:41:52 UTC (rev
31277)
+++ gnunet/src/testbed/testbed_api_peers.h 2013-12-11 14:44:13 UTC (rev
31278)
@@ -95,6 +95,11 @@
* Peer's state
*/
enum PeerState state;
+
+ /**
+ * Has an underlay model already set for this peer?
+ */
+ uint8_t underlay_model_exists;
};
Added: gnunet/src/testbed/testbed_api_underlay.c
===================================================================
--- gnunet/src/testbed/testbed_api_underlay.c (rev 0)
+++ gnunet/src/testbed/testbed_api_underlay.c 2013-12-11 14:44:13 UTC (rev
31278)
@@ -0,0 +1,246 @@
+/*
+ This file is part of GNUnet.
+ (C) 2008--2013 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file testbed/testbed_api_underlay.c
+ * @brief testbed underlay API implementation
+ * @author Sree Harsha Totakura <address@hidden>
+ */
+
+#include "testbed_api_peers.h"
+
+
+/**
+ * An underlay link
+ */
+struct LinkProperty
+{
+ /**
+ * next pointer for list
+ */
+ struct LinkProperty *next;
+
+ /**
+ * latency of the link in microseconds
+ */
+ uint32_t latency;
+
+ /**
+ * data loss on the link expressed as percentage
+ */
+ uint32_t loss;
+
+ /**
+ * bandwidth of the link in kilobytes per second
+ */
+ uint32_t bandwidth;
+};
+
+
+/**
+ * Container for holding a peer in whitelist/blacklist
+ */
+struct ListEntry
+{
+ /**
+ * the next pointer
+ */
+ struct ListEntry *next;
+
+ /**
+ * the peer
+ */
+ struct GNUNET_TESTBED_Peer *peer;
+};
+
+
+/**
+ * Model for configuring underlay links of a peer
+ * @ingroup underlay
+ */
+struct GNUNET_TESTBED_UnderlayLinkModel
+{
+ /**
+ * The peer associated with this model
+ */
+ struct GNUNET_TESTBED_Peer *peer;
+
+ /**
+ * List of peers in the list
+ */
+ struct ListEntry *entries;
+
+ /**
+ * list of link properties
+ */
+ struct LinkProperty *props;
+
+ /**
+ * the type of this model
+ */
+ enum GNUNET_TESTBED_UnderlayLinkModelType type;
+}
+
+
+/**
+ * Function to free resources of list entries
+ *
+ * @param model the model
+ */
+static void
+free_entries (struct GNUNET_TESTBED_UnderlayLinkModel *model)
+{
+ struct ListEntry *e;
+
+ while (NULL != (e = model->entries))
+ {
+ model->entries = e->next;
+ GNUNET_free (e);
+ }
+}
+
+
+/**
+ * Function to free resources of link properties added to the given model
+ *
+ * @param model the model
+ */
+static void
+free_link_properties (struct GNUNET_TESTBED_UnderlayLinkModel *model)
+{
+ struct LinkProperty *p;
+
+ while (NULL != (p = model->props))
+ {
+ model->props = p->next;
+ GNUNET_free (p);
+ }
+}
+
+
+/**
+ * Create a GNUNET_TESTBED_UnderlayLinkModel for the given peer. A peer can
+ * have ONLY ONE model and it can be either a blacklist or whitelist based one.
+ *
+ * @ingroup underlay
+ * @param peer the peer for which the model has to be created
+ * @param type the type of the model
+ * @return the model
+ */
+struct GNUNET_TESTBED_UnderlayLinkModel *
+GNUNET_TESTBED_underlaylinkmodel_create (struct GNUNET_TESTBED_Peer *peer,
+ enum
GNUNET_TESTBED_UnderlayLinkModelType type)
+{
+ struct GNUNET_TESTBED_UnderlayLinkModel *m;
+
+ GNUNET_assert (0 == peer->underlay_model_exists);
+ m = GNUNET_new (struct GNUNET_TESTBED_UnderlayLinkModel);
+ peer->underlay_model_exists = 1;
+ m->type = type;
+ return m;
+}
+
+
+/**
+ * Add a peer to the given model. Underlay connections to the given peer will
+ * be permitted if the model is whitelist based; otherwise they will not be
+ * permitted.
+ *
+ * @ingroup underlay
+ * @param model the model
+ * @param peer the peer to add
+ */
+void
+GNUNET_TESTBED_underlaylinkmodel_add_peer (struct
GNUNET_TESTBED_UnderlayLinkModel *model,
+ struct GNUNET_TESTBED_Peer *peer)
+{
+ struct ListEntry *entry;
+
+ entry = GNUNET_new (struct ListEntry);
+ entry->peer = peer;
+ entry->next = model->entries;
+ model->entries = entry;
+}
+
+
+/**
+ * Set the metrics for a link to the given peer in the underlay model. The
link
+ * SHOULD be permittable according to the given model.
+ *
+ * @ingroup underlay
+ * @param model the model
+ * @param peer the other end peer of the link
+ * @param latency latency of the link in microseconds
+ * @param loss data loss of the link expressed as a percentage
+ * @param bandwidth bandwidth of the link in kilobytes per second [kB/s]
+ */
+void
+GNUNET_TESTBED_underlaylinkmodel_set_link (struct
GNUNET_TESTBED_UnderlayLinkModel *model,
+ struct GNUNET_TESTBED_Peer *peer,
+ uint32_t latency,
+ uint32_t loss,
+ uint32_t bandwidth)
+{
+ struct LinkProperty *prop;
+
+ prop = GNUNET_new (struct LinkProperty);
+ prop->peer = peer;
+ prop->latency = latency;
+ prop->loss = loss;
+ prop->bandwidth = bandwidth;
+ prop->next = model->props;
+ model->props = prop;
+}
+
+
+/**
+ * Free the resources of the model. Use this function only if the model has
not
+ * be committed and has to be unallocated. The peer can then have another
model
+ * created.
+ *
+ * @ingroup underlay
+ * @param model the model to unallocate
+ */
+void
+GNUNET_TESTBED_underlaylinkmodel_free (struct GNUNET_TESTBED_UnderlayLinkModel
*model)
+{
+ model->peer->underlay_model_exists = 0;
+ free_entries (model);
+ free_link_properties (model);
+ gnunet_free (model);
+}
+
+
+/**
+ * Commit the model. The model is freed in this function(!).
+ *
+ * @ingroup underlay
+ * @param model the model to commit
+ */
+void
+GNUNET_TESTBED_underlaylinkmodel_commit (struct
GNUNET_TESTBED_UnderlayLinkModel *model)
+{
+ /* FIXME: Marshal the model into a message */
+ GNUNET_break (0);
+ /* do not reset the value of model->peer->underlay_model_exists */
+ free_entries (model);
+ free_link_properties (model);
+ GNUNET_free (model);
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r31278 - gnunet/src/testbed,
gnunet <=