diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-12-16 16:14:09 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-12-16 16:14:09 +0000 |
commit | aa35fc15e22f972072d9e091b01e3a3c70e598f0 (patch) | |
tree | e089fbc23eaf185400193af8d1529b22b1570429 | |
parent | 11f1a50939e73ce6fd193518f17bbc99ee430264 (diff) | |
download | gnunet-aa35fc15e22f972072d9e091b01e3a3c70e598f0.tar.gz gnunet-aa35fc15e22f972072d9e091b01e3a3c70e598f0.zip |
- finished work on multipart sending in intersection
- added getter for addressesPerElement from a bloomfilter
- added multipart message format for intersection
- added multipart message type for intersection
-rw-r--r-- | src/include/gnunet_container_lib.h | 9 | ||||
-rw-r--r-- | src/include/gnunet_protocols.h | 5 | ||||
-rw-r--r-- | src/set/gnunet-service-set_intersection.c | 93 | ||||
-rw-r--r-- | src/set/set_protocol.h | 27 | ||||
-rw-r--r-- | src/util/container_bloomfilter.c | 15 |
5 files changed, 101 insertions, 48 deletions
diff --git a/src/include/gnunet_container_lib.h b/src/include/gnunet_container_lib.h index 6e782871a..03e3b4279 100644 --- a/src/include/gnunet_container_lib.h +++ b/src/include/gnunet_container_lib.h | |||
@@ -186,6 +186,15 @@ GNUNET_CONTAINER_bloomfilter_free (struct GNUNET_CONTAINER_BloomFilter *bf); | |||
186 | 186 | ||
187 | 187 | ||
188 | /** | 188 | /** |
189 | * Get the number of the addresses set per element in the bloom filter. | ||
190 | * | ||
191 | * @param bf the filter | ||
192 | * @return addresses set per element in the bf | ||
193 | */ | ||
194 | size_t | ||
195 | GNUNET_CONTAINER_bloomfilter_get_element_addresses (const struct GNUNET_CONTAINER_BloomFilter *bf); | ||
196 | |||
197 | /** | ||
189 | * @ingroup bloomfilter | 198 | * @ingroup bloomfilter |
190 | * Get size of the bloom filter. | 199 | * Get size of the bloom filter. |
191 | * | 200 | * |
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index ea150c52f..9d458ca1c 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h | |||
@@ -1839,6 +1839,11 @@ extern "C" | |||
1839 | */ | 1839 | */ |
1840 | #define GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF 592 | 1840 | #define GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF 592 |
1841 | 1841 | ||
1842 | /** | ||
1843 | * Bloom filter message for intersection exchange started by Bob. | ||
1844 | */ | ||
1845 | #define GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF_PART 593 | ||
1846 | |||
1842 | /******************************************************************************* | 1847 | /******************************************************************************* |
1843 | * TESTBED LOGGER message types | 1848 | * TESTBED LOGGER message types |
1844 | ******************************************************************************/ | 1849 | ******************************************************************************/ |
diff --git a/src/set/gnunet-service-set_intersection.c b/src/set/gnunet-service-set_intersection.c index 11527b04f..0e2ac4863 100644 --- a/src/set/gnunet-service-set_intersection.c +++ b/src/set/gnunet-service-set_intersection.c | |||
@@ -90,10 +90,10 @@ struct OperationState | |||
90 | char * local_bf_data; | 90 | char * local_bf_data; |
91 | 91 | ||
92 | /** | 92 | /** |
93 | * for multipart msgs we have to store the bloomfilter-data until we fully sent it. | 93 | * size of the bloomfilter |
94 | */ | 94 | */ |
95 | uint32_t local_bf_data_size; | 95 | uint32_t local_bf_data_size; |
96 | 96 | ||
97 | /** | 97 | /** |
98 | * Current state of the operation. | 98 | * Current state of the operation. |
99 | */ | 99 | */ |
@@ -360,31 +360,26 @@ static void | |||
360 | send_bloomfilter_multipart (struct Operation *op, uint32_t offset) | 360 | send_bloomfilter_multipart (struct Operation *op, uint32_t offset) |
361 | { | 361 | { |
362 | struct GNUNET_MQ_Envelope *ev; | 362 | struct GNUNET_MQ_Envelope *ev; |
363 | struct BFMessage *msg; | 363 | struct BFPart *msg; |
364 | uint32_t chunk_size = (GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof(struct BFMessage)); | 364 | uint32_t chunk_size = (GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof(struct BFPart)); |
365 | uint32_t todo_size = op->state->local_bf_data_size - offset; | 365 | uint32_t todo_size = op->state->local_bf_data_size - offset; |
366 | 366 | ||
367 | if (todo_size < chunk_size) | 367 | if (todo_size < chunk_size) |
368 | // we probably need many chunks, thus we assume a maximum packet size by default | ||
369 | chunk_size = todo_size; | 368 | chunk_size = todo_size; |
370 | 369 | ||
371 | ev = GNUNET_MQ_msg_extra (msg, chunk_size, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF); | 370 | ev = GNUNET_MQ_msg_extra (msg, chunk_size, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF_PART); |
372 | 371 | ||
373 | msg->reserved = 0; | ||
374 | msg->bloomfilter_total_length = htonl (op->state->local_bf_data_size); | ||
375 | msg->bloomfilter_length = htonl (chunk_size); | 372 | msg->bloomfilter_length = htonl (chunk_size); |
376 | msg->bloomfilter_offset = htonl (offset); | 373 | msg->bloomfilter_offset = htonl (offset); |
377 | memcpy(&msg[1], op->state->local_bf, chunk_size); | 374 | memcpy(&msg[1], &op->state->local_bf_data[offset], chunk_size); |
378 | 375 | ||
379 | GNUNET_MQ_send (op->mq, ev); | 376 | GNUNET_MQ_send (op->mq, ev); |
380 | 377 | ||
381 | if (op->state->local_bf_data_size == offset + chunk_size) | 378 | if (op->state->local_bf_data_size == offset + chunk_size) |
382 | { | 379 | { |
383 | // done | 380 | // done |
384 | GNUNET_CONTAINER_bloomfilter_free (op->state->local_bf); | ||
385 | GNUNET_free(op->state->local_bf_data); | 381 | GNUNET_free(op->state->local_bf_data); |
386 | op->state->local_bf_data = NULL; | 382 | op->state->local_bf_data = NULL; |
387 | op->state->local_bf = NULL; | ||
388 | return; | 383 | return; |
389 | } | 384 | } |
390 | 385 | ||
@@ -405,36 +400,60 @@ send_bloomfilter (struct Operation *op) | |||
405 | struct GNUNET_MQ_Envelope *ev; | 400 | struct GNUNET_MQ_Envelope *ev; |
406 | struct BFMessage *msg; | 401 | struct BFMessage *msg; |
407 | uint32_t bf_size; | 402 | uint32_t bf_size; |
403 | uint32_t bf_elementbits; | ||
404 | uint32_t chunk_size; | ||
405 | struct GNUNET_CONTAINER_BloomFilter * local_bf; | ||
408 | 406 | ||
409 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "sending bf of size %u\n"); | 407 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "sending bf of size %u\n"); |
408 | |||
409 | CALCULATE_BF_SIZE(op->state->my_element_count, | ||
410 | op->spec->remote_element_count, | ||
411 | bf_size, | ||
412 | bf_elementbits); | ||
410 | 413 | ||
411 | // send our bloomfilter | 414 | local_bf = GNUNET_CONTAINER_bloomfilter_init (NULL, |
412 | bf_size = GNUNET_CONTAINER_bloomfilter_get_size (op->state->local_bf); | 415 | bf_size, |
413 | if ( GNUNET_SERVER_MAX_MESSAGE_SIZE <= bf_size + sizeof(struct BFMessage)) | 416 | bf_elementbits); |
414 | { | ||
415 | // singlepart | ||
416 | ev = GNUNET_MQ_msg_extra (msg, bf_size, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF); | ||
417 | |||
418 | GNUNET_CONTAINER_bloomfilter_free (op->state->local_bf); | ||
419 | op->state->local_bf = NULL; | ||
420 | 417 | ||
421 | msg->reserved = 0; | 418 | op->spec->salt++; |
422 | msg->sender_element_count = htonl (op->state->my_element_count); | 419 | GNUNET_CONTAINER_multihashmap_iterate (op->spec->set->elements, |
423 | msg->bloomfilter_length = htonl (bf_size); | 420 | &iterator_bf_create, |
424 | msg->bloomfilter_offset = htonl (0); | 421 | op); |
425 | msg->sender_mutator = htonl (op->spec->salt); | ||
426 | 422 | ||
427 | GNUNET_MQ_send (op->mq, ev); | 423 | // send our bloomfilter |
424 | if (GNUNET_SERVER_MAX_MESSAGE_SIZE <= bf_size + sizeof (struct BFMessage)) { | ||
425 | // singlepart | ||
426 | chunk_size = bf_size; | ||
427 | ev = GNUNET_MQ_msg_extra (msg, chunk_size, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF); | ||
428 | GNUNET_assert (GNUNET_SYSERR != | ||
429 | GNUNET_CONTAINER_bloomfilter_get_raw_data (local_bf, | ||
430 | &msg[1], | ||
431 | bf_size)); | ||
428 | } | 432 | } |
429 | else { | 433 | else { |
430 | //multipart | 434 | //multipart |
431 | op->state->local_bf_data = (char *)GNUNET_malloc(bf_size); | 435 | chunk_size = GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - sizeof (struct BFMessage); |
436 | ev = GNUNET_MQ_msg_extra (msg, chunk_size, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF); | ||
437 | op->state->local_bf_data = (char *) GNUNET_malloc (bf_size); | ||
432 | GNUNET_assert (GNUNET_SYSERR != | 438 | GNUNET_assert (GNUNET_SYSERR != |
433 | GNUNET_CONTAINER_bloomfilter_get_raw_data (op->state->local_bf, | 439 | GNUNET_CONTAINER_bloomfilter_get_raw_data (local_bf, |
434 | op->state->local_bf_data, | 440 | op->state->local_bf_data, |
435 | bf_size)); | 441 | bf_size)); |
442 | memcpy (&msg[1], op->state->local_bf_data, chunk_size); | ||
436 | op->state->local_bf_data_size = bf_size; | 443 | op->state->local_bf_data_size = bf_size; |
437 | send_bloomfilter_multipart (op, 0); | 444 | } |
445 | GNUNET_CONTAINER_bloomfilter_free (local_bf); | ||
446 | |||
447 | msg->sender_element_count = htonl (op->state->my_element_count); | ||
448 | msg->bloomfilter_total_length = htonl (bf_size); | ||
449 | msg->bloomfilter_length = htonl (chunk_size); | ||
450 | msg->bits_per_element = htonl (bf_elementbits); | ||
451 | msg->sender_mutator = htonl (op->spec->salt); | ||
452 | |||
453 | GNUNET_MQ_send (op->mq, ev); | ||
454 | |||
455 | if (op->state->local_bf_data) { | ||
456 | send_bloomfilter_multipart (op, chunk_size); | ||
438 | } | 457 | } |
439 | } | 458 | } |
440 | 459 | ||
@@ -601,8 +620,6 @@ handle_p2p_element_info (void *cls, const struct GNUNET_MessageHeader *mh) | |||
601 | { | 620 | { |
602 | struct Operation *op = cls; | 621 | struct Operation *op = cls; |
603 | struct BFMessage *msg = (struct BFMessage *) mh; | 622 | struct BFMessage *msg = (struct BFMessage *) mh; |
604 | uint32_t bf_size; | ||
605 | uint32_t bits_per_element; | ||
606 | 623 | ||
607 | op->spec->remote_element_count = ntohl(msg->sender_element_count); | 624 | op->spec->remote_element_count = ntohl(msg->sender_element_count); |
608 | if ((op->state->phase != PHASE_INITIAL) | 625 | if ((op->state->phase != PHASE_INITIAL) |
@@ -617,15 +634,6 @@ handle_p2p_element_info (void *cls, const struct GNUNET_MessageHeader *mh) | |||
617 | GNUNET_CONTAINER_multihashmap_iterate (op->spec->set->elements, | 634 | GNUNET_CONTAINER_multihashmap_iterate (op->spec->set->elements, |
618 | &iterator_initialization, | 635 | &iterator_initialization, |
619 | op); | 636 | op); |
620 | |||
621 | CALCULATE_BF_SIZE(op->state->my_element_count, | ||
622 | op->spec->remote_element_count, | ||
623 | bf_size, | ||
624 | bits_per_element); | ||
625 | |||
626 | op->state->local_bf = GNUNET_CONTAINER_bloomfilter_init (NULL, | ||
627 | bf_size, | ||
628 | bits_per_element); | ||
629 | 637 | ||
630 | GNUNET_CONTAINER_bloomfilter_free (op->state->remote_bf); | 638 | GNUNET_CONTAINER_bloomfilter_free (op->state->remote_bf); |
631 | op->state->remote_bf = NULL; | 639 | op->state->remote_bf = NULL; |
@@ -652,7 +660,6 @@ send_element_count (struct Operation *op) | |||
652 | 660 | ||
653 | // just send our element count, as the other peer must start | 661 | // just send our element count, as the other peer must start |
654 | ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO); | 662 | ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_ELEMENT_INFO); |
655 | msg->reserved = 0; | ||
656 | msg->sender_element_count = htonl (op->state->my_element_count); | 663 | msg->sender_element_count = htonl (op->state->my_element_count); |
657 | msg->bloomfilter_length = htonl (0); | 664 | msg->bloomfilter_length = htonl (0); |
658 | msg->sender_mutator = htonl (0); | 665 | msg->sender_mutator = htonl (0); |
diff --git a/src/set/set_protocol.h b/src/set/set_protocol.h index 632e45963..9d39abba8 100644 --- a/src/set/set_protocol.h +++ b/src/set/set_protocol.h | |||
@@ -101,11 +101,6 @@ struct BFMessage | |||
101 | struct GNUNET_MessageHeader header; | 101 | struct GNUNET_MessageHeader header; |
102 | 102 | ||
103 | /** | 103 | /** |
104 | * Padding, must be 0. | ||
105 | */ | ||
106 | uint8_t reserved; | ||
107 | |||
108 | /** | ||
109 | * mutator used with this bloomfilter. | 104 | * mutator used with this bloomfilter. |
110 | */ | 105 | */ |
111 | uint32_t sender_element_count GNUNET_PACKED; | 106 | uint32_t sender_element_count GNUNET_PACKED; |
@@ -126,6 +121,28 @@ struct BFMessage | |||
126 | uint32_t bloomfilter_length GNUNET_PACKED; | 121 | uint32_t bloomfilter_length GNUNET_PACKED; |
127 | 122 | ||
128 | /** | 123 | /** |
124 | * Length of the bloomfilter data | ||
125 | */ | ||
126 | uint32_t bits_per_element GNUNET_PACKED; | ||
127 | |||
128 | /** | ||
129 | * rest: the sender's bloomfilter | ||
130 | */ | ||
131 | }; | ||
132 | |||
133 | struct BFPart | ||
134 | { | ||
135 | /** | ||
136 | * Type: GNUNET_MESSAGE_TYPE_SET_INTERSECTION_P2P_BF | ||
137 | */ | ||
138 | struct GNUNET_MessageHeader header; | ||
139 | |||
140 | /** | ||
141 | * Length of the appended bloomfilter data block | ||
142 | */ | ||
143 | uint32_t bloomfilter_length GNUNET_PACKED; | ||
144 | |||
145 | /** | ||
129 | * offset in the bloolfilter data block, if multipart message | 146 | * offset in the bloolfilter data block, if multipart message |
130 | */ | 147 | */ |
131 | uint32_t bloomfilter_offset GNUNET_PACKED; | 148 | uint32_t bloomfilter_offset GNUNET_PACKED; |
diff --git a/src/util/container_bloomfilter.c b/src/util/container_bloomfilter.c index 579c1261d..645729553 100644 --- a/src/util/container_bloomfilter.c +++ b/src/util/container_bloomfilter.c | |||
@@ -79,6 +79,21 @@ struct GNUNET_CONTAINER_BloomFilter | |||
79 | }; | 79 | }; |
80 | 80 | ||
81 | 81 | ||
82 | /** | ||
83 | * Get the number of the addresses set per element in the bloom filter. | ||
84 | * | ||
85 | * @param bf the filter | ||
86 | * @return addresses set per element in the bf | ||
87 | */ | ||
88 | size_t | ||
89 | GNUNET_CONTAINER_bloomfilter_get_element_addresses (const struct GNUNET_CONTAINER_BloomFilter | ||
90 | *bf) | ||
91 | { | ||
92 | if (bf == NULL) | ||
93 | return 0; | ||
94 | return bf->addressesPerElement; | ||
95 | } | ||
96 | |||
82 | 97 | ||
83 | /** | 98 | /** |
84 | * Get size of the bloom filter. | 99 | * Get size of the bloom filter. |