GNUnet debian-0.24.3-24-gfea921bd2
gnunet-service-dht_neighbours.h File Reference

GNUnet DHT routing code. More...

Include dependency graph for gnunet-service-dht_neighbours.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

struct PeerInfoGDS_NEIGHBOURS_lookup_peer (const struct GNUNET_PeerIdentity *target)
 Lookup peer by peer's identity. More...
 
enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_handle_put (const struct GNUNET_DATACACHE_Block *bd, uint16_t desired_replication_level, uint16_t hop_count, struct GNUNET_CONTAINER_BloomFilter *bf)
 Perform a PUT operation. More...
 
enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type, enum GNUNET_DHT_RouteOption options, uint16_t desired_replication_level, uint16_t hop_count, const struct GNUNET_HashCode *key, const void *xquery, size_t xquery_size, struct GNUNET_BLOCK_Group *bg, struct GNUNET_CONTAINER_BloomFilter *peer_bf)
 Perform a GET operation. More...
 
bool GDS_NEIGHBOURS_handle_reply (struct PeerInfo *pi, const struct GNUNET_DATACACHE_Block *bd, const struct GNUNET_HashCode *query_hash, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *get_path)
 Handle a reply (route to origin). More...
 
enum GNUNET_GenericReturnValue GDS_am_closest_peer (const struct GNUNET_HashCode *key, const struct GNUNET_CONTAINER_BloomFilter *bloom)
 Check whether my identity is closer than any known peers. More...
 
void GDS_try_connect (void *cls, const struct GNUNET_PeerIdentity *pid, const char *uri)
 Callback function used to extract URIs from a builder. More...
 
void GDS_u_connect (void *cls, struct GNUNET_DHTU_Target *target, const struct GNUNET_PeerIdentity *pid, void **ctx)
 Function to call when we connect to a peer and can henceforth transmit to that peer. More...
 
void GDS_u_disconnect (void *ctx)
 Function to call when we disconnected from a peer and can henceforth cannot transmit to that peer anymore. More...
 
void GDS_u_receive (void *cls, void **tctx, void **sctx, const void *message, size_t message_size)
 Function to call when we receive a message. More...
 
void GDS_NEIGHBOURS_broadcast (const struct GNUNET_MessageHeader *msg)
 Send msg to all peers in our buckets. More...
 
enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_init (void)
 Initialize neighbours subsystem. More...
 
void GDS_NEIGHBOURS_done (void)
 Shutdown neighbours subsystem. More...
 
struct GNUNET_PeerIdentityGDS_NEIGHBOURS_get_id (void)
 Get the ID of the local node. More...
 

Detailed Description

GNUnet DHT routing code.

Author
Christian Grothoff
Nathan Evans

Definition in file gnunet-service-dht_neighbours.h.

Function Documentation

◆ GDS_NEIGHBOURS_lookup_peer()

struct PeerInfo * GDS_NEIGHBOURS_lookup_peer ( const struct GNUNET_PeerIdentity target)

Lookup peer by peer's identity.

Parameters
targetpeer to look up
Returns
NULL if we are not connected to target

Definition at line 1447 of file gnunet-service-dht_neighbours.c.

1448{
1450 target);
1451}
static struct GNUNET_CONTAINER_MultiPeerMap * all_connected_peers
Hash map of all CORE-connected peers, for easy removal from k_buckets on disconnect.
void * GNUNET_CONTAINER_multipeermap_get(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Given a key find a value in the map matching the key.

References all_connected_peers, and GNUNET_CONTAINER_multipeermap_get().

Referenced by process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_handle_put()

enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_handle_put ( const struct GNUNET_DATACACHE_Block bd,
uint16_t  desired_replication_level,
uint16_t  hop_count,
struct GNUNET_CONTAINER_BloomFilter bf 
)

Perform a PUT operation.

Forwards the given request to other peers. Does not store the data locally. Does not give the data to local clients. May do nothing if this is the only peer in the network (or if we are the closest peer in the network).

Parameters
bddata about the block
desired_replication_leveldesired replication level
hop_counthow many hops has this message traversed so far
bfBloom filter of peers this PUT has already traversed
Returns
GNUNET_OK if the request was forwarded, GNUNET_NO if not

Definition at line 1221 of file gnunet-service-dht_neighbours.c.

1225{
1226 unsigned int target_count;
1227 struct PeerInfo **targets;
1228 size_t msize;
1229 enum GNUNET_DHT_RouteOption ro = bd->ro;
1230 unsigned int put_path_length = bd->put_path_length;
1231 const struct GNUNET_DHT_PathElement *put_path = bd->put_path;
1232 bool truncated = (0 != (bd->ro & GNUNET_DHT_RO_TRUNCATED));
1233 const struct GNUNET_PeerIdentity *trunc_peer
1234 = truncated
1235 ? &bd->trunc_peer
1236 : NULL;
1237 struct GNUNET_PeerIdentity trunc_peer_out;
1239
1242 bd->ro, &ro,
1243 bd->expiration_time,
1244 bd->data, bd->data_size,
1245 put_path, put_path_length,
1246 &put_path_length,
1247 trunc_peer,
1248 &trunc_peer_out,
1249 &truncated);
1250 if (truncated)
1251 trunc_peer = &trunc_peer_out;
1252 /* Path may have been truncated by the call above */
1254 "Adding myself (%s) to PUT bloomfilter for %s with RO(%s/%s)\n",
1256 GNUNET_h2s (&bd->key),
1257 (bd->ro & GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE) ? "x" : "-",
1258 (bd->ro & GNUNET_DHT_RO_RECORD_ROUTE) ? "R" : "-");
1259
1260 /* if we got a HELLO, consider it for our own routing table */
1261 hello_check (bd);
1262 GNUNET_assert (NULL != bf);
1266 "# PUT requests routed",
1267 1,
1268 GNUNET_NO);
1269 if (GNUNET_OK != ret)
1270 return ret;
1271 target_count
1272 = get_target_peers (&bd->key,
1273 bf,
1274 hop_count,
1275 desired_replication_level,
1276 &targets);
1277 if (0 == target_count)
1278 {
1280 "Routing PUT for %s terminates after %u hops at %s\n",
1281 GNUNET_h2s (&bd->key),
1282 (unsigned int) hop_count,
1284 return GNUNET_NO;
1285 }
1286 for (unsigned int i = 0; i < target_count; i++)
1287 {
1288 struct PeerInfo *target = targets[i];
1289
1291 &target->phash);
1292 }
1293 for (unsigned int i = 0; i < target_count; i++)
1294 {
1295 struct PeerInfo *target = targets[i];
1296 struct PeerPutMessage *ppm;
1297 char buf[msize] GNUNET_ALIGN;
1298
1299 ppm = (struct PeerPutMessage *) buf;
1300 GDS_helper_make_put_message (ppm, msize,
1302 &target->id,
1303 &target->phash,
1304 bf,
1305 &bd->key,
1306 ro,
1307 bd->type,
1308 bd->expiration_time,
1309 bd->data, bd->data_size,
1310 put_path, put_path_length,
1311 hop_count,
1313 trunc_peer);
1315 "Routing PUT for %s after %u hops to %s\n",
1316 GNUNET_h2s (&bd->key),
1317 (unsigned int) hop_count,
1318 GNUNET_i2s (&target->id));
1319 do_send (target,
1320 &ppm->header);
1321 }
1322 GNUNET_free (targets);
1324 "# PUT messages queued for transmission",
1325 target_count,
1326 GNUNET_NO);
1327 return GNUNET_OK;
1328}
void GDS_helper_make_put_message(struct PeerPutMessage *ppm, size_t msize, const struct GNUNET_CRYPTO_EddsaPrivateKey *sk, const struct GNUNET_PeerIdentity *target, const struct GNUNET_HashCode *target_hash, const struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *block_key, enum GNUNET_DHT_RouteOption ro, enum GNUNET_BLOCK_Type block_type, struct GNUNET_TIME_Absolute block_expiration_time, const uint8_t *block_data, size_t block_data_len, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_len, size_t hop_count, uint32_t desired_replication_level, const struct GNUNET_PeerIdentity *trunc_peer)
Definition: dht_helper.c:178
enum GNUNET_GenericReturnValue GDS_helper_put_message_get_size(size_t *msize_out, const struct GNUNET_PeerIdentity *my_identity, enum GNUNET_DHT_RouteOption ro_in, enum GNUNET_DHT_RouteOption *ro_out, struct GNUNET_TIME_Absolute block_expiration_time, const uint8_t *block_data, size_t block_data_len, const struct GNUNET_DHT_PathElement *put_path_in, unsigned int put_path_len_in, unsigned int *put_path_len_out, const struct GNUNET_PeerIdentity *trunc_peer, struct GNUNET_PeerIdentity *trunc_peer_out, bool *truncated)
Definition: dht_helper.c:36
static int ret
Final status code.
Definition: gnunet-arm.c:93
struct GNUNET_PeerIdentity GDS_my_identity
Identity of this peer.
struct GNUNET_CRYPTO_EddsaPrivateKey GDS_my_private_key
Our private key.
struct GNUNET_HashCode GDS_my_identity_hash
Hash of the identity of this peer.
struct GNUNET_STATISTICS_Handle * GDS_stats
Handle for the statistics service.
static void do_send(struct PeerInfo *pi, const struct GNUNET_MessageHeader *msg)
Send msg to pi.
static unsigned int get_target_peers(const struct GNUNET_HashCode *key, struct GNUNET_CONTAINER_BloomFilter *bloom, uint16_t hop_count, uint16_t target_replication, struct PeerInfo ***targets)
Compute the set of peers that the given request should be forwarded to.
static void hello_check(const struct GNUNET_DATACACHE_Block *bd)
If we got a HELLO, consider it for our own routing table.
void GNUNET_CONTAINER_bloomfilter_add(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Add an element to the filter.
GNUNET_DHT_RouteOption
Options for routing.
@ GNUNET_DHT_RO_TRUNCATED
Flag set if the path was truncated.
@ GNUNET_DHT_RO_RECORD_ROUTE
We should keep track of the route that the message took in the P2P network.
@ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE
Each peer along the way should process the request (otherwise only peers locally closest to the key w...
#define GNUNET_log(kind,...)
#define GNUNET_ALIGN
gcc-ism to force alignment; we use this to align char-arrays that may then be cast to 'struct's.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_NO
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
const struct GNUNET_DHT_PathElement * put_path
PUT path taken by the block, array of peer identities.
enum GNUNET_BLOCK_Type type
Type of the block.
const void * data
Actual block data.
enum GNUNET_DHT_RouteOption ro
Options for routing for the block.
struct GNUNET_PeerIdentity trunc_peer
If the path was truncated, this is the peer ID at which the path was truncated.
struct GNUNET_HashCode key
Key of the block.
size_t data_size
Number of bytes in data.
unsigned int put_path_length
Length of the put_path array.
struct GNUNET_TIME_Absolute expiration_time
When does the block expire?
A (signed) path tracking a block's flow through the DHT is represented by an array of path elements,...
The identity of the host (wraps the signing key of the peer).
Entry for a peer in a bucket.
struct GNUNET_PeerIdentity id
What is the identity of the peer?
struct GNUNET_HashCode phash
Hash of id.
P2P PUT message.
Definition: dht.h:429
uint16_t desired_replication_level
Replication level for this message.
Definition: dht.h:453
uint16_t hop_count
Hop count.
Definition: dht.h:448
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_PUT.
Definition: dht.h:433
uint16_t put_path_length
Length of the PUT path that follows (if tracked).
Definition: dht.h:458

References GNUNET_DATACACHE_Block::data, GNUNET_DATACACHE_Block::data_size, PeerPutMessage::desired_replication_level, do_send(), GNUNET_DATACACHE_Block::expiration_time, GDS_helper_make_put_message(), GDS_helper_put_message_get_size(), GDS_my_identity, GDS_my_identity_hash, GDS_my_private_key, GDS_stats, get_target_peers(), GNUNET_ALIGN, GNUNET_assert, GNUNET_CONTAINER_bloomfilter_add(), GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE, GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_DHT_RO_TRUNCATED, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), PeerPutMessage::header, hello_check(), PeerPutMessage::hop_count, PeerInfo::id, GNUNET_DATACACHE_Block::key, PeerInfo::phash, GNUNET_DATACACHE_Block::put_path, GNUNET_DATACACHE_Block::put_path_length, PeerPutMessage::put_path_length, ret, GNUNET_DATACACHE_Block::ro, GNUNET_DATACACHE_Block::trunc_peer, and GNUNET_DATACACHE_Block::type.

Referenced by handle_dht_local_put(), and handle_dht_p2p_put().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_handle_get()

enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_handle_get ( enum GNUNET_BLOCK_Type  type,
enum GNUNET_DHT_RouteOption  options,
uint16_t  desired_replication_level,
uint16_t  hop_count,
const struct GNUNET_HashCode key,
const void *  xquery,
size_t  xquery_size,
struct GNUNET_BLOCK_Group bg,
struct GNUNET_CONTAINER_BloomFilter peer_bf 
)

Perform a GET operation.

Forwards the given request to other peers. Does not lookup the key locally. May do nothing if this is the only peer in the network (or if we are the closest peer in the network).

Parameters
typetype of the block
optionsrouting options
desired_replication_leveldesired replication count
hop_counthow many hops did this request traverse so far?
keykey for the content
xqueryextended query
xquery_sizenumber of bytes in xquery
bgblock group to filter replies
peer_bffilter for peers not to select (again, updated)
Returns
GNUNET_OK if the request was forwarded, GNUNET_NO if not

Definition at line 1332 of file gnunet-service-dht_neighbours.c.

1341{
1342 unsigned int target_count;
1343 struct PeerInfo **targets;
1344 size_t msize;
1345 size_t result_filter_size;
1346 void *result_filter;
1347
1348 GNUNET_assert (NULL != peer_bf);
1350 "# GET requests routed",
1351 1,
1352 GNUNET_NO);
1353 target_count = get_target_peers (key,
1354 peer_bf,
1355 hop_count,
1356 desired_replication_level,
1357 &targets);
1359 "Adding myself (%s) to GET bloomfilter for %s with RO(%s/%s)\n",
1361 GNUNET_h2s (key),
1363 (options & GNUNET_DHT_RO_RECORD_ROUTE) ? "R" : "-");
1364
1367 if (0 == target_count)
1368 {
1370 "Routing GET for %s terminates after %u hops at %s\n",
1371 GNUNET_h2s (key),
1372 (unsigned int) hop_count,
1374 return GNUNET_NO;
1375 }
1376 if (GNUNET_OK !=
1378 &result_filter,
1379 &result_filter_size))
1380 {
1381 result_filter = NULL;
1382 result_filter_size = 0;
1383 }
1384 msize = xquery_size + result_filter_size;
1385 if (msize + sizeof(struct PeerGetMessage) >= GNUNET_MAX_MESSAGE_SIZE)
1386 {
1387 GNUNET_break (0);
1388 GNUNET_free (result_filter);
1389 GNUNET_free (targets);
1390 return GNUNET_NO;
1391 }
1392 /* update BF */
1393 for (unsigned int i = 0; i < target_count; i++)
1394 {
1395 struct PeerInfo *target = targets[i];
1396
1398 &target->phash);
1399 }
1400 /* forward request */
1401 for (unsigned int i = 0; i < target_count; i++)
1402 {
1403 struct PeerInfo *target = targets[i];
1404 struct PeerGetMessage *pgm;
1405 char buf[sizeof (*pgm) + msize] GNUNET_ALIGN;
1406 char *rf;
1407
1409 "Routing GET for %s after %u hops to %s\n",
1410 GNUNET_h2s (key),
1411 (unsigned int) hop_count,
1412 GNUNET_i2s (&target->id));
1413 pgm = (struct PeerGetMessage *) buf;
1415 pgm->header.size = htons (sizeof (buf));
1416 pgm->type = htonl (type);
1417 pgm->options = htons (options);
1418 pgm->hop_count = htons (hop_count + 1);
1420 pgm->result_filter_size = htons ((uint16_t) result_filter_size);
1423 pgm->bloomfilter,
1425 pgm->key = *key;
1426 rf = (char *) &pgm[1];
1427 GNUNET_memcpy (rf,
1428 result_filter,
1431 xquery,
1432 xquery_size);
1433 do_send (target,
1434 &pgm->header);
1435 }
1437 "# GET messages queued for transmission",
1438 target_count,
1439 GNUNET_NO);
1440 GNUNET_free (targets);
1441 GNUNET_free (result_filter);
1442 return (0 < target_count) ? GNUNET_OK : GNUNET_NO;
1443}
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define DHT_BLOOM_SIZE
Size of the bloom filter the DHT uses to filter peers.
Definition: dht.h:34
struct GNUNET_HashCode key
The key used in the DHT.
static uint32_t type
Type string converted to DNS type value.
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message,...
enum GNUNET_GenericReturnValue GNUNET_BLOCK_group_serialize(struct GNUNET_BLOCK_Group *bg, void **raw_data, size_t *raw_data_size)
Serialize state of a block group.
Definition: block.c:177
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_bloomfilter_get_raw_data(const struct GNUNET_CONTAINER_BloomFilter *bf, char *data, size_t size)
Copy the raw data of this Bloom filter into the given data array.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_MESSAGE_TYPE_DHT_P2P_GET
Peer tries to find data in DHT.
uint16_t result_filter_size
Size of the result filter.
char bloomfilter[128]
Bloomfilter (for peer identities) to stop circular routes.
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_GET.
uint16_t hop_count
Hop count.
uint16_t desired_replication_level
Desired replication level for this request.
uint16_t options
Processing options.
struct GNUNET_HashCode key
The key we are looking for.
uint32_t type
Desired content type.

References PeerGetMessage::bloomfilter, PeerGetMessage::desired_replication_level, DHT_BLOOM_SIZE, do_send(), GDS_my_identity, GDS_my_identity_hash, GDS_stats, get_target_peers(), GNUNET_ALIGN, GNUNET_assert, GNUNET_BLOCK_group_serialize(), GNUNET_break, GNUNET_CONTAINER_bloomfilter_add(), GNUNET_CONTAINER_bloomfilter_get_raw_data(), GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE, GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DHT_P2P_GET, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), PeerGetMessage::header, PeerGetMessage::hop_count, PeerInfo::id, key, PeerGetMessage::key, options, PeerGetMessage::options, PeerInfo::phash, PeerGetMessage::result_filter_size, GNUNET_MessageHeader::size, type, GNUNET_MessageHeader::type, and PeerGetMessage::type.

Referenced by handle_dht_p2p_get(), send_find_peer_message(), and transmit_request().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_handle_reply()

bool GDS_NEIGHBOURS_handle_reply ( struct PeerInfo pi,
const struct GNUNET_DATACACHE_Block bd,
const struct GNUNET_HashCode query_hash,
unsigned int  get_path_length,
const struct GNUNET_DHT_PathElement get_path 
)

Handle a reply (route to origin).

Only forwards the reply back to other peers waiting for it. Does not do local caching or forwarding to local clients.

Parameters
pineighbour that should receive the block
bddetails about the reply
query_hashquery that was used for the request
get_path_lengthnumber of entries in put_path
get_pathpeers this reply has traversed so far (if tracked)
Returns
true on success

Definition at line 1455 of file gnunet-service-dht_neighbours.c.

1460{
1461 struct GNUNET_DHT_PathElement *paths;
1462 size_t msize;
1463 unsigned int ppl = bd->put_path_length;
1464 const struct GNUNET_DHT_PathElement *put_path = bd->put_path;
1465 enum GNUNET_DHT_RouteOption ro = bd->ro;
1466 bool truncated = (0 != (ro & GNUNET_DHT_RO_TRUNCATED));
1467 const struct GNUNET_PeerIdentity *trunc_peer
1468 = truncated
1469 ? &bd->trunc_peer
1470 : NULL;
1471 bool tracking = (0 != (ro & GNUNET_DHT_RO_RECORD_ROUTE));
1472#if SANITY_CHECKS > 1
1473 unsigned int failure_offset;
1474
1475 failure_offset
1477 bd->data_size,
1478 bd->expiration_time,
1479 trunc_peer,
1480 put_path,
1481 ppl,
1482 get_path,
1483 get_path_length,
1485 if (0 != failure_offset)
1486 {
1487 GNUNET_assert (failure_offset <= ppl + get_path_length);
1488 GNUNET_break_op (0);
1489 if (failure_offset < ppl)
1490 {
1491 trunc_peer = &put_path[failure_offset - 1].pred;
1492 put_path += failure_offset;
1493 ppl -= failure_offset;
1494 truncated = true;
1496 }
1497 else
1498 {
1499 failure_offset -= ppl;
1500 if (0 == failure_offset)
1501 trunc_peer = &put_path[ppl - 1].pred;
1502 else
1503 trunc_peer = &get_path[failure_offset - 1].pred;
1504 ppl = 0;
1505 put_path = NULL;
1506 truncated = true;
1508 get_path += failure_offset;
1509 get_path_length -= failure_offset;
1510 }
1511 }
1512#endif
1513 msize = bd->data_size + sizeof (struct PeerResultMessage);
1514 if (msize > GNUNET_MAX_MESSAGE_SIZE)
1515 {
1516 GNUNET_break_op (0);
1517 return false;
1518 }
1519 if (truncated)
1520 msize += sizeof (struct GNUNET_PeerIdentity);
1521 if (tracking)
1522 msize += sizeof (struct GNUNET_CRYPTO_EddsaSignature);
1523 if (msize < bd->data_size)
1524 {
1525 GNUNET_break_op (0);
1526 return false;
1527 }
1528 if ( (GNUNET_MAX_MESSAGE_SIZE - msize)
1529 / sizeof(struct GNUNET_DHT_PathElement)
1530 < (get_path_length + ppl) )
1531 {
1532 get_path_length = 0;
1533 ppl = 0;
1534 }
1535 if ( (get_path_length > UINT16_MAX) ||
1536 (ppl > UINT16_MAX) )
1537 {
1538 GNUNET_break (0);
1539 get_path_length = 0;
1540 ppl = 0;
1541 }
1542 msize += (get_path_length + ppl)
1543 * sizeof(struct GNUNET_DHT_PathElement);
1545 "Forwarding reply for key %s to peer %s\n",
1546 GNUNET_h2s (query_hash),
1547 GNUNET_i2s (&pi->id));
1549 "# RESULT messages queued for transmission",
1550 1,
1551 GNUNET_NO);
1552 {
1553 struct PeerResultMessage *prm;
1554 char buf[msize] GNUNET_ALIGN;
1555 void *data;
1556
1557 prm = (struct PeerResultMessage *) buf;
1559 prm->header.size = htons (sizeof (buf));
1560 prm->type = htonl ((uint32_t) bd->type);
1561 prm->reserved = htons (0);
1562 prm->options = htons ((uint16_t) ro);
1563 prm->put_path_length = htons ((uint16_t) ppl);
1564 prm->get_path_length = htons ((uint16_t) get_path_length);
1566 prm->key = *query_hash;
1567 if (truncated)
1568 {
1569 void *tgt = &prm[1];
1570
1571 GNUNET_memcpy (tgt,
1572 trunc_peer,
1573 sizeof (struct GNUNET_PeerIdentity));
1574 paths = (struct GNUNET_DHT_PathElement *)
1575 (tgt + sizeof (struct GNUNET_PeerIdentity));
1576 }
1577 else
1578 {
1579 paths = (struct GNUNET_DHT_PathElement *) &prm[1];
1580 }
1581 if (NULL != put_path)
1582 {
1583 GNUNET_memcpy (paths,
1584 put_path,
1585 ppl * sizeof(struct GNUNET_DHT_PathElement));
1586 }
1587 else
1588 {
1589 GNUNET_assert (0 == ppl);
1590 }
1591 if (NULL != get_path)
1592 {
1593 GNUNET_memcpy (&paths[ppl],
1594 get_path,
1595 get_path_length * sizeof(struct GNUNET_DHT_PathElement));
1596 }
1597 else
1598 {
1599 GNUNET_assert (0 == get_path_length);
1600 }
1601 if (tracking)
1602 {
1604 void *tgt = &paths[get_path_length + ppl];
1605 const struct GNUNET_PeerIdentity *pred;
1606
1607 if (ppl + get_path_length > 0)
1608 pred = &paths[ppl + get_path_length - 1].pred;
1609 else if (truncated)
1610 pred = trunc_peer;
1611 else
1612 pred = NULL; /* we are first! */
1613 /* Note that the last signature in 'paths' was not initialized before,
1614 so this is crucial to avoid sending garbage. */
1616 bd->data_size,
1618 bd->expiration_time,
1619 pred,
1620 &pi->id,
1621 &sig);
1622 memcpy (tgt,
1623 &sig,
1624 sizeof (sig));
1625 data = tgt + sizeof (sig);
1627 "Signing GET PATH %u/%u of %s => %s\n",
1628 ppl,
1629 get_path_length,
1630 GNUNET_h2s (query_hash),
1631 GNUNET_B2S (&sig));
1632#if SANITY_CHECKS > 1
1633 {
1634 struct GNUNET_DHT_PathElement xpaths[get_path_length + 1];
1635
1636 memcpy (xpaths,
1637 &paths[ppl],
1638 get_path_length * sizeof (struct GNUNET_DHT_PathElement));
1639 xpaths[get_path_length].sig = sig;
1640 xpaths[get_path_length].pred = GDS_my_identity;
1641 if (0 !=
1643 bd->data_size,
1644 bd->expiration_time,
1645 trunc_peer,
1646 paths,
1647 ppl,
1648 xpaths,
1649 get_path_length + 1,
1650 &pi->id))
1651 {
1652 GNUNET_break (0);
1653 return false;
1654 }
1655 }
1656#endif
1657 }
1658 else
1659 {
1660 data = &prm[1];
1661 }
1663 bd->data,
1664 bd->data_size);
1665 do_send (pi,
1666 &prm->header);
1667 }
1668 return true;
1669}
void GDS_helper_sign_path(const void *data, size_t data_size, const struct GNUNET_CRYPTO_EddsaPrivateKey *sk, struct GNUNET_TIME_Absolute exp_time, const struct GNUNET_PeerIdentity *pred, const struct GNUNET_PeerIdentity *succ, struct GNUNET_CRYPTO_EddsaSignature *sig)
Sign that we are routing a message from pred to succ.
Definition: dht_helper.c:151
static char * data
The data to insert into the dht.
static size_t data_size
Number of bytes in data.
unsigned int GNUNET_DHT_verify_path(const void *data, size_t data_size, struct GNUNET_TIME_Absolute exp_time, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_len, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_len, const struct GNUNET_PeerIdentity *me)
Verify signatures on a path consisting of put_path and get_path in reverse order (starting at the las...
Definition: dht_api.c:1349
#define GNUNET_B2S(obj)
Convert a fixed-sized object to a string using GNUNET_b2s().
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT
Data is returned to peer from DHT.
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:640
an ECC signature using EdDSA.
struct GNUNET_PeerIdentity pred
Previous peer on the path (matches "pred" in the signed field).
struct GNUNET_CRYPTO_EddsaSignature sig
Signature affirming the hop of type GNUNET_SIGNATURE_PURPOSE_DHT_HOP.
uint16_t get_path_length
Length of the GET path that follows (if tracked).
uint16_t options
Message options, actually an 'enum GNUNET_DHT_RouteOption' value in NBO.
struct GNUNET_HashCode key
The key of the corresponding GET request.
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT.
uint16_t put_path_length
Length of the PUT path that follows (if tracked).
struct GNUNET_TIME_AbsoluteNBO expiration_time
When does the content expire?

References data, GNUNET_DATACACHE_Block::data, data_size, GNUNET_DATACACHE_Block::data_size, do_send(), GNUNET_DATACACHE_Block::expiration_time, PeerResultMessage::expiration_time, GDS_helper_sign_path(), GDS_my_identity, GDS_my_private_key, GDS_stats, PeerResultMessage::get_path_length, GNUNET_ALIGN, GNUNET_assert, GNUNET_B2S, GNUNET_break, GNUNET_break_op, GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_DHT_RO_TRUNCATED, GNUNET_DHT_verify_path(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_TIME_absolute_hton(), PeerResultMessage::header, PeerInfo::id, PeerResultMessage::key, PeerResultMessage::options, GNUNET_DHT_PathElement::pred, GNUNET_DATACACHE_Block::put_path, GNUNET_DATACACHE_Block::put_path_length, PeerResultMessage::put_path_length, PeerResultMessage::reserved, GNUNET_DATACACHE_Block::ro, GNUNET_DHT_PathElement::sig, GNUNET_MessageHeader::size, GNUNET_DATACACHE_Block::trunc_peer, GNUNET_MessageHeader::type, GNUNET_DATACACHE_Block::type, and PeerResultMessage::type.

Referenced by handle_find_local_hello(), handle_find_my_hello(), handle_local_result(), and process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_am_closest_peer()

enum GNUNET_GenericReturnValue GDS_am_closest_peer ( const struct GNUNET_HashCode key,
const struct GNUNET_CONTAINER_BloomFilter bloom 
)

Check whether my identity is closer than any known peers.

If a non-null bloomfilter is given, check if this is the closest peer that hasn't already been routed to.

Parameters
keyhash code to check closeness to
bloombloomfilter, exclude these entries from the decision
Returns
GNUNET_YES if node location is closest, GNUNET_NO otherwise.

Definition at line 854 of file gnunet-service-dht_neighbours.c.

856{
857 int delta;
859 key))
860 return GNUNET_YES;
861 for (int bucket_num = find_bucket (key);
862 bucket_num < closest_bucket;
863 bucket_num++)
864 {
865 unsigned int count = 0;
866
867 GNUNET_assert (bucket_num >= 0);
868 for (struct PeerInfo *pos = k_buckets[bucket_num].head;
869 NULL != pos;
870 pos = pos->next)
871 {
872 if (count >= bucket_size)
873 break; /* we only consider first #bucket_size entries per bucket */
874 count++;
875 if ( (NULL != bloom) &&
876 (GNUNET_YES ==
878 &pos->phash)) )
879 continue; /* Ignore filtered peers */
880 /* All peers in this bucket must be closer than us, as
881 they mismatch with our PID on the pivotal bit. So
882 because an unfiltered peer exists, we are not the
883 closest. */
884 delta = GNUNET_CRYPTO_hash_xorcmp (&pos->phash,
886 key);
887 switch (delta)
888 {
889 case -1: /* pos closer */
890 return GNUNET_NO;
891 case 0: /* identical, impossible! */
892 GNUNET_assert (0);
893 break;
894 case 1: /* I am closer */
895 break;
896 }
897 }
898 }
899 /* No closer (unfiltered) peers found; we must be the closest! */
900 return GNUNET_YES;
901}
static int find_bucket(const struct GNUNET_HashCode *hc)
Find the optimal bucket for this key.
static unsigned int bucket_size
Maximum size for each bucket.
static unsigned int closest_bucket
The lowest currently used bucket, initially 0 (for 0-bits matching bucket).
static struct PeerBucket k_buckets[sizeof(struct GNUNET_HashCode) *8]
The buckets.
bool GNUNET_CONTAINER_bloomfilter_test(const struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Test if an element is in the filter.
int GNUNET_CRYPTO_hash_xorcmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2, const struct GNUNET_HashCode *target)
Find out which of the two GNUNET_CRYPTO_hash codes is closer to target in the XOR metric (Kademlia).
Definition: crypto_hash.c:240
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
@ GNUNET_YES
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:36

References bucket_size, closest_bucket, delta, find_bucket(), GDS_my_identity_hash, GNUNET_assert, GNUNET_CONTAINER_bloomfilter_test(), GNUNET_CRYPTO_hash_xorcmp(), GNUNET_memcmp, GNUNET_NO, GNUNET_YES, PeerBucket::head, k_buckets, key, and PeerInfo::next.

Referenced by handle_dht_local_put(), handle_dht_p2p_get(), and handle_dht_p2p_put().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_try_connect()

void GDS_try_connect ( void *  cls,
const struct GNUNET_PeerIdentity pid,
const char *  uri 
)

Callback function used to extract URIs from a builder.

Called when we should consider connecting to a peer.

Parameters
clsclosure
pidpointing to a struct GNUNET_PeerIdentity *
urione of the URIs

Called when we should consider connecting to a peer.

Parameters
clsclosure pointing to a struct GNUNET_PeerIdentity *
urione of the URIs

Definition at line 2656 of file gnunet-service-dht_neighbours.c.

2659{
2660 struct GNUNET_HashCode phash;
2661 int peer_bucket;
2662 struct PeerBucket *bucket;
2663 (void) cls;
2664
2665 if (0 == GNUNET_memcmp (&GDS_my_identity,
2666 pid))
2667 {
2669 "Got a HELLO for my own PID, ignoring it\n");
2670 return; /* that's us! */
2671 }
2673 sizeof(*pid),
2674 &phash);
2675 peer_bucket = find_bucket (&phash);
2676 GNUNET_assert ( (peer_bucket >= 0) &&
2677 ((unsigned int) peer_bucket < MAX_BUCKETS));
2678 bucket = &k_buckets[peer_bucket];
2679 for (struct PeerInfo *pi = bucket->head;
2680 NULL != pi;
2681 pi = pi->next)
2682 if (0 ==
2683 GNUNET_memcmp (&pi->id,
2684 pid))
2685 {
2686 /* already connected */
2688 uri);
2689 return;
2690 }
2691 if (bucket->peers_size >= bucket_size)
2692 return; /* do not care */
2694 "Discovered peer %s at %s suitable for bucket %d (%u/%u), trying to connect\n",
2695 GNUNET_i2s (pid),
2696 uri,
2697 peer_bucket,
2698 bucket->peers_size,
2699 bucket_size);
2700 /* new peer that we like! */
2702 uri);
2703}
static struct GNUNET_FS_Uri * uri
Value of URI provided on command-line (when not publishing a file but just creating UBlocks to refer ...
void GDS_u_try_connect(const struct GNUNET_PeerIdentity *pid, const char *address)
Ask all underlays to connect to peer pid at address.
#define MAX_BUCKETS
How many buckets will we allow in total.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
@ GNUNET_ERROR_TYPE_INFO
A 512-bit hashcode.
Peers are grouped into buckets.
struct PeerInfo * head
Head of DLL.
unsigned int peers_size
Number of peers in the bucket.
struct PeerInfo * next
Next peer entry (DLL)

References bucket_size, find_bucket(), GDS_my_identity, GDS_u_try_connect(), GNUNET_assert, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_memcmp, PeerBucket::head, k_buckets, MAX_BUCKETS, PeerInfo::next, PeerBucket::peers_size, pid, and uri.

Referenced by handle_dht_local_hello_offer(), and hello_check().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_u_connect()

void GDS_u_connect ( void *  cls,
struct GNUNET_DHTU_Target target,
const struct GNUNET_PeerIdentity pid,
void **  ctx 
)

Function to call when we connect to a peer and can henceforth transmit to that peer.

Parameters
clsthe closure, must be a struct GDS_Underlay
targethandle to the target, pointer will remain valid until disconnect_cb is called
pidpeer identity, pointer will remain valid until disconnect_cb is called
[out]ctxstorage space for DHT to use in association with this target

Definition at line 644 of file gnunet-service-dht_neighbours.c.

648{
649 struct GDS_Underlay *u = cls;
650 struct PeerInfo *pi;
651 struct PeerBucket *bucket;
652 bool do_hold = false;
653
654 /* Check for connect to self message */
656 pid))
657 return;
659 "Connected to peer %s\n",
660 GNUNET_i2s (pid));
662 pid);
663 if (NULL == pi)
664 {
666 "# peers connected",
667 1,
668 GNUNET_NO);
669 pi = GNUNET_new (struct PeerInfo);
670 pi->id = *pid;
672 sizeof(*pid),
673 &pi->phash);
674 pi->peer_bucket = find_bucket (&pi->phash);
675 GNUNET_assert ( (pi->peer_bucket >= 0) &&
676 ((unsigned int) pi->peer_bucket < MAX_BUCKETS));
677 bucket = &k_buckets[pi->peer_bucket];
679 bucket->tail,
680 pi);
681 bucket->peers_size++;
683 (unsigned int) pi->peer_bucket + 1);
686 &pi->id,
687 pi,
689 if (bucket->peers_size <= bucket_size)
690 {
692 do_hold = true;
693 }
696 {
697 /* got a first connection, good time to start with FIND PEER requests... */
700 NULL);
701 }
702 }
703 {
704 struct Target *t;
705
706 t = GNUNET_new (struct Target);
707 t->u = u;
708 t->utarget = target;
709 t->pi = pi;
711 pi->t_tail,
712 t);
713 *ctx = t;
714
715 }
716 if (do_hold)
717 update_hold (bucket);
718}
static mp_limb_t u[(((256)+GMP_NUMB_BITS - 1)/GMP_NUMB_BITS)]
static struct GNUNET_FS_Handle * ctx
static void send_find_peer_message(void *cls)
Task to send a find peer message for our own peer identifier so that we can find the closest peers in...
static int disable_try_connect
Option for testing that disables the 'connect' function of the DHT.
static unsigned int newly_found_peers
How many peers have we added since we sent out our last find peer request?
static struct GNUNET_SCHEDULER_Task * find_peer_task
Task that sends FIND PEER requests.
static void update_hold(struct PeerBucket *bucket)
The list of the first bucket_size peers of bucket changed.
static struct GNUNET_SCHEDULER_Task * t
Main task.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
#define GNUNET_MAX(a, b)
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1304
Information we keep per underlay.
struct PeerInfo * tail
Tail of DLL.
struct Target * t_tail
Tail of DLL of targets for this peer.
int peer_bucket
Which bucket is this peer in?
struct Target * t_head
Head of DLL of targets for this peer.
List of targets that we can use to reach this peer.
struct PeerInfo * pi
Peer this is a target for.

References all_connected_peers, bucket_size, closest_bucket, ctx, disable_try_connect, find_bucket(), find_peer_task, GDS_my_identity, GDS_stats, GNUNET_assert, GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CONTAINER_multipeermap_get(), GNUNET_CONTAINER_multipeermap_put(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MAX, GNUNET_memcmp, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_STATISTICS_update(), GNUNET_YES, PeerBucket::head, PeerInfo::id, k_buckets, MAX_BUCKETS, newly_found_peers, PeerInfo::peer_bucket, PeerBucket::peers_size, PeerInfo::phash, Target::pi, pid, send_find_peer_message(), t, PeerInfo::t_head, PeerInfo::t_tail, PeerBucket::tail, u, and update_hold().

Referenced by load_underlay().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_u_disconnect()

void GDS_u_disconnect ( void *  ctx)

Function to call when we disconnected from a peer and can henceforth cannot transmit to that peer anymore.

Parameters
[in]ctxstorage space used by the DHT in association with this target

Definition at line 722 of file gnunet-service-dht_neighbours.c.

723{
724 struct Target *t = ctx;
725 struct PeerInfo *pi;
726 struct PeerBucket *bucket;
727 bool was_held = false;
728
729 /* Check for disconnect from self message (on shutdown) */
730 if (NULL == t)
731 return;
732 pi = t->pi;
734 pi->t_tail,
735 t);
736 if (NULL != t->ph)
737 {
738 GDS_u_drop (t->u,
739 t->ph);
740 t->ph = NULL;
741 was_held = true;
742 }
743 if (t->load > 0)
744 {
745 t->dropped = true;
746 t->pi = NULL;
747 }
748 else
749 {
750 GNUNET_free (t);
751 }
752 if (NULL != pi->t_head)
753 return; /* got other connections still */
755 "Disconnected from peer %s\n",
756 GNUNET_i2s (&pi->id));
758 "# peers connected",
759 -1,
760 GNUNET_NO);
763 &pi->id,
764 pi));
767 {
769 find_peer_task = NULL;
770 }
771 GNUNET_assert (pi->peer_bucket >= 0);
772 bucket = &k_buckets[pi->peer_bucket];
774 bucket->tail,
775 pi);
776 GNUNET_assert (bucket->peers_size > 0);
777 bucket->peers_size--;
778 if ( (was_held) &&
779 (bucket->peers_size >= bucket_size - 1) )
780 update_hold (bucket);
781 while ( (closest_bucket > 0) &&
784 GNUNET_free (pi->hello);
785 GNUNET_free (pi);
786}
void GDS_u_drop(struct GDS_Underlay *u, struct GNUNET_DHTU_PreferenceHandle *ph)
Drop a hold ph from underlay u.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multipeermap_remove(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, const void *value)
Remove the given key-value pair from the map.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
void * hello
Block with a HELLO of this peer.

References all_connected_peers, bucket_size, closest_bucket, ctx, disable_try_connect, find_peer_task, GDS_stats, GDS_u_drop(), GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multipeermap_remove(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_update(), GNUNET_YES, PeerBucket::head, PeerInfo::hello, PeerInfo::id, k_buckets, PeerInfo::peer_bucket, PeerBucket::peers_size, t, PeerInfo::t_head, PeerInfo::t_tail, PeerBucket::tail, and update_hold().

Referenced by load_underlay().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_u_receive()

void GDS_u_receive ( void *  cls,
void **  tctx,
void **  sctx,
const void *  message,
size_t  message_size 
)

Function to call when we receive a message.

Parameters
clsthe closure
[in,out]tctxctx of target address where we received the message from
[in,out]sctxctx of our own source address at which we received the message
messagethe message we received
message_sizenumber of bytes in message

Definition at line 2587 of file gnunet-service-dht_neighbours.c.

2592{
2593 struct Target *t = *tctx;
2594 struct GNUNET_MQ_MessageHandler core_handlers[] = {
2595 GNUNET_MQ_hd_var_size (dht_p2p_get,
2597 struct PeerGetMessage,
2598 t),
2599 GNUNET_MQ_hd_var_size (dht_p2p_put,
2601 struct PeerPutMessage,
2602 t),
2603 GNUNET_MQ_hd_var_size (dht_p2p_result,
2605 struct PeerResultMessage,
2606 t),
2607 GNUNET_MQ_hd_var_size (dht_p2p_hello,
2609 struct GNUNET_MessageHeader,
2610 t),
2612 };
2613 const struct GNUNET_MessageHeader *mh = message;
2614
2615 (void) cls; /* the 'struct GDS_Underlay' */
2616 (void) sctx; /* our receiver address */
2617 if (NULL == t)
2618 {
2619 /* Received message claiming to originate from myself?
2620 Ignore! */
2621 GNUNET_break_op (0);
2622 return;
2623 }
2624 if (message_size < sizeof (*mh))
2625 {
2626 GNUNET_break_op (0);
2627 return;
2628 }
2629 if (message_size != ntohs (mh->size))
2630 {
2631 GNUNET_break_op (0);
2632 return;
2633 }
2635 "Handling message of type %u from peer %s\n",
2636 ntohs (mh->type),
2637 GNUNET_i2s (&t->pi->id));
2638 if (GNUNET_OK !=
2639 GNUNET_MQ_handle_message (core_handlers,
2640 mh))
2641 {
2642 GNUNET_break_op (0);
2643 return;
2644 }
2645}
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
enum GNUNET_GenericReturnValue GNUNET_MQ_handle_message(const struct GNUNET_MQ_MessageHandler *handlers, const struct GNUNET_MessageHeader *mh)
Call the message message handler that was registered for the type of the given message in the given h...
Definition: mq.c:205
#define GNUNET_MESSAGE_TYPE_DHT_P2P_HELLO
HELLO advertising a neighbours addresses.
#define GNUNET_MESSAGE_TYPE_DHT_P2P_PUT
Peer is storing data in DHT.
Message handler for a specific message type.
Header for all communications.

References GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_DHT_P2P_GET, GNUNET_MESSAGE_TYPE_DHT_P2P_HELLO, GNUNET_MESSAGE_TYPE_DHT_P2P_PUT, GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT, GNUNET_MQ_handle_message(), GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_OK, mh, and t.

Referenced by load_underlay().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_broadcast()

void GDS_NEIGHBOURS_broadcast ( const struct GNUNET_MessageHeader msg)

Send msg to all peers in our buckets.

Parameters
msgmessage to broadcast

Definition at line 2712 of file gnunet-service-dht_neighbours.c.

2713{
2714 for (unsigned int bc = 0; bc<closest_bucket; bc++)
2715 {
2716 struct PeerBucket *bucket = &k_buckets[bc];
2717 unsigned int count = 0;
2718
2719 for (struct PeerInfo *pos = bucket->head;
2720 NULL != pos;
2721 pos = pos->next)
2722 {
2723 if (count >= bucket_size)
2724 break; /* we only consider first #bucket_size entries per bucket */
2725 count++;
2726 do_send (pos,
2727 msg);
2728 }
2729 }
2730}
struct GNUNET_MessageHeader * msg
Definition: 005.c:2

References bucket_size, closest_bucket, do_send(), PeerBucket::head, k_buckets, msg, and PeerInfo::next.

Referenced by pid_change_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_init()

enum GNUNET_GenericReturnValue GDS_NEIGHBOURS_init ( void  )

Initialize neighbours subsystem.

Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 2734 of file gnunet-service-dht_neighbours.c.

2735{
2736
2737 unsigned long long temp_config_num;
2738
2741 "DHT",
2742 "DISABLE_TRY_CONNECT");
2743 if (GNUNET_OK ==
2745 "DHT",
2746 "bucket_size",
2747 &temp_config_num))
2748 bucket_size = (unsigned int) temp_config_num;
2751 "DHT",
2752 "CACHE_RESULTS");
2754 GNUNET_YES);
2755 return GNUNET_OK;
2756}
const struct GNUNET_CONFIGURATION_Handle * GDS_cfg
Configuration we use.
static int cache_results
Do we cache all results that we are routing in the local datacache?
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Get a configuration value that should be in a set of "YES" or "NO".
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).

References all_connected_peers, bucket_size, cache_results, disable_try_connect, GDS_cfg, GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_yesno(), GNUNET_CONTAINER_multipeermap_create(), GNUNET_OK, and GNUNET_YES.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_done()

void GDS_NEIGHBOURS_done ( void  )

Shutdown neighbours subsystem.

Definition at line 2760 of file gnunet-service-dht_neighbours.c.

2761{
2762 if (NULL == all_connected_peers)
2763 return;
2764 GNUNET_assert (0 ==
2767 all_connected_peers = NULL;
2768 GNUNET_assert (NULL == find_peer_task);
2769}
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.

References all_connected_peers, find_peer_task, GNUNET_assert, GNUNET_CONTAINER_multipeermap_destroy(), and GNUNET_CONTAINER_multipeermap_size().

Referenced by shutdown_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_NEIGHBOURS_get_id()

struct GNUNET_PeerIdentity * GDS_NEIGHBOURS_get_id ( void  )

Get the ID of the local node.

Returns
identity of the local node

Definition at line 2773 of file gnunet-service-dht_neighbours.c.

2774{
2775 return &GDS_my_identity;
2776}

References GDS_my_identity.