[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r35451 - gnunet/src/rps
From: |
gnunet |
Subject: |
[GNUnet-SVN] r35451 - gnunet/src/rps |
Date: |
Wed, 25 Mar 2015 18:17:18 +0100 |
Author: ch3
Date: 2015-03-25 18:17:18 +0100 (Wed, 25 Mar 2015)
New Revision: 35451
Modified:
gnunet/src/rps/gnunet-service-rps.c
Log:
-further implemented mal peer, restructured code
Modified: gnunet/src/rps/gnunet-service-rps.c
===================================================================
--- gnunet/src/rps/gnunet-service-rps.c 2015-03-25 17:17:13 UTC (rev 35450)
+++ gnunet/src/rps/gnunet-service-rps.c 2015-03-25 17:17:18 UTC (rev 35451)
@@ -369,17 +369,56 @@
/**
* Other malicious peers
*/
-static struct GNUNET_PeerIdentity *mal_peers;
+static struct GNUNET_PeerIdentity *mal_peers = NULL;
/**
* Number of other malicious peers
*/
-static uint32_t num_mal_peers;
+static uint32_t num_mal_peers = 0;
+
/**
- * If type is 2 this is the attacked peer
+ * If type is 2 This struct is used to store the attacked peers in a DLL
*/
+struct AttackedPeer
+{
+ /**
+ * DLL
+ */
+ struct AttackedPeer *next;
+ struct AttackedPeer *prev;
+
+ /**
+ * PeerID
+ */
+ struct GNUNET_PeerIdentity *peer_id;
+};
+
+/**
+ * If type is 2 this is the DLL of attacked peers
+ */
+//static struct AttackedPeer *att_peers_head = NULL;
+//static struct AttackedPeer *att_peers_tail = NULL;
+
+/**
+ * Number of attacked peers
+ */
+//static uint32_t num_attacked_peers = 0;
+
+
+/**
+ * If type is 1 this is the attacked peer
+ */
static struct GNUNET_PeerIdentity attacked_peer;
+
+/**
+ * The limit of PUSHes we can send in one round.
+ * This is an assumption of the Brahms protocol and either implemented
+ * via proof of work
+ * or
+ * assumend to be the bandwidth limitation.
+ */
+static uint32_t push_limit = 10000;
#endif /* ENABLE_MALICIOUS */
@@ -411,6 +450,10 @@
*/
#define unset_peer_flag(peer_ctx, mask) (peer_ctx->peer_flags &= (~mask))
+/**
+ * Compute the minimum of two ints
+ */
+#define min(x, y) ((x < y) ? x : y)
/**
* Clean the send channel of a peer
@@ -1336,7 +1379,97 @@
}
+/**
+ * Compute a random delay.
+ * A uniformly distributed value between mean + spread and mean - spread.
+ *
+ * For example for mean 4 min and spread 2 the minimum is (4 min - (1/2 * 4
min))
+ * It would return a random value between 2 and 6 min.
+ *
+ * @param mean the mean
+ * @param spread the inverse amount of deviation from the mean
+ */
+static struct GNUNET_TIME_Relative
+compute_rand_delay (struct GNUNET_TIME_Relative mean, unsigned int spread)
+{
+ struct GNUNET_TIME_Relative half_interval;
+ struct GNUNET_TIME_Relative ret;
+ unsigned int rand_delay;
+ unsigned int max_rand_delay;
+
+ if (0 == spread)
+ {
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ "Not accepting spread of 0\n");
+ GNUNET_break (0);
+ }
+
+ /* Compute random time value between spread * mean and spread * mean */
+ half_interval = GNUNET_TIME_relative_divide (mean, spread);
+
+ max_rand_delay = GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us /
mean.rel_value_us * (2/spread);
+ /**
+ * Compute random value between (0 and 1) * round_interval
+ * via multiplying round_interval with a 'fraction' (0 to value)/value
+ */
+ rand_delay = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
max_rand_delay);
+ ret = GNUNET_TIME_relative_multiply (mean, rand_delay);
+ ret = GNUNET_TIME_relative_divide (ret, max_rand_delay);
+ ret = GNUNET_TIME_relative_add (ret, half_interval);
+
+ if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us == ret.rel_value_us)
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ "Returning FOREVER_REL\n");
+
+ return ret;
+}
+
+
+/**
+ * Send single pull request
+ *
+ * @param peer_id the peer to send the pull request to.
+ */
static void
+send_pull_request (struct GNUNET_PeerIdentity *peer_id)
+{
+ struct GNUNET_MQ_Envelope *ev;
+ struct GNUNET_MQ_Handle *mq;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending PULL request to peer %s of gossiped list.\n",
+ GNUNET_i2s (peer_id));
+
+ GNUNET_array_append (pending_pull_reply_list, pending_pull_reply_list_size,
*peer_id);
+
+ ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REQUEST);
+ mq = get_mq (peer_map, peer_id);
+ GNUNET_MQ_send (mq, ev);
+}
+
+
+/**
+ * Send single push
+ *
+ * @param peer_id the peer to send the push to.
+ */
+static void
+send_push (struct GNUNET_PeerIdentity *peer_id)
+{
+ struct GNUNET_MQ_Envelope *ev;
+ struct GNUNET_MQ_Handle *mq;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending PUSH to peer %s of gossiped list.\n",
+ GNUNET_i2s (peer_id));
+
+ ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_PUSH);
+ mq = get_mq (peer_map, peer_id);
+ GNUNET_MQ_send (mq, ev);
+}
+
+
+static void
do_round (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
static void
@@ -1359,6 +1492,8 @@
{
struct GNUNET_RPS_CS_ActMaliciousMessage *in_msg;
struct GNUNET_PeerIdentity *peers;
+ uint32_t num_mal_peers_sent;
+ uint32_t num_mal_peers_old;
/* Check for protocol violation */
if (sizeof (struct GNUNET_RPS_CS_ActMaliciousMessage) > ntohs (msg->size))
@@ -1381,10 +1516,7 @@
/* Do actual logic */
peers = (struct GNUNET_PeerIdentity *) &msg[1];
- num_mal_peers = ntohl (in_msg->num_peers);
mal_type = ntohl (in_msg->type);
- num_attacked_peers = 0;
- attacked_peers = NULL;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Now acting malicious type %" PRIu32 "\n",
@@ -1392,10 +1524,15 @@
if (1 == mal_type)
{ /* Try to maximise representation */
- num_mal_peers = ntohl (in_msg->num_peers);
- mal_peers = GNUNET_new_array (num_mal_peers,
- struct GNUNET_PeerIdentity);
- memcpy (mal_peers, peers, num_mal_peers * sizeof (struct
GNUNET_PeerIdentity));
+ /* Add other malicious peers to those we already know */
+ num_mal_peers_sent = ntohl (in_msg->num_peers);
+ num_mal_peers_old = num_mal_peers;
+ GNUNET_array_grow (mal_peers,
+ num_mal_peers,
+ num_mal_peers + num_mal_peers_sent);
+ memcpy (&mal_peers[num_mal_peers_old],
+ peers,
+ num_mal_peers_sent * sizeof (struct GNUNET_PeerIdentity));
/* Substitute do_round () with do_mal_round () */
GNUNET_SCHEDULER_cancel (do_round_task);
@@ -1403,14 +1540,25 @@
}
else if (2 == mal_type)
{ /* Try to partition the network */
- num_mal_peers = ntohl (in_msg->num_peers) - 1;
- mal_peers = GNUNET_new_array (num_mal_peers,
- struct GNUNET_PeerIdentity);
- memcpy (mal_peers, peers, num_mal_peers);
+ /* Add other malicious peers to those we already know */
+ num_mal_peers_sent = ntohl (in_msg->num_peers) - 1;
+ num_mal_peers_old = num_mal_peers;
+ GNUNET_array_grow (mal_peers,
+ num_mal_peers,
+ num_mal_peers + num_mal_peers_sent);
+ memcpy (&mal_peers[num_mal_peers_old],
+ peers,
+ num_mal_peers_sent * sizeof (struct GNUNET_PeerIdentity));
- GNUNET_array_grow (attacked_peers, num_attacked_peers, 1);
- memcpy (attacked_peers, &peers[num_mal_peers], 1 * sizeof (struct
GNUNET_PeerIdentity));
+ /* Store the one attacked peer */
+ memcpy (&attacked_peer,
+ &peers[num_mal_peers_sent],
+ sizeof (struct GNUNET_PeerIdentity));
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Attacked peer is %s\n",
+ GNUNET_i2s (&attacked_peer));
+
/* Substitute do_round () with do_mal_round () */
GNUNET_SCHEDULER_cancel (do_round_task);
do_round_task = GNUNET_SCHEDULER_add_now (&do_mal_round, NULL);
@@ -1428,7 +1576,6 @@
{
GNUNET_break (0);
}
-
}
@@ -1442,8 +1589,6 @@
{
uint32_t num_pushes;
uint32_t i;
- unsigned int rand_delay;
- struct GNUNET_TIME_Relative half_round_interval;
struct GNUNET_TIME_Relative time_next_round;
LOG (GNUNET_ERROR_TYPE_DEBUG, "Going to execute next round maliciously.\n");
@@ -1453,31 +1598,27 @@
{ /* Try to maximise representation */
num_pushes = min (min (push_limit, /* FIXME: attacked peer */
num_mal_peers), GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE);
for (i = 0 ; i < num_pushes ; i++)
- { /* Send PUSH to attacked peer */
+ { /* Send PUSHes to attacked peers */
//GNUNET_CONTAINER_multihashmap_iterator_create
+ //send_push ();
+
+ // TODO send pulls
+ // send_pull_request
}
}
else if (2 == mal_type)
- { /* Try to partition the network */
- /* Send as many pushes to attacked peer as possible */
+ { /**
+ * Try to partition the network
+ * Send as many pushes to attacked peer as possible
+ */
+ send_push (&attacked_peer);
}
- /* Compute random time value between .5 * round_interval and 1.5
*round_interval */
- half_round_interval = GNUNET_TIME_relative_divide (round_interval, 2);
- do
- {
- /*
- * Compute random value between (0 and 1) * round_interval
- * via multiplying round_interval with a 'fraction' (0 to value)/value
- */
- rand_delay = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
UINT_MAX/10);
- time_next_round = GNUNET_TIME_relative_multiply (round_interval,
rand_delay);
- time_next_round = GNUNET_TIME_relative_divide (time_next_round,
UINT_MAX/10);
- time_next_round = GNUNET_TIME_relative_add (time_next_round,
half_round_interval);
- } while (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us ==
time_next_round.rel_value_us);
+ /* Schedule next round */
+ time_next_round = compute_rand_delay (round_interval, 2);
- /* Schedule next round */
- do_round_task = GNUNET_SCHEDULER_add_delayed (round_interval, &do_mal_round,
NULL);
+ //do_round_task = GNUNET_SCHEDULER_add_delayed (round_interval,
&do_mal_round, NULL);
+ do_round_task = GNUNET_SCHEDULER_add_delayed (time_next_round,
&do_mal_round, NULL);
LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished round\n");
}
#endif /* ENABLE_MALICIOUS */
@@ -1496,10 +1637,8 @@
uint32_t i;
unsigned int *permut;
unsigned int n_peers; /* Number of peers we send pushes/pulls to */
- struct GNUNET_MQ_Envelope *ev;
struct GNUNET_PeerIdentity peer;
struct GNUNET_PeerIdentity *tmp_peer;
- struct GNUNET_MQ_Handle *mq;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Printing gossip list:\n");
@@ -1527,13 +1666,7 @@
peer = gossip_list[permut[i]];
if (0 != GNUNET_CRYPTO_cmp_peer_identity (&own_identity, &peer)) // TODO
{ // FIXME if this fails schedule/loop this for later
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending PUSH to peer %s of gossiped list.\n",
- GNUNET_i2s (&peer));
-
- ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_PUSH);
- mq = get_mq (peer_map, &peer);
- GNUNET_MQ_send (mq, ev);
+ send_push (&peer);
}
}
GNUNET_free (permut);
@@ -1555,17 +1688,9 @@
peer = *tmp_peer;
GNUNET_free (tmp_peer);
- GNUNET_array_append (pending_pull_reply_list,
pending_pull_reply_list_size, peer);
-
if (0 != GNUNET_CRYPTO_cmp_peer_identity (&own_identity, &peer))
- { // FIXME if this fails schedule/loop this for later
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending PULL request to peer %s of gossiped list.\n",
- GNUNET_i2s (&peer));
-
- ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_RPS_PP_PULL_REQUEST);
- mq = get_mq (peer_map, &peer);
- GNUNET_MQ_send (mq, ev);
+ {
+ send_pull_request (&peer);
}
}
}
@@ -1665,26 +1790,12 @@
GNUNET_array_grow (pull_list, pull_list_size, 0);
struct GNUNET_TIME_Relative time_next_round;
- struct GNUNET_TIME_Relative half_round_interval;
- unsigned int rand_delay;
+ time_next_round = compute_rand_delay (round_interval, 2);
- /* Compute random time value between .5 * round_interval and 1.5
*round_interval */
- half_round_interval = GNUNET_TIME_relative_divide (round_interval, 2);
- do
- {
- /*
- * Compute random value between (0 and 1) * round_interval
- * via multiplying round_interval with a 'fraction' (0 to value)/value
- */
- rand_delay = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
UINT_MAX/10);
- time_next_round = GNUNET_TIME_relative_multiply (round_interval,
rand_delay);
- time_next_round = GNUNET_TIME_relative_divide (time_next_round,
UINT_MAX/10);
- time_next_round = GNUNET_TIME_relative_add (time_next_round,
half_round_interval);
- } while (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us ==
time_next_round.rel_value_us);
-
/* Schedule next round */
- do_round_task = GNUNET_SCHEDULER_add_delayed (round_interval, &do_round,
NULL);
+ //do_round_task = GNUNET_SCHEDULER_add_delayed (round_interval, &do_round,
NULL);
+ do_round_task = GNUNET_SCHEDULER_add_delayed (time_next_round, &do_round,
NULL);
LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished round\n");
}
@@ -1872,6 +1983,10 @@
GNUNET_array_grow (gossip_list, gossip_list_size, 0);
GNUNET_array_grow (push_list, push_list_size, 0);
GNUNET_array_grow (pull_list, pull_list_size, 0);
+ #ifdef ENABLE_MALICIOUS
+ GNUNET_array_grow (mal_peers, num_mal_peers, 0);
+ // TODO empty attacked_peers DLL
+ #endif /* ENABLE_MALICIOUS */
}
@@ -1925,8 +2040,6 @@
//}
peer_ctx->recv_channel = channel;
- peer_ctx->mq = NULL;
-
(void) GNUNET_CONTAINER_multipeermap_put (peer_map, &peer, peer_ctx,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r35451 - gnunet/src/rps,
gnunet <=