[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r33050 - in gnunet/src: dht include
From: |
gnunet |
Subject: |
[GNUnet-SVN] r33050 - in gnunet/src: dht include |
Date: |
Sun, 13 Apr 2014 13:54:17 +0200 |
Author: supriti
Date: 2014-04-13 13:54:17 +0200 (Sun, 13 Apr 2014)
New Revision: 33050
Modified:
gnunet/src/dht/gnunet-service-xdht_clients.c
gnunet/src/dht/gnunet-service-xdht_datacache.c
gnunet/src/dht/gnunet-service-xdht_datacache.h
gnunet/src/dht/gnunet-service-xdht_neighbours.c
gnunet/src/dht/gnunet-service-xdht_neighbours.h
gnunet/src/dht/gnunet-service-xdht_routing.c
gnunet/src/dht/gnunet-service-xdht_routing.h
gnunet/src/include/gnunet_protocols.h
Log:
Framework for trail rejection and threshold on links
first phase changes for get.
Modified: gnunet/src/dht/gnunet-service-xdht_clients.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_clients.c 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_clients.c 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -843,15 +843,14 @@
GNUNET_h2s (&cqr->key),
cqr->replication,
cqr->seen_replies_count);
+
+ /* FIXME: Here I am passing NULL for parameters check if its correct or
+ not. */
#if 0
- /* FIXME: Change it to your own handle_get. */
GDS_NEIGHBOURS_handle_get (cqr->type, cqr->msg_options, cqr->replication,
- 0 /* hop count */ ,
- &cqr->key, cqr->xquery, cqr->xquery_size,
reply_bf,
- reply_bf_mutator, peer_bf);
-#endif
-
-
+ 0 /* hop count */ ,NULL, NULL, 0,
+ &cqr->key, NULL, NULL, 0);
+#endif
/* exponential back-off for retries.
* max GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD (15 min) */
cqr->retry_frequency = GNUNET_TIME_STD_BACKOFF (cqr->retry_frequency);
@@ -940,14 +939,14 @@
ntohl (put_msg->type),
size - sizeof (struct GNUNET_DHT_ClientPutMessage),
&put_msg[1]);
- /* store locally */
+ /* FIXME: Should we store locally? */
GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put_msg->expiration),
&put_msg->key, 0, NULL, ntohl (put_msg->type),
size - sizeof (struct GNUNET_DHT_ClientPutMessage),
&put_msg[1]);
- /* FIXME: At the moment we don't use replication in x-vine. But keep it for
- time being. Check all the fields again. */
+ /* FIXME: Is it correct to pass NULL for current destination and current
+ source. */
GDS_NEIGHBOURS_handle_put (ntohl (put_msg->type), ntohl (put_msg->options),
ntohl (put_msg->desired_replication_level),
GNUNET_TIME_absolute_ntoh (put_msg->expiration),
@@ -955,7 +954,7 @@
&put_msg->key, 0, NULL, &put_msg[1],
size -
sizeof (struct GNUNET_DHT_ClientPutMessage),
- NULL, 0, NULL);
+ NULL, NULL, 0, NULL);
GDS_CLIENTS_process_put (ntohl (put_msg->options),
ntohl (put_msg->type),
@@ -1047,9 +1046,12 @@
if (GNUNET_SCHEDULER_NO_TASK != retry_task)
GNUNET_SCHEDULER_cancel (retry_task);
retry_task = GNUNET_SCHEDULER_add_now (&transmit_next_request_task, NULL);
- /* perform local lookup */
+ /* perform local lookup
+ * FIXME: Should we call it here or in neighbours file. And how to handle
+ * this case where we may get the data locally. You really need to rethink
+ * this design again.
GDS_DATACACHE_handle_get (&get->key, cqr->type, cqr->xquery, xquery_size,
- NULL, 0);
+ NULL, 0); */
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
Modified: gnunet/src/dht/gnunet-service-xdht_datacache.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_datacache.c 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_datacache.c 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -19,7 +19,7 @@
*/
/**
- * @file dht/gnunet-service-xdht_datacache.c
+ * @file dht/gnunet-service-dht_datacache.c
* @brief GNUnet DHT service's datacache integration
* @author Christian Grothoff
* @author Nathan Evans
@@ -29,7 +29,8 @@
#include "gnunet-service-xdht_clients.h"
#include "gnunet-service-xdht_datacache.h"
#include "gnunet-service-xdht_routing.h"
-#include "gnunet-service-xdht.h"
+#include "gnunet-service-xdht_neighbours.h"
+#include "gnunet-service-dht.h"
#define LOG(kind,...) GNUNET_log_from (kind, "dht-dtcache",__VA_ARGS__)
@@ -61,7 +62,7 @@
const void *data)
{
int r;
-
+
if (NULL == datacache)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -84,7 +85,28 @@
GNUNET_h2s (key), data_size, r, put_path_length);
}
+/**
+ * List of peers in the get path.
+ */
+struct GetPath
+{
+ /**
+ * Pointer to next item in the list
+ */
+ struct GetPath *next;
+
+ /**
+ * Pointer to previous item in the list
+ */
+ struct GetPath *prev;
+
+ /**
+ * An element in the get path.
+ */
+ struct GNUNET_PeerIdentity peer;
+};
+
/**
* Context containing information about a GET request.
*/
@@ -114,11 +136,37 @@
* Mutator value for the reply_bf, see gnunet_block_lib.h
*/
uint32_t reply_bf_mutator;
-
+
/**
+ * Total number of peers in get path.
+ */
+ unsigned int get_path_length;
+
+ /**
* Return value to give back.
*/
enum GNUNET_BLOCK_EvaluationResult eval;
+
+ /**
+ *
+ */
+ unsigned int current_trail_index;
+
+ /**
+ *
+ */
+ struct GNUNET_PeerIdentity next_hop;
+
+ /**
+ * Head of trail to reach this finger.
+ */
+ struct GetPath *head;
+
+ /**
+ * Tail of trail to reach this finger.
+ */
+ struct GetPath *tail;
+ /* get_path */
};
@@ -163,9 +211,22 @@
GNUNET_STATISTICS_update (GDS_stats,
gettext_noop
("# Good RESULTS found in datacache"), 1,
- GNUNET_NO);
- /* GDS_CLIENTS_handle_reply (exp, key, 0, NULL, put_path_length, put_path,
- type, size, data);*/
+ GNUNET_NO);
+ struct GNUNET_PeerIdentity *get_path;
+ get_path = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ struct GetPath *iterator;
+ iterator = ctx->head;
+ int i = 0;
+ while (i < ctx->get_path_length)
+ {
+ memcpy (&get_path[i], &(iterator->peer), sizeof (struct
GNUNET_PeerIdentity));
+ i++;
+ iterator = iterator->next;
+ }
+ GDS_NEIGHBOURS_send_get_result (exp, key, put_path_length, put_path,
+ type, size, data, get_path,
ctx->get_path_length,
+ ctx->current_trail_index,
&(ctx->next_hop));
+
/* forward to other peers */
GDS_ROUTING_process (type, exp, key, put_path_length, put_path, 0, NULL,
data, size);
@@ -217,13 +278,19 @@
* @param reply_bf where the reply bf is (to be) stored, possibly updated, can
be NULL
* @param reply_bf_mutator mutation value for reply_bf
* @return evaluation result for the local replies
+ * @get_path_length Total number of peers in get path
+ * @get_path Peers in get path.
*/
enum GNUNET_BLOCK_EvaluationResult
GDS_DATACACHE_handle_get (const struct GNUNET_HashCode * key,
enum GNUNET_BLOCK_Type type, const void *xquery,
size_t xquery_size,
struct GNUNET_CONTAINER_BloomFilter **reply_bf,
- uint32_t reply_bf_mutator)
+ uint32_t reply_bf_mutator,
+ uint32_t get_path_length,
+ struct GNUNET_PeerIdentity *get_path,
+ unsigned int current_trail_index,
+ struct GNUNET_PeerIdentity *next_hop)
{
struct GetRequestContext ctx;
unsigned int r;
@@ -239,6 +306,23 @@
ctx.xquery_size = xquery_size;
ctx.reply_bf = reply_bf;
ctx.reply_bf_mutator = reply_bf_mutator;
+ ctx.get_path_length = get_path_length;
+ memcpy (&(ctx.next_hop), next_hop, sizeof (struct GNUNET_PeerIdentity));
+ ctx.current_trail_index = current_trail_index;
+ /* FIXME: add the get path into ctx and then call gds_neighbours_handle_get*/
+ int i = 0;
+ while (i < get_path_length)
+ {
+ struct GetPath *element;
+ element = GNUNET_malloc (sizeof (struct GetPath));
+ element->next = NULL;
+ element->prev = NULL;
+
+ memcpy (&(element->peer), &get_path[i], sizeof(struct
GNUNET_PeerIdentity));
+ GNUNET_CONTAINER_DLL_insert_tail(ctx.head, ctx.tail, element);
+ i++;
+ }
+
r = GNUNET_DATACACHE_get (datacache, key, type, &datacache_get_iterator,
&ctx);
LOG (GNUNET_ERROR_TYPE_DEBUG,
Modified: gnunet/src/dht/gnunet-service-xdht_datacache.h
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_datacache.h 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_datacache.h 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -19,13 +19,13 @@
*/
/**
- * @file dht/gnunet-service-xdht_datacache.h
+ * @file dht/gnunet-service-dht_datacache.h
* @brief GNUnet DHT service's datacache integration
* @author Christian Grothoff
* @author Nathan Evans
*/
-#ifndef GNUNET_SERVICE_XDHT_DATACACHE_H
-#define GNUNET_SERVICE_XDHT_DATACACHE_H
+#ifndef GNUNET_SERVICE_DHT_DATACACHE_H
+#define GNUNET_SERVICE_DHT_DATACACHE_H
#include "gnunet_util_lib.h"
#include "gnunet_block_lib.h"
@@ -67,7 +67,11 @@
enum GNUNET_BLOCK_Type type, const void *xquery,
size_t xquery_size,
struct GNUNET_CONTAINER_BloomFilter **reply_bf,
- uint32_t reply_bf_mutator);
+ uint32_t reply_bf_mutator,
+ uint32_t get_path_length,
+ struct GNUNET_PeerIdentity *get_path,
+ unsigned int current_trail_index,
+ struct GNUNET_PeerIdentity *next_hop);
/**
Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -49,6 +49,8 @@
#include "dht.h"
/* TODO:
+ * 1. when should we use const struct and replace wherever needed.
+ * 2. use assert for each function where you need to check the return value.
1. Use a global array of all known peers in find_successor, Only when
a new peer is added in finger or friend peer map, then re calculate
the array. Or else use the old one.
@@ -118,7 +120,7 @@
/**
* Content type.
*/
- uint32_t type GNUNET_PACKED;
+ uint32_t block_type GNUNET_PACKED;
/**
* Hop count
@@ -135,18 +137,18 @@
*/
uint32_t put_path_length GNUNET_PACKED;
- /**
- * Source peer
- */
- struct GNUNET_PeerIdentity source_peer;
-
/**
- * Current destination
+ * Current destination to which this message is forwarded.
*/
struct GNUNET_PeerIdentity current_destination;
+ /**
+ * Peer whose finger is current_destination.
+ */
+ struct GNUNET_PeerIdentity current_source;
+
/**
- * Current destination type
+ * current_destination type.
*/
enum current_destination_type current_destination_type;
@@ -179,6 +181,11 @@
struct GNUNET_MessageHeader header;
/**
+ * The type for the data.
+ */
+ uint32_t type GNUNET_PACKED;
+
+ /**
* Peer which is sending get result message.
*/
struct GNUNET_PeerIdentity source_peer;
@@ -192,8 +199,18 @@
* Current index in get path.
*/
unsigned int current_path_index;
+ /**
+ * Number of peers recorded in the outgoing path from source to the
+ * storgage location of this message.
+ */
+ uint32_t put_path_length GNUNET_PACKED;
/**
+ * When does this entry expire?
+ */
+ struct GNUNET_TIME_AbsoluteNBO expiration;
+
+ /**
* Length of the GET path that follows (if tracked).
*/
uint32_t get_path_length GNUNET_PACKED;
@@ -228,33 +245,44 @@
struct GNUNET_MessageHeader header;
/**
- * Source peer
+ * Processing options
*/
- struct GNUNET_PeerIdentity source_peer;
+ uint32_t options GNUNET_PACKED;
/**
+ * Desired content type.
+ */
+ uint32_t block_type GNUNET_PACKED;
+
+ /**
+ * Hop count
+ */
+ uint32_t hop_count GNUNET_PACKED;
+
+ /**
+ * Desired replication level for this request.
+ */
+ uint32_t desired_replication_level GNUNET_PACKED;
+
+ /**
* Total number of peers in get path.
*/
unsigned int get_path_length;
/**
- *
+ * Peer which is an intermediate destination.
*/
struct GNUNET_PeerIdentity current_destination;
-
+
/**
- *
+ * Source for which current_destination is the finger.
*/
- enum current_destination_type current_dest_type;
+ struct GNUNET_PeerIdentity current_source;
/**
- * Unique identifier of the request.
+ * Type of current destination
*/
- uint64_t request_id;
- /**
- * When does the content expire?
- */
- struct GNUNET_TIME_AbsoluteNBO expiration_time;
+ enum current_destination_type current_dest_type;
/**
* The key we are looking for.
@@ -298,6 +326,13 @@
struct GNUNET_PeerIdentity current_destination;
/**
+ * In case the packet is forwarded to an intermediate finger, then
+ * current_source contains the peer id whose finger is the intermediate
+ * finger. In case the packet is forwarded to a friend, then it is NULL.
+ */
+ struct GNUNET_PeerIdentity current_source;
+
+ /**
* Index into finger peer map.
*/
unsigned int finger_map_index;
@@ -348,7 +383,45 @@
};
+/**
+ *
+ */
+struct PeerTrailRejectionMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_REJECTION
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Source peer which wants to set up the trail.
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Finger identity value.
+ */
+ uint64_t finger_identity;
+
+ /**
+ * Peer which sent trail rejection message.
+ */
+ struct GNUNET_PeerIdentity congested_peer;
+
+ /**
+ * Index in finger peer map of source peer.
+ */
+ unsigned int finger_map_index;
+
+ /**
+ * Total number of peers in the trail.
+ */
+ unsigned int trail_length;
+
+ /* trail_list */
+};
+
/**
* P2P Verify Successor message.
*/
@@ -573,7 +646,7 @@
unsigned int finger_map_index;
/**
- * Total number of entries in trail from [me,finger]
+ * Total number of entries in trail from (me,finger]
*/
unsigned int trail_length;
@@ -614,6 +687,30 @@
/**
+ * FIXME: Think of better comments.
+ * An entry in Failed_Trail_List
+ */
+struct FailedTrail
+{
+ /**
+ * Source peer which was trying to setup up the trail to @a
destination_finger_value
+ */
+ struct GNUNET_PeerIdentity source_peer;
+
+ /**
+ * Value to which we were trying to find the closest successor.
+ */
+ uint64_t destination_finger_value;
+
+ /**
+ * Peer which has crossed the threshold limit on its routing table size.
+ */
+ struct GNUNET_PeerIdentity congested_peer;
+
+};
+
+
+/**
* Task that sends FIND FINGER TRAIL requests.
*/
static GNUNET_SCHEDULER_TaskIdentifier find_finger_trail_task;
@@ -640,6 +737,11 @@
static struct GNUNET_CONTAINER_MultiPeerMap *finger_peermap;
/**
+ * Hash maps of all the trail which failed due to a congested peer.
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *failed_trail_list;
+
+/**
* Handle to CORE.
*/
static struct GNUNET_CORE_Handle *core_api;
@@ -754,11 +856,13 @@
}
-/**
+/**FIXME: add better comment for current_source which shows its relation
+ * with current_destination.
* Construct a trail message and forward it to a friend.
* @param source_peer Peer which wants to set up the trail to one of its
finger.
* @param destination_finger Value whose successor we are searching the
network.
* @param current_destination Peer which gets this message.
+ * @param current_source Peer for which current_destination is its finger.
* @param target_friend Current friend to which this message should be
forwarded.
* @param trail_length Numbers of peers in the trail.
* @param trail_peer_list peers this request has traversed so far
@@ -769,6 +873,7 @@
GDS_NEIGHBOURS_send_trail_setup (struct GNUNET_PeerIdentity *source_peer,
uint64_t destination_finger,
struct GNUNET_PeerIdentity
*current_destination,
+ struct GNUNET_PeerIdentity *current_source,
struct FriendInfo *target_friend,
unsigned int trail_length,
struct GNUNET_PeerIdentity *trail_peer_list,
@@ -805,6 +910,9 @@
memcpy (&(tsm->destination_finger), &destination_finger, sizeof (uint64_t));
memcpy (&(tsm->source_peer), source_peer, sizeof (struct
GNUNET_PeerIdentity));
memcpy (&(tsm->current_destination), current_destination, sizeof (struct
GNUNET_PeerIdentity));
+ /* FIXME: Is it correct to use NULL here for comparison? */
+ if (current_source != NULL)
+ memcpy (&(tsm->current_source), current_source, sizeof (struct
GNUNET_PeerIdentity));
tsm->current_destination_type = htonl (type);
tsm->trail_length = htonl (trail_length);
tsm->finger_map_index = htonl (finger_map_index);
@@ -1075,7 +1183,7 @@
* @return Friend
*/
static struct FriendInfo *
-select_random_friend()
+select_random_friend (struct GNUNET_PeerIdentity *congested_peer)
{
unsigned int current_size;
unsigned int *index;
@@ -1099,7 +1207,18 @@
}
if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next
(iter,&key_ret,(const void **)&friend))
+ {
+ /* TODO: Here you have chosen a random friend. Now you should check the
size
+ of its routing table size, and if its more than threshold, then check
which
+ of the entries has trail length greater than trail length threshold. we
+ should without checking the routing table size also we should check the
+ trail with trail length greater than threshold. then
+ you should try to find a new route through this new node that has joined
in
+ only for those finger entries whose trail length is greater than
threshold.
+ But I don't want the new node to wait for this process to get over. so
+ should i declare a function which will be called after some interval.*/
return friend;
+ }
else
return NULL;
}
@@ -1251,17 +1370,18 @@
}
select_friend:
- /* FIXME: Here should we choose randomly or not. */
- target_friend = select_random_friend();
+ target_friend = select_random_friend (NULL);
finger_map_index = current_finger_index;
current_finger_index = ( current_finger_index + 1) % MAX_FINGERS;
if(NULL != target_friend)
{
+ /* FIXME: Here I am passing NULL for current source, is it correct?
+ also, we set the current source only if current_destination_type
+ is finger. */
GDS_NEIGHBOURS_send_trail_setup (&my_identity, *finger_identity,
&(target_friend->id),
- target_friend, 0, NULL,
- finger_map_index, FRIEND);
+ NULL, target_friend, 0, NULL,
finger_map_index, FRIEND);
}
/* FIXME: How to decide the correct interval? */
@@ -1390,7 +1510,6 @@
{
my_identity = *identity;
-#if 0
/* SUPU TEST CODE */
struct GNUNET_PeerIdentity *print_peer;
print_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
@@ -1398,7 +1517,7 @@
FPRINTF (stderr,_("\nSUPU %s, %s, %d,my_identity = %s"),
__FILE__, __func__,__LINE__, GNUNET_i2s (print_peer));
/* SUPU TEST CODE ENDS */
-#endif
+
}
@@ -1443,7 +1562,6 @@
* @param new_finger
* @return
*/
-#if 0
static int
compare_finger_identity (struct GNUNET_PeerIdentity *existing_finger,
struct GNUNET_PeerIdentity *new_finger)
@@ -1453,16 +1571,16 @@
(existing_finger == new_finger) ? 0 : -1;
return ret;
}
-#endif
+
/**
- * FIXME: Not sure of the logic to find the correct predecessor.
+ * FIXME: Not sure of the logic to find the correct predecessor
+ * I think logic of this code is wrong everything else seems to be correct.
* Given two finger identities, find the closest predecessor.
* @param existing_predecessor
* @param new_predecessor
* @return
*/
-#if 0
static int
compare_predecessor(struct GNUNET_PeerIdentity *existing_predecessor,
struct GNUNET_PeerIdentity *new_predecessor)
@@ -1472,11 +1590,11 @@
(existing_predecessor == new_predecessor) ? 0 : -1;
return ret;
}
-#endif
+
+
/*
* Add an entry in finger table.
- * Add an entry into finger table
* @param finger_identity Peer identity of finger
* @param finger_trail Trail to reach the finger
* @param trail_length Number of peers in the trail.
@@ -1489,15 +1607,15 @@
unsigned int finger_map_index)
{
struct FingerInfo *new_finger_entry;
+ struct GNUNET_PeerIdentity key_ret;
int i;
-#if 0
struct GNUNET_CONTAINER_MultiPeerMapIterator *finger_iter;
- struct GNUNET_PeerIdentity key_ret;
struct FingerInfo *existing_finger;
int finger_index;
- int i;
-
+ /* SUPU Here we trying to check if we already have an entry. If yes then we
+ can keep two trails for redundant routing. if they are different then we
+ need to choose the closest one. and remove the other one. */
finger_iter = GNUNET_CONTAINER_multipeermap_iterator_create
(finger_peermap);
for (finger_index = 0; finger_index < GNUNET_CONTAINER_multipeermap_size
(finger_peermap); finger_index++)
@@ -1505,25 +1623,43 @@
if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (finger_iter,
&key_ret,
(const void
**)&existing_finger))
{
- /* If we already have an entry at the finger map index. */
if ((finger_map_index == existing_finger->finger_map_index))
{
- /* Check if the finger entry are same. */
if (0 == GNUNET_CRYPTO_cmp_peer_identity
(&(existing_finger->finger_identity),finger_identity))
{
- FPRINTF (stderr,_("\nSUPU %s, %s, %d"), __FILE__,
__func__,__LINE__);
+ FPRINTF (stderr,_("\nSUPU Entries are same. %s, %s, %d"),
__FILE__, __func__,__LINE__);
+ /* FIXME: Here you should check if the trail is same. If yes then
don't add the entry. it
+ seems to be very suboptimal. */
+ if ((existing_finger->trail_length) == trail_length)
+ {
+ struct TrailPeerList *iterate;
+ iterate = existing_finger->head;
+ int k;
+ k = 0;
+ while (k < trail_length)
+ {
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&(iterate->peer),
&finger_trail[k]))
+ {
+ k++;
+ iterate = iterate->next;
+ }
+ }
+ if (k == trail_length)
+ return;
+ else
+ goto add_new_entry;
+ }
goto add_new_entry;
}
else
{
- /* FIXME: here you should have something better to check which finger
- is closer one. */
int ret;
if (finger_map_index == 1)
{
- FPRINTF (stderr,_("\nSUPU %s, %s, %d"), __FILE__,
__func__,__LINE__);
+ FPRINTF (stderr,_("\nSUPUP Predecessor are different %s, %s, %d"),
__FILE__, __func__,__LINE__);
ret = compare_predecessor (&(existing_finger->finger_identity),
finger_identity);
+ goto add_new_entry;
}
else
{
@@ -1533,7 +1669,7 @@
}
if (ret > 0)
{
- FPRINTF (stderr,_("\nSUPU %s, %s, %d"), __FILE__,
__func__,__LINE__);
+ FPRINTF (stderr,_("\nSUPU Adding the new one and removing the old
one %s, %s, %d"), __FILE__, __func__,__LINE__);
GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multipeermap_remove (finger_peermap,
&(existing_finger->finger_identity),
@@ -1542,7 +1678,7 @@
}
else
{
- FPRINTF (stderr,_("\nSUPU %s, %s, %d"), __FILE__,
__func__,__LINE__);
+ FPRINTF (stderr,_("\nSUPU Nothing to do return %s, %s, %d"),
__FILE__, __func__,__LINE__);
return;
}
}
@@ -1551,36 +1687,81 @@
}
add_new_entry:
-#endif
new_finger_entry = GNUNET_malloc (sizeof (struct FingerInfo));
memcpy (&(new_finger_entry->finger_identity), finger_identity, sizeof
(struct GNUNET_PeerIdentity));
+ new_finger_entry->finger_map_index = finger_map_index;
- i = 0;
- while (i < trail_length)
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, finger_identity))
{
- struct TrailPeerList *element;
- element = GNUNET_malloc (sizeof (struct TrailPeerList));
- element->next = NULL;
- element->prev = NULL;
+ /* I am the finger */
+ new_finger_entry->trail_length = 0;
+ }
+ else
+ {
+ i = 0;
+ while (i < trail_length)
+ {
+ struct TrailPeerList *element;
+ element = GNUNET_malloc (sizeof (struct TrailPeerList));
+ element->next = NULL;
+ element->prev = NULL;
- memcpy (&(element->peer), &finger_trail[i], sizeof(struct
GNUNET_PeerIdentity));
- GNUNET_CONTAINER_DLL_insert_tail(new_finger_entry->head,
new_finger_entry->tail, element);
- i++;
+ memcpy (&(element->peer), &finger_trail[i], sizeof(struct
GNUNET_PeerIdentity));
+ GNUNET_CONTAINER_DLL_insert_tail(new_finger_entry->head,
new_finger_entry->tail, element);
+ i++;
+ }
+ new_finger_entry->trail_length = trail_length;
}
- new_finger_entry->finger_map_index = finger_map_index;
- new_finger_entry->trail_length = trail_length;
-
/* FIXME: Here we are keeping multiple hashmap option so that there are
multiple routes to reach to same finger, redundant routing.
- * Also same peers could be our fingers for different finger map index */
+ * Also same peers could be our fingers for different finger map index
+ * Should we handle the case where we have same fingers at the different
+ * finger index but with different trail to reach. */
GNUNET_assert (GNUNET_OK ==
GNUNET_CONTAINER_multipeermap_put (finger_peermap,
&(new_finger_entry->finger_identity),
new_finger_entry,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); /* Fixme: change to multiple */
+ /* SUPU TEST CODE */
+ /* Here I want to iterate over finger peer map, print its id and the trail
+ to reach to the finger. */
+ int test_index;
+ struct GNUNET_CONTAINER_MultiPeerMapIterator *test_iter;
+ struct FingerInfo *test_finger;
+ test_iter = GNUNET_CONTAINER_multipeermap_iterator_create (finger_peermap);
+ FPRINTF (stderr,_("\nSUPU #### %s, %s, %d, size = %d####"),__FILE__,
__func__,__LINE__,GNUNET_CONTAINER_multipeermap_size (finger_peermap));
+ for (test_index = 0; test_index < GNUNET_CONTAINER_multipeermap_size
(finger_peermap); test_index++)
+ {
+ FPRINTF (stderr,_("\nSUPU *********%s, %s, %d, %d
entry*********"),__FILE__, __func__,__LINE__,test_index);
+ if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (test_iter,
&key_ret,
+ (const void
**)&test_finger))
+ {
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d "),__FILE__, __func__,__LINE__);
+ struct GNUNET_PeerIdentity *print_peer;
+ struct TrailPeerList *iterator;
+ int z;
+ iterator = GNUNET_malloc (sizeof (struct TrailPeerList));
+ print_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ memcpy (print_peer, &(test_finger->finger_identity), sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, finger_index = %d"), __FILE__,
__func__,__LINE__,test_finger->finger_map_index);
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, finger_identity = %s"),
+ __FILE__, __func__,__LINE__, GNUNET_i2s (print_peer));
+ iterator = test_finger->head;
+ z = 0;
+ while (z < test_finger->trail_length)
+ {
+ memcpy (print_peer, &(iterator->peer), sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail[%d] = %s"),__FILE__,
__func__,__LINE__,z,GNUNET_i2s (print_peer));
+ z++;
+ iterator = iterator->next;
+ }
+ }
+ }
+ FPRINTF (stderr,_("\nSUPU End of loop%s, %s, %d"),__FILE__,
__func__,__LINE__);
+ /* SUPU TEST CODE ENDS */
+
-
if (1 == GNUNET_CONTAINER_multipeermap_size (finger_peermap)
&& (new_finger_entry->finger_map_index!= 1))
{
@@ -1774,13 +1955,12 @@
/**
- * FIXME:
- * 1. Do we have an expiration time for get request? Yes but I don't know its
- * use case and how to handle it
* Send a get message to selected target friend. If target friend in NULL,
* then search for a target friend.
- * @param request_id Unique ID identifying this request
- * @param source_peer Peer which started get request
+ * @param block_type type of the block
+ * @param options routing options
+ * @param desired_replication_level desired replication count
+ * @param hop_count how many hops did this request traverse so far?
* @param get_peer_path Peer list to reach to final destination which contains
the data.
* @param get_path_length Total numbers of peer in get_path
* @param key Key key for the content
@@ -1789,12 +1969,16 @@
* @param current_dest_type Type of current destination can be either FRIEND
or FINGER
*/
void
-GDS_NEIGHBOURS_handle_get (struct GNUNET_PeerIdentity *source_peer,
+GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ uint32_t hop_count,
struct GNUNET_PeerIdentity *get_peer_path,
unsigned int get_path_length,
struct GNUNET_HashCode *key,
struct GNUNET_PeerIdentity *target_peer,
struct GNUNET_PeerIdentity *current_destination,
+ struct GNUNET_PeerIdentity *current_source,
enum current_destination_type *current_dest_type)
{
struct PeerGetMessage *get_request;
@@ -1818,32 +2002,33 @@
/* FIXME: Is this correct comparison? */
if (NULL == target_peer)
{
- /* This is the first call made from client file. */
+ /* We have received the request from the client file and we don't know
+ to which peer should we forward the message to. */
struct GNUNET_PeerIdentity *next_hop;
next_hop = find_successor (key_value, current_destination,
current_dest_type);
if (*current_dest_type == MY_ID)
{
- struct GNUNET_PeerIdentity *destination_peer;
get_path = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
memcpy (get_path, &my_identity, sizeof (struct GNUNET_PeerIdentity));
get_path_length = 1;
- destination_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
- memcpy (destination_peer, source_peer, sizeof (struct
GNUNET_PeerIdentity));
- /* FIXME: We enter in this part of code only when this is our first
- call from client file. In client file we already have done datacache_get
- and if we already have the result. So, ideally code should never reach
- here. Remove it after verifying. */
- /* FIXME: Call datacache_get but remove after verified above thing. */
- GDS_NEIGHBOURS_send_get_result (&my_identity,get_path, get_path_length,
- key,destination_peer, 0,
- NULL,0,NULL);
-
+ /* FIXME: At the moment I am just passing null,0 for values which I don't
+ have. Also, handle return type. Modify this function and pass get path
+ and get path length and then in datacache_handle. here in this case
+ you can diretly call gds_client_handle_reply. */
+#if 0
+ GDS_DATACACHE_handle_get (&(get_request->key),(get_request->block_type),
+ get_path, get_path_length,get_path_length -
1,NULL);
+#endif
return;
}
- else
+ else
{
- /* Find the friend corresponding to next_hop */
+ if (*current_dest_type == FINGER)
+ {
+ memcpy (current_source, &my_identity, sizeof (struct
GNUNET_PeerIdentity));
+ }
+
target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
}
}
@@ -1852,16 +2037,16 @@
pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
pending->importance = 0; /* FIXME */
- /* FIXME: Do we have an expiration time for get request */
get_request = (struct PeerGetMessage *) &pending[1];
pending->msg = &get_request->header;
get_request->header.size = htons (msize);
get_request->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_P2P_GET);
get_request->get_path_length = htonl (get_path_length);
get_request->key = *key;
-
- memcpy (&(get_request->source_peer), source_peer, sizeof (struct
GNUNET_PeerIdentity));
memcpy (&(get_request->current_destination), current_destination, sizeof
(struct GNUNET_PeerIdentity));
+ /* FIXME: Is this comparison correct? */
+ if (current_source != NULL)
+ memcpy (&(get_request->current_source), current_source, sizeof (struct
GNUNET_PeerIdentity));
get_request->current_dest_type = htonl (*current_dest_type);
get_path = (struct GNUNET_PeerIdentity *) &get_request[1];
memcpy (get_path, get_peer_path, get_path_length * sizeof (struct
GNUNET_PeerIdentity));
@@ -1873,13 +2058,45 @@
/**
- * FIXME: In this function, you just find the target friend and send the
message
- * to next peer. In handle_dht_p2p_put, you should check the options and type
- * and check if you are final destination or not. if not then find the next
- * destination and send the message forward.
- * @param type type of the block
+ * FIXME: Here you should update the fields of struct PeerGetResultMessage.
+ * At the end of this message you should add the data and get path and send
+ * to the original requesting client. and there you should call
GDS_CLIENT_handle_reply
+ * with correct parameter.
+ * @param expiration
+ * @param key
+ * @param get_path_length
+ * @param get_path
+ * @param put_path_length
+ * @param put_path
+ * @param type
+ * @param data_size
+ * @param data
+ */
+void
+GDS_NEIGHBOURS_datacache_get (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data)
+{
+ /* Here you don't have the get path and get path length. you should call
+ some function get those values and update the message and send them. */
+}
+
+
+/**
+ * TODO: In case of put, you add the peer in the peer list in
handle_dht_p2p_put.
+ * Verify that the addition is correct and we are adding peers correctly and
incrementing
+ * the trail length correctly.
+ * Handle a put request from client file. If I am the final destination,
+ * do a put else forward the message to next peer.
+ * @param block_type type of the block
* @param options routing options
- * @param desired_replication_level desired replication count
+ * @param desired_replication_level desired replication count, 0 for current
+ * implementation of X-Vine.
* @param expiration_time when does the content expire
* @param hop_count how many hops has this message traversed so far
* @param key key for the content
@@ -1887,12 +2104,13 @@
* @param put_path peers this request has traversed so far (if tracked)
* @param data payload to store
* @param data_size number of bytes in @a data
- * @param current_destination
- * @param dest_type
- * @param target_peer_id
+ * @param current_destination intermediate destination of the packet.
+ * @param current_source source for which @a current_destination is
destination.
+ * @param dest_type type of @a current_destination.
+ * @param target_peer_id Next peer to forward the message to.
*/
void
-GDS_NEIGHBOURS_handle_put (enum GNUNET_BLOCK_Type type,
+GDS_NEIGHBOURS_handle_put (enum GNUNET_BLOCK_Type block_type,
enum GNUNET_DHT_RouteOption options,
uint32_t desired_replication_level,
struct GNUNET_TIME_Absolute expiration_time,
@@ -1902,6 +2120,7 @@
struct GNUNET_PeerIdentity *put_path,
const void *data, size_t data_size,
struct GNUNET_PeerIdentity *current_destination,
+ struct GNUNET_PeerIdentity *current_source,
enum current_destination_type dest_type,
struct GNUNET_PeerIdentity *target_peer)
{
@@ -1936,22 +2155,23 @@
So, you need to search for the next peer to send this message to. */
struct GNUNET_PeerIdentity *next_hop;
- next_hop = find_successor (key_value, current_dest, &dest_type);
-
-
+ next_hop = find_successor (key_value, current_dest, &dest_type);
if (dest_type == MY_ID)
{
- /* FIXME: How do we handle different block types? */
- /* FIXME: Here depending on the replication level choose 'r' successors
- to this peer and send put to all of these peers. */
- //replicate_put();
+ /* FIXME: Choose one place to do datacache_put. I am doing put only if
its
+ destination so I will do no put operation
+ in the client file.*/
GDS_DATACACHE_handle_put (expiration_time, key, put_path_length,
put_path,
- type, data_size, data);
+ block_type, data_size, data);
return;
}
else
{
/* Find the friend corresponding to next_hop */
+ if (dest_type == FINGER)
+ {
+ memcpy (current_source, &my_identity, sizeof (struct
GNUNET_PeerIdentity));
+ }
target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
}
}
@@ -1966,11 +2186,19 @@
ppm->header.size = htons (msize);
ppm->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_P2P_PUT);
ppm->options = htonl (options);
- ppm->type = htonl (type);
+ ppm->block_type = htonl (block_type);
ppm->hop_count = htonl (hop_count + 1);
ppm->desired_replication_level = htonl (desired_replication_level);
ppm->put_path_length = htonl (put_path_length);
ppm->expiration_time = GNUNET_TIME_absolute_hton (expiration_time);
+ /* FIXME: Here I am checking if we have a value in current_source then only
copy.
+ I am not sure if this checking is correct or not. */
+ if (current_source != NULL)
+ memcpy (&(ppm->current_source), current_source, sizeof (struct
GNUNET_PeerIdentity));
+
+ /* FIXME: here current_destination is the parameter, current_dest is what you
+ get when you call find_successor. names don't do justice to the function.
+ Please change it*/
if (current_destination != NULL)
memcpy (&(ppm->current_destination), current_destination, sizeof (struct
GNUNET_PeerIdentity));
else
@@ -1979,8 +2207,14 @@
ppm->key = *key;
pp = (struct GNUNET_PeerIdentity *) &ppm[1];
- memcpy (pp, put_path,
- sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+ /* FIXME: Is this comparison correct? Do we need this comparison. What
happens
+ in the case put_path_length is 0 and put_path is NULL, then at run time
+ memcpy will fail. And I am not sure if comparing NULL is correct or not. */
+ if (put_path_length != 0)
+ {
+ memcpy (pp, put_path,
+ sizeof (struct GNUNET_PeerIdentity) * put_path_length);
+ }
memcpy (&pp[put_path_length], data, data_size);
GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
target_friend->pending_count++;
@@ -1989,29 +2223,36 @@
/**
+ * FIXME: I am removing source peer as the first element in the trail
+ * is source identity.
+ * If I am adding myself when I am source then I don't need destination
+ * peer in get but if I am not adding then I need it. At the moment I am
removing
+ * it but will check later if its wrong.
* Send get result back to requesting client.
- * @param source_peer
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
* @param get_path
- * @param target_friend
* @param get_path_length
- * @param key
- * @param destination_peer
- * @param current_path_index
- * @param data
- * @param data_size
*/
void
-GDS_NEIGHBOURS_send_get_result (struct GNUNET_PeerIdentity *source_peer,
+GDS_NEIGHBOURS_send_get_result (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data,
struct GNUNET_PeerIdentity *get_path,
unsigned int get_path_length,
- struct GNUNET_HashCode *key,
- struct GNUNET_PeerIdentity *destination_peer,
unsigned int current_path_index,
- const void *data, size_t data_size,
struct GNUNET_PeerIdentity *next_hop)
{
- /* Add get_result into pending message and send the data to target friend.
- make a call GDS_CLIENTS_process_get_result() with all the fields. */
struct PeerGetResultMessage *get_result;
struct GNUNET_PeerIdentity *get_result_path;
struct P2PPendingMessage *pending;
@@ -2026,7 +2267,9 @@
GNUNET_break (0);
return;
}
-
+ /* GET_REULT should have all the things which we want to pass in
client_handle_reply
+ put path put path length get path get length data data_size. and rest things
+ are required to reach to the correct peer. */
pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
pending->importance = 0; /* FIXME */
/* FIXME: Should we add an expiration time like in put message. */
@@ -2034,8 +2277,6 @@
pending->msg = &get_result->header;
get_result->header.size = htons (msize);
get_result->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_P2P_GET_RESULT);
- memcpy (&(get_result->source_peer), source_peer, sizeof (struct
GNUNET_PeerIdentity));
- memcpy (&(get_result->destination_peer), destination_peer, sizeof (struct
GNUNET_PeerIdentity));
get_result->current_path_index = current_path_index;
get_result->key = *key;
@@ -2066,8 +2307,8 @@
the requesting client and send back the result. */
struct PeerGetResultMessage *get_result;
struct GNUNET_PeerIdentity *get_path;
- void *payload;
- size_t payload_size;
+ //void *payload;
+ //size_t payload_size;
size_t msize;
unsigned int getlen;
int current_path_index;
@@ -2092,10 +2333,11 @@
return GNUNET_YES;
}
+ /* FIXME: Get the put_path */
get_path = (struct GNUNET_PeerIdentity *) &get_result[1];
- payload = &get_path[getlen];
- payload_size = msize - (sizeof (struct PeerGetResultMessage) +
- getlen * sizeof (struct GNUNET_PeerIdentity));
+ //payload = &get_path[getlen];
+ /* payload_size = msize - (sizeof (struct PeerGetResultMessage) +
+ getlen * sizeof (struct GNUNET_PeerIdentity));*/
current_path_index = ntohl (get_result->current_path_index);
/* Here you just have to check if you are the destination or not if not
@@ -2120,18 +2362,19 @@
if (current_path_index != 0)
current_path_index--;
-
- GDS_NEIGHBOURS_send_get_result (&my_identity, get_path,
-
getlen,&(get_result->key),&(get_result->destination_peer),
- current_path_index,
- payload, payload_size, next_hop);
+#if 0
+ GDS_NEIGHBOURS_send_get_result ((get_result->expiration), get_result->key,
+ get_result->put_path_length, put_path,
+ get_result->type, payload, payload_size
+ get_path, getlen,current_path_index,
+ next_hop);
+#endif
return GNUNET_YES;
}
return GNUNET_SYSERR;
}
-
/**
* Core handler for p2p put requests.
*
@@ -2151,7 +2394,6 @@
enum GNUNET_DHT_RouteOption options;
enum current_destination_type current_dst_type;
struct GNUNET_PeerIdentity *current_destination;
- struct GNUNET_PeerIdentity *source_peer;
struct GNUNET_PeerIdentity *next_hop;
struct GNUNET_HashCode test_key;
uint64_t key_value;
@@ -2180,36 +2422,33 @@
payload_size = msize - (sizeof (struct PeerPutMessage) +
putlen * sizeof (struct GNUNET_PeerIdentity));
- /* FIXME: I don't understand what exactly are we doing here. */
- switch (GNUNET_BLOCK_get_key
- (GDS_block_context, ntohl (put->type), payload, payload_size,
- &test_key))
+ switch (GNUNET_BLOCK_get_key (GDS_block_context, ntohl (put->block_type),
+ payload, payload_size, &test_key))
{
- case GNUNET_YES:
- if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
- {
- char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
+ case GNUNET_YES:
+ if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
+ {
+ char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
+ GNUNET_break_op (0);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "PUT with key `%s' for block with key %s\n",
+ put_s, GNUNET_h2s_full (&test_key));
+ GNUNET_free (put_s);
+ return GNUNET_YES;
+ }
+ break;
+ case GNUNET_NO:
GNUNET_break_op (0);
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "PUT with key `%s' for block with key %s\n",
- put_s, GNUNET_h2s_full (&test_key));
- GNUNET_free (put_s);
return GNUNET_YES;
- }
- break;
- case GNUNET_NO:
- GNUNET_break_op (0);
- return GNUNET_YES;
- case GNUNET_SYSERR:
- /* cannot verify, good luck */
- break;
+ case GNUNET_SYSERR:
+ /* cannot verify, good luck */
+ break;
}
- /* FIXME: This part is also not clear to me.*/
- if (ntohl (put->type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for all tpyes
*/
+ if (ntohl (put->block_type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for all
tpyes */
{
switch (GNUNET_BLOCK_evaluate (GDS_block_context,
- ntohl (put->type),
+ ntohl (put->block_type),
NULL, /* query */
NULL, 0, /* bloom filer */
NULL, 0, /* xquery */
@@ -2243,54 +2482,73 @@
else
putlen = 0;
- /* Copy the fields of message, call find successor or gds_routing_search,
- depending on the destination_type and if you are the final destination,
- do a datache put or if option is. else call gds_neighbours_handle_get with
- correct parameters. */
current_destination = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
memcpy (current_destination, &(put->current_destination), sizeof (struct
GNUNET_PeerIdentity));
current_dst_type = ntohl (put->current_destination_type);
memcpy (&key_value, &(put->key), sizeof (uint64_t));
- source_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
- memcpy (source_peer, &(put->source_peer), sizeof (struct
GNUNET_PeerIdentity));
- if (current_dst_type == FRIEND)
- {
- next_hop = find_successor (key_value, current_destination,
¤t_dst_type);
- }
- else if (current_dst_type == FINGER)
- {
- next_hop = GDS_ROUTING_search (source_peer, current_destination, peer);
- }
+ if (current_dst_type == FRIEND)
+ {
+ next_hop = find_successor (key_value, current_destination,
¤t_dst_type);
+ }
+ else if (current_dst_type == FINGER)
+ {
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
current_destination))
+ {
+ next_hop = find_successor (key_value, current_destination,
¤t_dst_type);
+ }
+ else
+ {
+ next_hop = GDS_ROUTING_search (&(put->current_source),
current_destination, peer);
+ current_dst_type = FRIEND;
+ }
+ }
- if (current_dst_type == MY_ID)
- {
- /* Here datacache_put*/
- /* FIXME: Here depending on replication, call replicate_put() to do the
- put operation on 'r' successors. */
- GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put->expiration_time),
- &(put->key),putlen, pp, ntohl (put->type),
payload_size,
- payload);
- return GNUNET_YES;
- }
- else
- {
- /* here call gds_neighbours*/
- GDS_NEIGHBOURS_handle_put (ntohl (put->type),ntohl (put->options),
- ntohl (put->desired_replication_level),
- GNUNET_TIME_absolute_ntoh
(put->expiration_time),
- ntohl (put->hop_count),&put->key, putlen,
- pp, payload, payload_size,
- current_destination, current_dst_type,
next_hop);
- return GNUNET_YES;
- }
+ if (current_dst_type == MY_ID)
+ {
+ GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh
(put->expiration_time),
+ &(put->key),putlen, pp, ntohl (put->block_type),
+ payload_size, payload);
+ return GNUNET_YES;
+ }
+ else
+ {
+ struct GNUNET_PeerIdentity *current_source;
+ if (current_dst_type == FINGER)
+ {
+ current_source = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ memcpy (current_source, &my_identity, sizeof (struct
GNUNET_PeerIdentity));
+ }
+ else
+ current_source = NULL;
+
+ GDS_CLIENTS_process_put (options,
+ ntohl (put->block_type),
+ ntohl (put->hop_count),
+ ntohl (put->desired_replication_level),
+ putlen, pp,
+ GNUNET_TIME_absolute_ntoh (put->expiration_time),
+ &put->key,
+ payload,
+ payload_size);
+
+ GDS_NEIGHBOURS_handle_put (ntohl (put->block_type),ntohl (put->options),
+ ntohl (put->desired_replication_level),
+ GNUNET_TIME_absolute_ntoh
(put->expiration_time),
+ ntohl (put->hop_count),&put->key, putlen,
+ pp, payload, payload_size,
+ current_destination,
current_source,current_dst_type, next_hop);
+ return GNUNET_YES;
+ }
return GNUNET_SYSERR;
}
/**
- * FIXME: Handle expiration, options, block type, replication
- * referring the old code.
+ * FIXME
+ * 1. I don't do block evalute as it uses xquery and bf for evaluation.Is
+ * it okay if I just pass NULL. I am anyways going to pass NULL in case of
+ * datacache_get?
* Core handler for p2p get requests.
*
* @param cls closure
@@ -2306,9 +2564,11 @@
struct PeerGetMessage *get;
struct GNUNET_PeerIdentity *current_destination;
uint64_t key_value;
- enum current_destination_type cuurent_dest_type;
+ enum current_destination_type current_dest_type;
struct GNUNET_PeerIdentity *next_hop;
struct GNUNET_PeerIdentity *get_path;
+ enum GNUNET_BLOCK_Type block_type;
+ enum GNUNET_DHT_RouteOption options;
size_t msize;
unsigned int get_length;
@@ -2333,52 +2593,70 @@
return GNUNET_YES;
}
- get = (struct PeerGetMessage *) message;
current_destination = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
memcpy (current_destination, &(get->current_destination), sizeof (struct
GNUNET_PeerIdentity));
memcpy (&key_value, &(get->key), sizeof (uint64_t));
- cuurent_dest_type = ntohl (get->current_dest_type);
+ current_dest_type = ntohl (get->current_dest_type);
+ block_type = ntohl (get->block_type);
+ options = ntohl (get->options);
- if (cuurent_dest_type == FRIEND)
+ if (current_dest_type == FRIEND)
{
- next_hop = find_successor (key_value, current_destination,
&cuurent_dest_type);
+ next_hop = find_successor (key_value, current_destination,
¤t_dest_type);
}
- else if (cuurent_dest_type == FINGER)
+ else if (current_dest_type == FINGER)
{
- next_hop = GDS_ROUTING_search (&(get->source_peer), current_destination,
peer);
+ if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
current_destination))
+ {
+ next_hop = find_successor (key_value, current_destination,
¤t_dest_type);
+ }
+ else
+ {
+ next_hop = GDS_ROUTING_search (&(get->current_source),
current_destination, peer);
+ current_dest_type = FRIEND;
+ }
}
- if (cuurent_dest_type == MY_ID)
+ /* Add sender to get path */
+ struct GNUNET_PeerIdentity gp[get_length + 1];
+ memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
+ gp[get_length + 1] = *peer;
+ get_length = get_length + 1;
+
+ if (current_dest_type == MY_ID)
{
- struct GNUNET_PeerIdentity *destination_peer;
- //struct GNUNET_PeerIdentity *next_hop;
- //int current_path_index;
-
- /* Add yourself to the get path, increment the get length. */
- destination_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
- memcpy (destination_peer, &(get->source_peer), sizeof (struct
GNUNET_PeerIdentity));
- //current_path_index = get_length - 1;
-
- /* I am the final destination. Call GDS_NEIGHBOURS_send_get_result.
- * FIXME: Last parameters are data and data size. First implement
datacache get
- * and get the result and send the data. Also seach for the next friend to
pass
- * this message to. */
-#if 0
- /* FIXME: Here we should call GDS_CLIENT_handle_reply. */
- GDS_NEIGHBOURS_send_get_result (get->request_id, &my_identity, get_path,
- get_length,&(get->key), destination_peer,
current_path_index,
- NULL, 0, next_hop);
-#endif
+ struct GNUNET_PeerIdentity final_get_path[get_length+1];
+ memcpy (final_get_path, get_path, get_length * sizeof (struct
GNUNET_PeerIdentity));
+ memcpy (final_get_path, &my_identity, sizeof (struct GNUNET_PeerIdentity));
+ get_length = get_length + 1;
+ struct GNUNET_PeerIdentity *next_hop;
+ next_hop = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ /* FIXME: Check if we need to have a check on get length. */
+ memcpy (next_hop, &final_get_path[get_length-2], sizeof (struct
GNUNET_PeerIdentity));
+#if 0
+ GDS_DATACACHE_handle_get (&(get->key),(get->block_type),
+ final_get_path, get_length,get_length -
1,next_hop);
+#endif
return GNUNET_YES;
}
else
{
- /* FIXME: Add your self to the get path and increment the get length. */
+ struct GNUNET_PeerIdentity *current_source;
+ current_source = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ if (current_dest_type == FINGER)
+ {
+ memcpy (current_source, &my_identity, sizeof (struct
GNUNET_PeerIdentity));
+ }
+ else
+ /* FIXME: Is this correct? */
+ {
+ /* how to handle the case when we don't have any value for current
source.*/
+ }
- /* FIXME: Does it matter if the dest_type is friend or finger. */
- GDS_NEIGHBOURS_handle_get (&(get->source_peer), get_path,
+ GDS_NEIGHBOURS_handle_get (block_type, options,
get->desired_replication_level,
+ get->hop_count, gp,
get_length, &(get->key),next_hop,
- current_destination,&cuurent_dest_type);
+ current_destination,
&(get->current_source),¤t_dest_type);
return GNUNET_YES;
}
@@ -2386,6 +2664,57 @@
}
+
+/**
+ * Send tral rejection message
+ * @param source_peer Source peer which wants to set up the trail.
+ * @param finger_identity Finger identity to which it want to setup the trail.
+ * @param congested_peer Peer which has send trail rejection message
+ * @param next_hop Peer to which this message should be forwarded.
+ * @param finger_map_index
+ * @param trail_peer_list
+ * @param trail_length
+ */
+void
+GDS_NEIGHBOURS_send_trail_rejection_message(struct GNUNET_PeerIdentity
*source_peer,
+ uint64_t finger_identity,
+ struct GNUNET_PeerIdentity
*congested_peer,
+ const struct GNUNET_PeerIdentity
*next_hop,
+ unsigned int finger_map_index,
+ struct GNUNET_PeerIdentity
*trail_peer_list,
+ unsigned int trail_length)
+{
+ struct PeerTrailRejectionMessage *trail_rejection;
+ struct GNUNET_PeerIdentity *trail_list;
+ struct P2PPendingMessage *pending;
+ struct FriendInfo *target_friend;
+ size_t msize;
+
+ msize = sizeof (struct PeerTrailRejectionMessage);
+
+ pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
+ pending->importance = 0; /* FIXME */
+ pending->timeout = GNUNET_TIME_relative_to_absolute (GET_TIMEOUT);
+ trail_rejection = (struct PeerTrailRejectionMessage *) &pending[1];
+ pending->msg = &trail_rejection->header;
+ trail_rejection->header.size = htons (msize);
+ trail_rejection->header.type = htons
(GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_SETUP);
+ memcpy (&(trail_rejection->source_peer), source_peer, sizeof (struct
GNUNET_PeerIdentity));
+ memcpy (&(trail_rejection->congested_peer), congested_peer, sizeof (struct
GNUNET_PeerIdentity));
+ memcpy (&(trail_rejection->finger_identity), &finger_identity, sizeof
(uint64_t));
+ trail_rejection->finger_map_index = htonl(finger_map_index);
+ trail_rejection->trail_length = htonl (trail_length);
+
+ trail_list = (struct GNUNET_PeerIdentity *)&trail_rejection[1];
+ memcpy (trail_list, trail_peer_list, trail_length * sizeof (struct
GNUNET_PeerIdentity));
+
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
+ GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail,
pending);
+ target_friend->pending_count++;
+ process_friend_queue (target_friend);
+}
+
+
/**
* Handle a PeerTrailSetupMessage.
* @param cls closure
@@ -2436,6 +2765,20 @@
current_destination = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
memcpy (current_destination, &(trail_setup->current_destination), sizeof
(struct GNUNET_PeerIdentity));
+ /* TODO:
+ each peer maintains a list of trail fail list. there it stores an entry with
+ source, finger identity it was trying, hop which rejected. it again call
+ select_random_friend but does not consider me. and starts trail setup
+ again. */
+ if (GDS_ROUTING_size() > 1)
+ {
+ /* Setup the trail rejection message and send the message to peer. */
+ /* FIXME: you need to pass the trail, trail length and finger map index. */
+ GDS_NEIGHBOURS_send_trail_rejection_message (&(trail_setup->source_peer),
+
trail_setup->destination_finger,
+ &my_identity, peer,
finger_map_index,
+ trail_peer_list,
trail_length);
+ }
/* Find the next hop to send the packet to. */
if (current_dest_type == FRIEND)
{
@@ -2452,7 +2795,7 @@
if (0 != (GNUNET_CRYPTO_cmp_peer_identity
(&(trail_setup->current_destination),
&my_identity)))
{
- next_hop = GDS_ROUTING_search (&(trail_setup->source_peer),
+ next_hop = GDS_ROUTING_search (&(trail_setup->current_source),
&(trail_setup->current_destination),
peer);
/* As an optimization, find the successor from the find successor and
compare both the ids to find the closest peer. */
@@ -2509,37 +2852,28 @@
return GNUNET_YES;
}
- else if (next_hop == NULL)
- {
- return GNUNET_SYSERR;
- }
else
{
- target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
- if(current_dest_type == FINGER)
+ struct GNUNET_PeerIdentity *current_source;
+ current_source = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ if (current_dest_type == FINGER)
{
- /* FIXME: Here it can even return err if routing entries have crossed the
- threshold. In such a case, you should send back a trail setup fail message
- to node just before your. THen its the responsiblity of node before you
- to find an alternate path to reach to the current_desintation which
doesnot
- involve you.*/
-
- if ( GNUNET_SYSERR == GDS_ROUTING_add (&(trail_setup->source_peer),
-
&(trail_setup->current_destination),
- next_hop, peer))
- {
- //trail_setup_rejection()--> add to a list of fail trails and start
- // a new search rejecting this peer.
- }
+ memcpy (current_source, &my_identity, sizeof (struct
GNUNET_PeerIdentity));
}
-
+ else
+ current_source = NULL;
+
+ target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
+ /* FiXME: Is it correct to use null value for current source. */
GDS_NEIGHBOURS_send_trail_setup (&(trail_setup->source_peer),
trail_setup->destination_finger,
- current_destination, target_friend,
trail_length,
- peer_list, finger_map_index,
current_dest_type);
+ current_destination,current_source,
+ target_friend, trail_length, peer_list,
+ finger_map_index, current_dest_type);
return GNUNET_YES;
}
+
return GNUNET_SYSERR;
}
@@ -2592,25 +2926,11 @@
if ( 0 == (GNUNET_CRYPTO_cmp_peer_identity
(&(trail_result->destination_peer),
&my_identity)))
{
-#if 0
- /* I don't remember why I have written this code. */
- if (finger_map_index == 1)
- {
- struct GNUNET_PeerIdentity *new_trail_list;
- new_trail_list = invert_trail_list (&(trail_result->finger_identity),
- trail_peer_list, trail_length);
- finger_table_add (&(trail_result->finger_identity), new_trail_list,
trail_length,
- finger_map_index);
- return GNUNET_YES;
- }
- else
- {
-#endif
finger_table_add (&(trail_result->finger_identity), trail_peer_list,
trail_length,
finger_map_index);
return GNUNET_YES;
- //}
+
}
else
{
@@ -2625,7 +2945,13 @@
{
memcpy (next_hop, &(trail_peer_list[current_trail_index-1]),sizeof
(struct GNUNET_PeerIdentity));
}
-
+
+
+ /* If trail length = 2, it means that destination and source peer are
friends
+ Then don't add an entry. */
+ if (trail_length != 2)
+ GDS_ROUTING_add (&(trail_result->destination_peer),
&(trail_result->finger_identity),
+ peer, next_hop);
target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
next_hop);
GNUNET_free (next_hop);
@@ -2936,6 +3262,64 @@
/**
+ * FIXME: Does it matter if the packet was going to a finger or friend?
+ * Core handle for p2p trail rejection messages.
+ * @param cls closure
+ * @param message message
+ * @param peer peer identity this notification is about
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+static
+int handle_dht_p2p_trail_rejection(void *cls, const struct GNUNET_PeerIdentity
*peer,
+ const struct GNUNET_MessageHeader *message)
+{
+ struct PeerTrailRejectionMessage *trail_rejection;
+ struct FailedTrail *trail_fail;
+ struct FriendInfo *target_friend;
+ struct GNUNET_PeerIdentity *trail_peer_list;
+ unsigned int finger_map_index;
+ size_t msize;
+
+ msize = ntohs (message->size);
+ if (msize < sizeof (struct PeerTrailRejectionMessage))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_YES;
+ }
+
+ trail_rejection = (struct PeerTrailRejectionMessage *) message;
+ trail_peer_list = (struct GNUNET_PeerIdentity *)&trail_rejection[1];
+ finger_map_index = ntohl (trail_rejection->finger_map_index);
+ trail_fail = GNUNET_malloc (sizeof (struct FailedTrail));
+ memcpy (&(trail_fail->source_peer), &(trail_rejection->source_peer), sizeof
(struct GNUNET_PeerIdentity));
+ memcpy (&(trail_fail->congested_peer), &(trail_rejection->congested_peer),
sizeof (struct GNUNET_PeerIdentity));
+ memcpy (&(trail_fail->destination_finger_value),
&(trail_rejection->finger_identity), sizeof (uint64_t));
+
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_put (failed_trail_list,
&(trail_fail->source_peer),
+ trail_fail,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+
+ /* FIXME: Is it okay if I pass the struct as parameter. */
+ target_friend = select_random_friend (&(trail_fail->congested_peer));
+
+ if(NULL != target_friend)
+ {
+ /* FIXME: Here I am passing NULL for current source, is it correct?
+ also, we set the current source only if current_destination_type
+ is finger. */
+ GDS_NEIGHBOURS_send_trail_setup (&(trail_fail->source_peer),
+ trail_fail->destination_finger_value,
+ &(target_friend->id),
+ NULL, target_friend, ntohl
(trail_rejection->trail_length),
+ trail_peer_list,
+ finger_map_index, FRIEND);
+ return GNUNET_YES;
+ }
+ return GNUNET_SYSERR;
+}
+
+
+/**
* Initialize neighbours subsystem.
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
@@ -2951,6 +3335,7 @@
{&handle_dht_p2p_verify_successor,
GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR, 0},
{&handle_dht_p2p_verify_successor_result,
GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
{&handle_dht_p2p_notify_new_successor,
GNUNET_MESSAGE_TYPE_DHT_P2P_NOTIFY_NEW_SUCCESSOR, 0},
+ {&handle_dht_p2p_trail_rejection,
GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_REJECTION, 0},
{NULL, 0, 0}
};
@@ -2962,8 +3347,9 @@
return GNUNET_SYSERR;
friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
- finger_peermap = GNUNET_CONTAINER_multipeermap_create (MAX_FINGERS,
GNUNET_NO);
-
+ finger_peermap = GNUNET_CONTAINER_multipeermap_create (MAX_FINGERS,
GNUNET_NO);
+ /* FIXME: Not sure if this value is correct for this data structure. */
+ failed_trail_list = GNUNET_CONTAINER_multipeermap_create (LINK_THRESHOLD,
GNUNET_NO);
return GNUNET_OK;
}
Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.h
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.h 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.h 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -73,6 +73,7 @@
struct GNUNET_PeerIdentity *put_path,
const void *data, size_t data_size,
struct GNUNET_PeerIdentity *current_destination,
+ struct GNUNET_PeerIdentity *current_source,
enum current_destination_type dest_type,
struct GNUNET_PeerIdentity *target_peer_id);
@@ -85,36 +86,73 @@
* @param key
*/
void
-GDS_NEIGHBOURS_handle_get (struct GNUNET_PeerIdentity *source_peer,
- struct GNUNET_PeerIdentity *get_path,
+GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type block_type,
+ enum GNUNET_DHT_RouteOption options,
+ uint32_t desired_replication_level,
+ uint32_t hop_count,
+ struct GNUNET_PeerIdentity *get_peer_path,
unsigned int get_path_length,
struct GNUNET_HashCode *key,
struct GNUNET_PeerIdentity *target_peer,
struct GNUNET_PeerIdentity *current_destination,
- enum current_destination_type *type);
+ struct GNUNET_PeerIdentity *current_source,
+ enum current_destination_type *current_dest_type);
+
/**
- * Send get result back to requesting client.
- * @param source_peer
+ * FIXME: I am removing source peer as the first element in the trail
+ * is source identity.
+ * Send get result back to requesting client.
+ * @param expiration when will the reply expire
+ * @param key the query this reply is for
+ * @param get_path_length number of peers in @a get_path
+ * @param get_path path the reply took on get
+ * @param put_path_length number of peers in @a put_path
+ * @param put_path path the reply took on put
+ * @param type type of the reply
+ * @param data_size number of bytes in @a data
+ * @param data application payload data
* @param get_path
* @param get_path_length
- * @param key
- * @param destination_peer
- * @param current_path_index
- * @param data
- * @param data_size
*/
void
-GDS_NEIGHBOURS_send_get_result (struct GNUNET_PeerIdentity *source_peer,
+GDS_NEIGHBOURS_send_get_result (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data,
struct GNUNET_PeerIdentity *get_path,
unsigned int get_path_length,
- struct GNUNET_HashCode *key,
- struct GNUNET_PeerIdentity *destination_peer,
- unsigned int current_path_index,
- const void *data, size_t data_size,
- struct GNUNET_PeerIdentity *next_peer);
+ unsigned int current_trail_index,
+ struct GNUNET_PeerIdentity *next_hop);
+/**
+ * FIXME: Here you should update the fields of struct PeerGetResultMessage.
+ * At the end of this message you should add the data and get path and send
+ * to the original requesting client. and there you should call
GDS_CLIENT_handle_reply
+ * with correct parameter.
+ * @param expiration
+ * @param key
+ * @param get_path_length
+ * @param get_path
+ * @param put_path_length
+ * @param put_path
+ * @param type
+ * @param data_size
+ * @param data
+ */
+void
+GDS_NEIGHBOURS_datacache_get (struct GNUNET_TIME_Absolute expiration,
+ const struct GNUNET_HashCode *key,
+ unsigned int get_path_length,
+ const struct GNUNET_PeerIdentity *get_path,
+ unsigned int put_path_length,
+ const struct GNUNET_PeerIdentity *put_path,
+ enum GNUNET_BLOCK_Type type, size_t data_size,
+ const void *data);
+
/**
* Initialize neighbours subsystem.
*
Modified: gnunet/src/dht/gnunet-service-xdht_routing.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_routing.c 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_routing.c 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -84,8 +84,8 @@
int
GDS_ROUTING_add (struct GNUNET_PeerIdentity *source,
struct GNUNET_PeerIdentity *dest,
- struct GNUNET_PeerIdentity *next_hop,
- const struct GNUNET_PeerIdentity *prev_hop)
+ const struct GNUNET_PeerIdentity *next_hop,
+ struct GNUNET_PeerIdentity *prev_hop)
{
struct RoutingTrail *new_routing_entry;
@@ -102,6 +102,33 @@
GNUNET_CONTAINER_multipeermap_put (routing_table,
dest, new_routing_entry,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+
+ /* SUPU TEST CODE */
+ /* Here I want to see if routing table is correct or not. */
+ int test_index;
+ struct GNUNET_CONTAINER_MultiPeerMapIterator *test_iter;
+ struct GNUNET_PeerIdentity *print_peer;
+ print_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
+ struct RoutingTrail *test_trail;
+ test_iter = GNUNET_CONTAINER_multipeermap_iterator_create (routing_table);
+ for (test_index = 0; test_index < GNUNET_CONTAINER_multipeermap_size
(routing_table); test_index++)
+ {
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, entry[%d]"),__FILE__,
__func__,__LINE__,test_index);
+ if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (test_iter,
NULL,
+ (const void
**)&test_trail))
+ {
+ memcpy (print_peer, &(test_trail->source),sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, test_trail->source =%s"),__FILE__,
__func__,__LINE__,GNUNET_i2s (print_peer));
+ memcpy (print_peer, &(test_trail->destination),sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, test_trail->destination
=%s"),__FILE__, __func__,__LINE__,GNUNET_i2s(print_peer));
+ memcpy (print_peer, &(test_trail->prev_hop),sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, test_trail->prev_hop
=%s"),__FILE__, __func__,__LINE__,GNUNET_i2s(print_peer));
+ memcpy (print_peer, &(test_trail->next_hop),sizeof (struct
GNUNET_PeerIdentity));
+ FPRINTF (stderr,_("\nSUPU %s, %s, %d, test_trail->next_hop
=%s"),__FILE__, __func__,__LINE__,GNUNET_i2s(print_peer));
+
+ }
+ }
+ /* SUPU TEST CODE ENDS*/
return GNUNET_YES;
}
@@ -191,7 +218,19 @@
return;
}
+/**
+ * Check if the size of routing table has crossed threshold.
+ * @return
+ */
+int
+GDS_ROUTING_size ()
+{
+ int ret;
+ ret = (GNUNET_CONTAINER_multipeermap_size(routing_table) >
ROUTING_TABLE_THRESHOLD) ? 0:1;
+ return ret;
+}
+
/**
* Initialize routing subsystem.
*/
Modified: gnunet/src/dht/gnunet-service-xdht_routing.h
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_routing.h 2014-04-11 17:01:28 UTC
(rev 33049)
+++ gnunet/src/dht/gnunet-service-xdht_routing.h 2014-04-13 11:54:17 UTC
(rev 33050)
@@ -37,8 +37,8 @@
int
GDS_ROUTING_add (struct GNUNET_PeerIdentity *source,
struct GNUNET_PeerIdentity *destination_peer,
- struct GNUNET_PeerIdentity *next_hop,
- const struct GNUNET_PeerIdentity *prev_hop);
+ const struct GNUNET_PeerIdentity *next_hop,
+ struct GNUNET_PeerIdentity *prev_hop);
/**
@@ -77,6 +77,12 @@
const void *data, size_t data_size);
/**
+ * Check if size of routing table is greater than threshold or not.
+ */
+int
+GDS_ROUTING_size (void);
+
+/**
* Initialize routing subsystem.
*/
void
Modified: gnunet/src/include/gnunet_protocols.h
===================================================================
--- gnunet/src/include/gnunet_protocols.h 2014-04-11 17:01:28 UTC (rev
33049)
+++ gnunet/src/include/gnunet_protocols.h 2014-04-13 11:54:17 UTC (rev
33050)
@@ -634,6 +634,11 @@
* Message which contains the get result.
*/
#define GNUNET_MESSAGE_TYPE_DHT_P2P_GET_RESULT 162
+
+/**
+ * Trail Rejection Message.
+ */
+#define GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_REJECTION 163
/*******************************************************************************
* HOSTLIST message types
******************************************************************************/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33050 - in gnunet/src: dht include,
gnunet <=