GNUnet 0.21.1
regex_internal_dht.c File Reference
#include "platform.h"
#include "regex_internal_lib.h"
#include "gnunet_dht_service.h"
#include "gnunet_statistics_service.h"
#include "gnunet_constants.h"
#include "gnunet_signatures.h"
Include dependency graph for regex_internal_dht.c:

Go to the source code of this file.

Data Structures

struct  REGEX_INTERNAL_Announcement
 Handle to store cached data about a regex announce. More...
 
struct  RegexSearchContext
 Struct to keep state of running searches that have consumed a part of the initial string. More...
 
struct  Result
 Type of values in dht_get_results. More...
 
struct  REGEX_INTERNAL_Search
 Struct to keep information of searches of services described by a regex using a user-provided string service description. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "regex-dht", __VA_ARGS__)
 
#define DHT_REPLICATION   5
 DHT replication level to use. More...
 
#define DHT_TTL   GNUNET_TIME_UNIT_HOURS
 DHT record lifetime to use. More...
 
#define DHT_OPT   GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE
 DHT options to set. More...
 

Functions

static void regex_iterator (void *cls, const struct GNUNET_HashCode *key, const char *proof, int accepting, unsigned int num_edges, const struct REGEX_BLOCK_Edge *edges)
 Regex callback iterator to store own service description in the DHT. More...
 
struct REGEX_INTERNAL_AnnouncementREGEX_INTERNAL_announce (struct GNUNET_DHT_Handle *dht, const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, const char *regex, uint16_t compression, struct GNUNET_STATISTICS_Handle *stats)
 Announce a regular expression: put all states of the automaton in the DHT. More...
 
void REGEX_INTERNAL_reannounce (struct REGEX_INTERNAL_Announcement *h)
 Announce again a regular expression previously announced. More...
 
void REGEX_INTERNAL_announce_cancel (struct REGEX_INTERNAL_Announcement *h)
 Clear all cached data used by a regex announce. More...
 
static void regex_next_edge (const struct RegexBlock *block, size_t size, struct RegexSearchContext *ctx)
 Jump to the next edge, with the longest matching token. More...
 
static void dht_get_string_accept_handler (void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
 Function to process DHT string to regex matching. More...
 
static void regex_find_path (const struct GNUNET_HashCode *key, struct RegexSearchContext *ctx)
 Find a path to a peer that offers a regex service compatible with a given string. More...
 
static void dht_get_string_handler (void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
 Function to process DHT string to regex matching. More...
 
static int regex_result_iterator (void *cls, const struct GNUNET_HashCode *key, void *value)
 Iterator over found existing cadet regex blocks that match an ongoing search. More...
 
static int regex_edge_iterator (void *cls, const char *token, size_t len, const struct GNUNET_HashCode *key)
 Iterator over edges in a regex block retrieved from the DHT. More...
 
struct REGEX_INTERNAL_SearchREGEX_INTERNAL_search (struct GNUNET_DHT_Handle *dht, const char *string, REGEX_INTERNAL_Found callback, void *callback_cls, struct GNUNET_STATISTICS_Handle *stats)
 Search for a peer offering a regex matching certain string in the DHT. More...
 
static int regex_cancel_dht_get (void *cls, const struct GNUNET_HashCode *key, void *value)
 Iterator over hash map entries to cancel DHT GET requests after a successful connect_by_string. More...
 
static int regex_free_result (void *cls, const struct GNUNET_HashCode *key, void *value)
 Iterator over hash map entries to free CadetRegexBlocks stored during the search for connect_by_string. More...
 
void REGEX_INTERNAL_search_cancel (struct REGEX_INTERNAL_Search *h)
 Cancel an ongoing regex search in the DHT and free all resources. More...
 

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "regex-dht", __VA_ARGS__)

Definition at line 34 of file regex_internal_dht.c.

◆ DHT_REPLICATION

#define DHT_REPLICATION   5

DHT replication level to use.

Definition at line 39 of file regex_internal_dht.c.

◆ DHT_TTL

#define DHT_TTL   GNUNET_TIME_UNIT_HOURS

DHT record lifetime to use.

Definition at line 44 of file regex_internal_dht.c.

◆ DHT_OPT

DHT options to set.

Definition at line 49 of file regex_internal_dht.c.

Function Documentation

◆ regex_iterator()

static void regex_iterator ( void *  cls,
const struct GNUNET_HashCode key,
const char *  proof,
int  accepting,
unsigned int  num_edges,
const struct REGEX_BLOCK_Edge edges 
)
static

Regex callback iterator to store own service description in the DHT.

Parameters
clsclosure.
keyhash for current state.
proofproof for current state.
acceptingGNUNET_YES if this is an accepting state, GNUNET_NO if not.
num_edgesnumber of edges leaving current state.
edgesedges leaving current state.

Definition at line 95 of file regex_internal_dht.c.

101{
102 struct REGEX_INTERNAL_Announcement *h = cls;
103 struct RegexBlock *block;
104 size_t size;
105 unsigned int i;
106
108 "DHT PUT for state %s with proof `%s' and %u edges:\n",
109 GNUNET_h2s (key),
110 proof,
111 num_edges);
112 for (i = 0; i < num_edges; i++)
113 {
115 "Edge %u `%s' towards %s\n",
116 i,
117 edges[i].label,
118 GNUNET_h2s (&edges[i].destination));
119 }
120 if (GNUNET_YES == accepting)
121 {
122 struct RegexAcceptBlock ab;
123
125 "State %s is accepting, putting own id\n",
126 GNUNET_h2s (key));
127 size = sizeof(struct RegexAcceptBlock);
128 ab.purpose.size = ntohl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
129 + sizeof(struct GNUNET_TIME_AbsoluteNBO)
130 + sizeof(struct GNUNET_HashCode));
131 ab.purpose.purpose = ntohl (GNUNET_SIGNATURE_PURPOSE_REGEX_ACCEPT);
132 ab.expiration_time = GNUNET_TIME_absolute_hton (
134 ab.key = *key;
136 &ab.peer.public_key);
139 &ab.purpose,
140 &ab.signature));
141
142 GNUNET_STATISTICS_update (h->stats, "# regex accepting blocks stored",
143 1, GNUNET_NO);
144 GNUNET_STATISTICS_update (h->stats, "# regex accepting block bytes stored",
145 sizeof(struct RegexAcceptBlock), GNUNET_NO);
146 (void)
147 GNUNET_DHT_put (h->dht, key,
151 size,
152 &ab,
154 NULL, NULL);
155 }
156 block = REGEX_BLOCK_create (proof,
157 num_edges,
158 edges,
159 accepting,
160 &size);
161 if (NULL == block)
162 return;
163 (void) GNUNET_DHT_put (h->dht,
164 key,
166 DHT_OPT,
168 size,
169 block,
171 NULL,
172 NULL);
174 "# regex blocks stored",
175 1,
176 GNUNET_NO);
178 "# regex block bytes stored",
179 size,
180 GNUNET_NO);
181 GNUNET_free (block);
182}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
struct GNUNET_HashCode key
The key used in the DHT.
static uint64_t proof
Definition: gnunet-scrypt.c:49
#define GNUNET_CONSTANTS_DHT_MAX_EXPIRATION
How long do we cache records at most in the DHT?
void GNUNET_CRYPTO_eddsa_key_get_public(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:198
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_eddsa_sign_(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose, struct GNUNET_CRYPTO_EddsaSignature *sig)
EdDSA sign a given block.
Definition: crypto_ecc.c:607
struct GNUNET_DHT_PutHandle * GNUNET_DHT_put(struct GNUNET_DHT_Handle *handle, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, size_t size, const void *data, struct GNUNET_TIME_Absolute exp, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Perform a PUT operation storing data in the DHT.
Definition: dht_api.c:1088
@ GNUNET_DHT_RO_RECORD_ROUTE
We should keep track of the route that the message took in the P2P network.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
#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_INFO
#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.
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:316
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:638
static unsigned int size
Size of the "table".
Definition: peer.c:68
struct RegexBlock * REGEX_BLOCK_create(const char *proof, unsigned int num_edges, const struct REGEX_BLOCK_Edge *edges, int accepting, size_t *rsize)
Construct a regex block to be stored in the DHT.
#define DHT_TTL
DHT record lifetime to use.
#define DHT_REPLICATION
DHT replication level to use.
#define LOG(kind,...)
#define DHT_OPT
DHT options to set.
@ GNUNET_BLOCK_TYPE_REGEX_ACCEPT
Block to store a cadet regex accepting state.
@ GNUNET_BLOCK_TYPE_REGEX
Block to store a cadet regex state.
#define GNUNET_SIGNATURE_PURPOSE_REGEX_ACCEPT
Accept state in regex DFA.
header of what an ECC signature signs this must be followed by "size - 8" bytes of the actual signed ...
A 512-bit hashcode.
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Handle to store cached data about a regex announce.
Block to announce a peer accepting a state.
Definition: block_regex.h:51
Block to announce a regex state.
uint16_t num_edges
Number of edges parting from this state.

References DHT_OPT, DHT_REPLICATION, DHT_TTL, RegexAcceptBlock::expiration_time, GNUNET_assert, GNUNET_BLOCK_TYPE_REGEX, GNUNET_BLOCK_TYPE_REGEX_ACCEPT, GNUNET_CONSTANTS_DHT_MAX_EXPIRATION, GNUNET_CRYPTO_eddsa_key_get_public(), GNUNET_CRYPTO_eddsa_sign_(), GNUNET_DHT_put(), GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_h2s(), GNUNET_NO, GNUNET_OK, GNUNET_SIGNATURE_PURPOSE_REGEX_ACCEPT, GNUNET_STATISTICS_update(), GNUNET_TIME_absolute_hton(), GNUNET_TIME_relative_to_absolute(), GNUNET_YES, h, key, RegexAcceptBlock::key, LOG, RegexBlock::num_edges, RegexAcceptBlock::peer, proof, GNUNET_PeerIdentity::public_key, RegexAcceptBlock::purpose, GNUNET_CRYPTO_EccSignaturePurpose::purpose, REGEX_BLOCK_create(), RegexAcceptBlock::signature, GNUNET_CRYPTO_EccSignaturePurpose::size, and size.

Referenced by REGEX_INTERNAL_reannounce().

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

◆ REGEX_INTERNAL_announce()

struct REGEX_INTERNAL_Announcement * REGEX_INTERNAL_announce ( struct GNUNET_DHT_Handle dht,
const struct GNUNET_CRYPTO_EddsaPrivateKey priv,
const char *  regex,
uint16_t  compression,
struct GNUNET_STATISTICS_Handle stats 
)

Announce a regular expression: put all states of the automaton in the DHT.

Does not free resources, must call REGEX_INTERNAL_announce_cancel() for that.

Parameters
dhtAn existing and valid DHT service handle. CANNOT be NULL.
privour private key, must remain valid until the announcement is cancelled
regexRegular expression to announce.
compressionHow many characters per edge can we squeeze?
statsOptional statistics handle to report usage. Can be NULL.
Returns
Handle to reuse o free cached resources. Must be freed by calling REGEX_INTERNAL_announce_cancel().

Definition at line 198 of file regex_internal_dht.c.

203{
205
206 GNUNET_assert (NULL != dht);
208 h->regex = regex;
209 h->dht = dht;
210 h->stats = stats;
211 h->priv = priv;
212 h->dfa = REGEX_INTERNAL_construct_dfa (regex, strlen (regex), compression);
214 return h;
215}
static struct GNUNET_DHT_Handle * dht
Handle to the DHT.
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct REGEX_INTERNAL_Automaton * REGEX_INTERNAL_construct_dfa(const char *regex, const size_t len, unsigned int max_path_len)
Construct DFA for the given 'regex' of length 'len'.
void REGEX_INTERNAL_reannounce(struct REGEX_INTERNAL_Announcement *h)
Announce again a regular expression previously announced.
const struct GNUNET_CRYPTO_EddsaPrivateKey * priv
Our private key.
const char * regex
Regular expression.

References dht, GNUNET_assert, GNUNET_new, h, REGEX_INTERNAL_Announcement::priv, REGEX_INTERNAL_Announcement::regex, REGEX_INTERNAL_construct_dfa(), REGEX_INTERNAL_reannounce(), and stats.

Referenced by handle_announce(), and reannounce_regex().

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

◆ REGEX_INTERNAL_reannounce()

void REGEX_INTERNAL_reannounce ( struct REGEX_INTERNAL_Announcement h)

Announce again a regular expression previously announced.

Does use caching to speed up process.

Parameters
hHandle returned by a previous REGEX_INTERNAL_announce() call.

Definition at line 219 of file regex_internal_dht.c.

220{
221 GNUNET_assert (NULL != h->dfa); /* make sure to call announce first */
223 "REGEX_INTERNAL_reannounce: %s\n",
224 h->regex);
227 h);
228}
void REGEX_INTERNAL_iterate_reachable_edges(struct REGEX_INTERNAL_Automaton *a, REGEX_INTERNAL_KeyIterator iterator, void *iterator_cls)
Iterate over all edges of automaton 'a' that are reachable from a state with a proof of at least GNUN...
static void regex_iterator(void *cls, const struct GNUNET_HashCode *key, const char *proof, int accepting, unsigned int num_edges, const struct REGEX_BLOCK_Edge *edges)
Regex callback iterator to store own service description in the DHT.

References GNUNET_assert, GNUNET_ERROR_TYPE_INFO, h, LOG, REGEX_INTERNAL_iterate_reachable_edges(), and regex_iterator().

Referenced by reannounce(), reannounce_regex(), and REGEX_INTERNAL_announce().

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

◆ REGEX_INTERNAL_announce_cancel()

void REGEX_INTERNAL_announce_cancel ( struct REGEX_INTERNAL_Announcement h)

Clear all cached data used by a regex announce.

Does not close DHT connection.

Parameters
hHandle returned by a previous REGEX_INTERNAL_announce() call.

Definition at line 238 of file regex_internal_dht.c.

239{
241 GNUNET_free (h);
242}
void REGEX_INTERNAL_automaton_destroy(struct REGEX_INTERNAL_Automaton *a)
Free the memory allocated by constructing the REGEX_INTERNAL_Automaton.

References GNUNET_free, h, and REGEX_INTERNAL_automaton_destroy().

Referenced by client_disconnect_cb(), and shutdown_task().

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

◆ regex_next_edge()

static void regex_next_edge ( const struct RegexBlock block,
size_t  size,
struct RegexSearchContext ctx 
)
static

Jump to the next edge, with the longest matching token.

Parameters
blockBlock found in the DHT.
sizeSize of the block.
ctxContext of the search.

Definition at line 607 of file regex_internal_dht.c.

610{
611 struct RegexSearchContext *new_ctx;
612 struct REGEX_INTERNAL_Search *info = ctx->info;
613 struct GNUNET_DHT_GetHandle *get_h;
614 struct GNUNET_HashCode *hash;
615 const char *rest;
616 int result;
617
618 LOG (GNUNET_ERROR_TYPE_DEBUG, "Next edge\n");
619 /* Find the longest match for the current string position,
620 * among tokens in the given block */
621 ctx->longest_match = 0;
625
626 /* Did anything match? */
627 if (0 == ctx->longest_match)
628 {
630 "no match in block\n");
631 return;
632 }
633
634 hash = &ctx->hash;
635 new_ctx = GNUNET_new (struct RegexSearchContext);
636 new_ctx->info = info;
637 new_ctx->position = ctx->position + ctx->longest_match;
638 GNUNET_array_append (info->contexts, info->n_contexts, new_ctx);
639
640 /* Check whether we already have a DHT GET running for it */
641 if (GNUNET_YES ==
642 GNUNET_CONTAINER_multihashmap_contains (info->dht_get_handles, hash))
643 {
645 "GET for %s running, END\n",
646 GNUNET_h2s (hash));
648 hash,
650 new_ctx);
651 return; /* We are already looking for it */
652 }
653
654 GNUNET_STATISTICS_update (info->stats, "# regex nodes traversed",
655 1, GNUNET_NO);
656
658 "Following edges at %s for offset %u in `%s'\n",
659 GNUNET_h2s (hash),
660 (unsigned int) ctx->position,
661 info->description);
662 rest = &new_ctx->info->description[new_ctx->position];
663 get_h =
664 GNUNET_DHT_get_start (info->dht, /* handle */
665 GNUNET_BLOCK_TYPE_REGEX, /* type */
666 hash, /* key to search */
667 DHT_REPLICATION, /* replication level */
668 DHT_OPT,
669 rest, /* xquery */
670 strlen (rest) + 1, /* xquery bits */
671 &dht_get_string_handler, new_ctx);
672 if (GNUNET_OK !=
673 GNUNET_CONTAINER_multihashmap_put (info->dht_get_handles,
674 hash,
675 get_h,
677 {
678 GNUNET_break (0);
679 return;
680 }
681}
static struct GNUNET_FS_Handle * ctx
static int result
Global testing status.
#define info
struct GNUNET_DHT_GetHandle * GNUNET_DHT_get_start(struct GNUNET_DHT_Handle *handle, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, const void *xquery, size_t xquery_size, GNUNET_DHT_GetIterator iter, void *iter_cls)
Perform an asynchronous GET operation on the DHT identified.
Definition: dht_api.c:1162
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL).
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
int REGEX_BLOCK_iterate(const struct RegexBlock *block, size_t size, REGEX_INTERNAL_EgdeIterator iterator, void *iter_cls)
Iterate over all edges of a block of a regex state.
static int regex_edge_iterator(void *cls, const char *token, size_t len, const struct GNUNET_HashCode *key)
Iterator over edges in a regex block retrieved from the DHT.
static int regex_result_iterator(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator over found existing cadet regex blocks that match an ongoing search.
static void dht_get_string_handler(void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
Function to process DHT string to regex matching.
Handle to a GET request.
Definition: dht_api.c:79
Struct to keep information of searches of services described by a regex using a user-provided string ...
char * description
User provided description of the searched service.
Struct to keep state of running searches that have consumed a part of the initial string.
size_t position
Part of the description already consumed by this particular search branch.
struct REGEX_INTERNAL_Search * info
Information about the search.

References ctx, REGEX_INTERNAL_Search::description, dht_get_string_handler(), DHT_OPT, DHT_REPLICATION, GNUNET_array_append, GNUNET_BLOCK_TYPE_REGEX, GNUNET_break, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get_multiple(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_DHT_get_start(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_YES, info, RegexSearchContext::info, LOG, RegexSearchContext::position, REGEX_BLOCK_iterate(), regex_edge_iterator(), regex_result_iterator(), result, and size.

Referenced by dht_get_string_handler(), and regex_result_iterator().

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

◆ dht_get_string_accept_handler()

static void dht_get_string_accept_handler ( void *  cls,
struct GNUNET_TIME_Absolute  exp,
const struct GNUNET_HashCode key,
const struct GNUNET_PeerIdentity trunc_peer,
const struct GNUNET_DHT_PathElement get_path,
unsigned int  get_path_length,
const struct GNUNET_DHT_PathElement put_path,
unsigned int  put_path_length,
enum GNUNET_BLOCK_Type  type,
size_t  size,
const void *  data 
)
static

Function to process DHT string to regex matching.

Called on each result obtained for the DHT search.

Parameters
clsClosure (search context).
expWhen will this value expire.
trunc_peertruncated peer, or NULL if none was truncated
keyKey of the result.
get_pathPath of the get request.
get_path_lengthLength of get_path.
put_pathPath of the put request.
put_path_lengthLength of the put_path.
typeType of the result.
sizeNumber of bytes in data.
dataPointer to the result data.

Definition at line 379 of file regex_internal_dht.c.

388{
389 const struct RegexAcceptBlock *block = data;
390 struct RegexSearchContext *ctx = cls;
391 struct REGEX_INTERNAL_Search *info = ctx->info;
392
394 "Regex result accept for %s (key %s)\n",
395 info->description, GNUNET_h2s (key));
396
398 "# regex accepting blocks found",
399 1, GNUNET_NO);
401 "# regex accepting block bytes found",
402 size, GNUNET_NO);
403 info->callback (info->callback_cls,
404 &block->peer,
405 get_path, get_path_length,
406 put_path, put_path_length);
407}
static char * data
The data to insert into the dht.
struct GNUNET_PeerIdentity peer
Public key of the peer signing.
Definition: block_regex.h:71

References ctx, data, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_STATISTICS_update(), info, key, LOG, RegexAcceptBlock::peer, and size.

Referenced by regex_find_path().

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

◆ regex_find_path()

static void regex_find_path ( const struct GNUNET_HashCode key,
struct RegexSearchContext ctx 
)
static

Find a path to a peer that offers a regex service compatible with a given string.

Parameters
keyThe key of the accepting state.
ctxContext containing info about the string, tunnel, etc.

Definition at line 418 of file regex_internal_dht.c.

420{
421 struct GNUNET_DHT_GetHandle *get_h;
422
424 "Accept state found, now searching for paths to %s\n",
425 GNUNET_h2s (key));
426 get_h = GNUNET_DHT_get_start (ctx->info->dht, /* handle */
428 key, /* key to search */
429 DHT_REPLICATION, /* replication level */
431 NULL, /* xquery */ // FIXME BLOOMFILTER
432 0, /* xquery bits */ // FIXME BLOOMFILTER SIZE
435 GNUNET_CONTAINER_multihashmap_put (ctx->info->dht_get_handles,
436 key,
437 get_h,
439}
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
static void dht_get_string_accept_handler(void *cls, struct GNUNET_TIME_Absolute exp, const struct GNUNET_HashCode *key, const struct GNUNET_PeerIdentity *trunc_peer, const struct GNUNET_DHT_PathElement *get_path, unsigned int get_path_length, const struct GNUNET_DHT_PathElement *put_path, unsigned int put_path_length, enum GNUNET_BLOCK_Type type, size_t size, const void *data)
Function to process DHT string to regex matching.

References ctx, dht_get_string_accept_handler(), DHT_OPT, DHT_REPLICATION, GNUNET_BLOCK_TYPE_REGEX_ACCEPT, GNUNET_break, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_DHT_get_start(), GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_OK, key, and LOG.

Referenced by dht_get_string_handler(), and regex_result_iterator().

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

◆ dht_get_string_handler()

static void dht_get_string_handler ( void *  cls,
struct GNUNET_TIME_Absolute  exp,
const struct GNUNET_HashCode key,
const struct GNUNET_PeerIdentity trunc_peer,
const struct GNUNET_DHT_PathElement get_path,
unsigned int  get_path_length,
const struct GNUNET_DHT_PathElement put_path,
unsigned int  put_path_length,
enum GNUNET_BLOCK_Type  type,
size_t  size,
const void *  data 
)
static

Function to process DHT string to regex matching.

Called on each result obtained for the DHT search.

Parameters
clsclosure (search context)
expwhen will this value expire
keykey of the result
trunc_peerNULL if not truncated
get_pathpath of the get request (not used)
get_path_lengthlength of get_path (not used)
put_pathpath of the put request (not used)
put_path_lengthlength of the put_path (not used)
typetype of the result
sizenumber of bytes in data
datapointer to the result data

TODO: re-issue the request after certain time? cancel after X results?

Definition at line 461 of file regex_internal_dht.c.

470{
471 const struct RegexBlock *block = data;
472 struct RegexSearchContext *ctx = cls;
473 struct REGEX_INTERNAL_Search *info = ctx->info;
474 size_t len;
475 struct Result *copy;
476
478 "DHT GET result for %s (%s)\n",
479 GNUNET_h2s (key), ctx->info->description);
480 copy = GNUNET_malloc (sizeof(struct Result) + size);
481 copy->size = size;
482 copy->data = &copy[1];
483 GNUNET_memcpy (&copy[1], block, size);
485 GNUNET_CONTAINER_multihashmap_put (info->dht_get_results,
486 key, copy,
488 len = strlen (info->description);
489 if (len == ctx->position) // String processed
490 {
492 {
494 }
495 else
496 {
497 LOG (GNUNET_ERROR_TYPE_INFO, "block not accepting!\n");
498 /* FIXME REGEX this block not successful, wait for more? start timeout? */
499 }
500 return;
501 }
502 regex_next_edge (block, size, ctx);
503}
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_malloc(size)
Wrapper around malloc.
GNUNET_NETWORK_STRUCT_END int GNUNET_BLOCK_is_accepting(const struct RegexBlock *block, size_t size)
Test if this block is marked as being an accept state.
static void regex_find_path(const struct GNUNET_HashCode *key, struct RegexSearchContext *ctx)
Find a path to a peer that offers a regex service compatible with a given string.
static void regex_next_edge(const struct RegexBlock *block, size_t size, struct RegexSearchContext *ctx)
Jump to the next edge, with the longest matching token.
Type of values in dht_get_results.
const void * data
The raw result data.
size_t size
Number of bytes in data.

References ctx, data, Result::data, GNUNET_BLOCK_is_accepting(), GNUNET_break, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_ERROR_TYPE_INFO, GNUNET_h2s(), GNUNET_malloc, GNUNET_memcpy, GNUNET_OK, GNUNET_YES, info, key, LOG, regex_find_path(), regex_next_edge(), size, and Result::size.

Referenced by REGEX_INTERNAL_search(), and regex_next_edge().

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

◆ regex_result_iterator()

static int regex_result_iterator ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Iterator over found existing cadet regex blocks that match an ongoing search.

Parameters
clsClosure (current context)-
keyCurrent key code (key for cached block).
valueValue in the hash map (cached RegexBlock).
Returns
GNUNET_YES: we should always continue to iterate.

Definition at line 515 of file regex_internal_dht.c.

518{
519 struct Result *result = value;
520 const struct RegexBlock *block = result->data;
521 struct RegexSearchContext *ctx = cls;
522
523 if ((GNUNET_YES ==
524 GNUNET_BLOCK_is_accepting (block, result->size)) &&
525 (ctx->position == strlen (ctx->info->description)))
526 {
528 "Found accepting known block\n");
530 return GNUNET_YES; // We found an accept state!
531 }
533 "* %llu, %llu, [%u]\n",
534 (unsigned long long) ctx->position,
535 (unsigned long long) strlen (ctx->info->description),
537 result->size));
538 regex_next_edge (block, result->size, ctx);
539
540 GNUNET_STATISTICS_update (ctx->info->stats,
541 "# regex cadet blocks iterated",
542 1, GNUNET_NO);
543
544 return GNUNET_YES;
545}
static char * value
Value of the record to add/remove.

References ctx, GNUNET_BLOCK_is_accepting(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_YES, key, LOG, regex_find_path(), regex_next_edge(), result, and value.

Referenced by regex_next_edge().

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

◆ regex_edge_iterator()

static int regex_edge_iterator ( void *  cls,
const char *  token,
size_t  len,
const struct GNUNET_HashCode key 
)
static

Iterator over edges in a regex block retrieved from the DHT.

Parameters
clsClosure (context of the search).
tokenToken that follows to next state.
lenLength of token.
keyHash of next state.
Returns
GNUNET_YES if should keep iterating, GNUNET_NO otherwise.

Definition at line 558 of file regex_internal_dht.c.

562{
563 struct RegexSearchContext *ctx = cls;
564 struct REGEX_INTERNAL_Search *info = ctx->info;
565 const char *current;
566 size_t current_len;
567
568 GNUNET_STATISTICS_update (info->stats, "# regex edges iterated",
569 1, GNUNET_NO);
570 current = &info->description[ctx->position];
571 current_len = strlen (info->description) - ctx->position;
572 if (len > current_len)
573 {
574 LOG (GNUNET_ERROR_TYPE_DEBUG, "Token too long, END\n");
575 return GNUNET_YES;
576 }
577 if (0 != strncmp (current, token, len))
578 {
579 LOG (GNUNET_ERROR_TYPE_DEBUG, "Token doesn't match, END\n");
580 return GNUNET_YES;
581 }
582
583 if (len > ctx->longest_match)
584 {
585 LOG (GNUNET_ERROR_TYPE_DEBUG, "Token is longer, KEEP\n");
586 ctx->longest_match = len;
587 ctx->hash = *key;
588 }
589 else
590 {
591 LOG (GNUNET_ERROR_TYPE_DEBUG, "Token is not longer, IGNORE\n");
592 }
593
594 LOG (GNUNET_ERROR_TYPE_DEBUG, "* End of regex edge iterator\n");
595 return GNUNET_YES;
596}

References ctx, GNUNET_ERROR_TYPE_DEBUG, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_YES, info, key, and LOG.

Referenced by regex_next_edge().

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

◆ REGEX_INTERNAL_search()

struct REGEX_INTERNAL_Search * REGEX_INTERNAL_search ( struct GNUNET_DHT_Handle dht,
const char *  string,
REGEX_INTERNAL_Found  callback,
void *  callback_cls,
struct GNUNET_STATISTICS_Handle stats 
)

Search for a peer offering a regex matching certain string in the DHT.

The search runs until REGEX_INTERNAL_search_cancel() is called, even if results are returned.

Parameters
dhtAn existing and valid DHT service handle.
stringString to match against the regexes in the DHT.
callbackCallback for found peers.
callback_clsClosure for callback.
statsOptional statistics handle to report usage. Can be NULL.
Returns
Handle to stop search and free resources. Must be freed by calling REGEX_INTERNAL_search_cancel().

Definition at line 698 of file regex_internal_dht.c.

703{
704 struct REGEX_INTERNAL_Search *h;
705 struct GNUNET_DHT_GetHandle *get_h;
706 struct RegexSearchContext *ctx;
707 struct GNUNET_HashCode key;
708 size_t size;
709 size_t len;
710
711 /* Initialize handle */
712 GNUNET_assert (NULL != dht);
713 GNUNET_assert (NULL != callback);
715 h->dht = dht;
716 h->description = GNUNET_strdup (string);
717 h->callback = callback;
718 h->callback_cls = callback_cls;
719 h->stats = stats;
720 h->dht_get_handles = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
721 h->dht_get_results = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
722
723 /* Initialize context */
724 len = strlen (string);
725 size = REGEX_INTERNAL_get_first_key (string, len, &key);
727 "Initial key for `%s' is %s (based on `%.*s')\n",
728 string,
729 GNUNET_h2s (&key),
730 (int) size,
731 string);
733 ctx->position = size;
734 ctx->info = h;
735 GNUNET_array_append (h->contexts,
736 h->n_contexts,
737 ctx);
738 /* Start search in DHT */
739 get_h = GNUNET_DHT_get_start (h->dht, /* handle */
740 GNUNET_BLOCK_TYPE_REGEX, /* type */
741 &key, /* key to search */
742 DHT_REPLICATION, /* replication level */
743 DHT_OPT,
744 &h->description[size], /* xquery */
745 // FIXME add BLOOMFILTER to exclude filtered peers
746 len + 1 - size, /* xquery bits */
747 // FIXME add BLOOMFILTER SIZE
750 GNUNET_OK ==
751 GNUNET_CONTAINER_multihashmap_put (h->dht_get_handles,
752 &key,
753 get_h,
755 );
756
757 return h;
758}
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
size_t REGEX_INTERNAL_get_first_key(const char *input_string, size_t string_len, struct GNUNET_HashCode *key)
Get the first key for the given input_string.

References ctx, dht, dht_get_string_handler(), DHT_OPT, DHT_REPLICATION, GNUNET_array_append, GNUNET_assert, GNUNET_BLOCK_TYPE_REGEX, GNUNET_break, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_DHT_get_start(), GNUNET_ERROR_TYPE_INFO, GNUNET_h2s(), GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_strdup, h, key, LOG, REGEX_INTERNAL_get_first_key(), size, and stats.

Referenced by dht_connect_cb(), and handle_search().

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

◆ regex_cancel_dht_get()

static int regex_cancel_dht_get ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Iterator over hash map entries to cancel DHT GET requests after a successful connect_by_string.

Parameters
clsClosure (unused).
keyCurrent key code (unused).
valueValue in the hash map (get handle).
Returns
GNUNET_YES if we should continue to iterate, GNUNET_NO if not.

Definition at line 772 of file regex_internal_dht.c.

775{
776 struct GNUNET_DHT_GetHandle *h = value;
777
779 return GNUNET_YES;
780}
void GNUNET_DHT_get_stop(struct GNUNET_DHT_GetHandle *get_handle)
Stop async DHT-get.
Definition: dht_api.c:1235

References GNUNET_DHT_get_stop(), GNUNET_YES, h, and value.

Referenced by REGEX_INTERNAL_search_cancel().

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

◆ regex_free_result()

static int regex_free_result ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Iterator over hash map entries to free CadetRegexBlocks stored during the search for connect_by_string.

Parameters
clsClosure (unused).
keyCurrent key code (unused).
valueCadetRegexBlock in the hash map.
Returns
GNUNET_YES if we should continue to iterate, GNUNET_NO if not.

Definition at line 794 of file regex_internal_dht.c.

797{
799 return GNUNET_YES;
800}

References GNUNET_free, GNUNET_YES, and value.

Referenced by REGEX_INTERNAL_search_cancel().

Here is the caller graph for this function:

◆ REGEX_INTERNAL_search_cancel()

void REGEX_INTERNAL_search_cancel ( struct REGEX_INTERNAL_Search h)

Cancel an ongoing regex search in the DHT and free all resources.

Stop search and free all data used by a REGEX_INTERNAL_search() call.

Parameters
hthe search context.

Definition at line 809 of file regex_internal_dht.c.

810{
811 unsigned int i;
812
813 GNUNET_free (h->description);
815 &regex_cancel_dht_get, NULL);
817 &regex_free_result, NULL);
818 GNUNET_CONTAINER_multihashmap_destroy (h->dht_get_results);
819 GNUNET_CONTAINER_multihashmap_destroy (h->dht_get_handles);
820 if (0 < h->n_contexts)
821 {
822 for (i = 0; i < h->n_contexts; i++)
823 GNUNET_free (h->contexts[i]);
824 GNUNET_free (h->contexts);
825 }
826 GNUNET_free (h);
827}
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
static int regex_cancel_dht_get(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator over hash map entries to cancel DHT GET requests after a successful connect_by_string.
static int regex_free_result(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator over hash map entries to free CadetRegexBlocks stored during the search for connect_by_strin...

References GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_free, h, regex_cancel_dht_get(), and regex_free_result().

Referenced by client_disconnect_cb(), and dht_da().

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