diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-06-11 06:08:39 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-06-11 06:09:00 +0200 |
commit | f69bdc6985991ed4062ffa0bd3dc21dab5689613 (patch) | |
tree | 3e646214a2e12971cd63ffd5b29c2a1eb9f89523 /src/set | |
parent | 9e1e0255ccf57f2ee0a2be9f4d49ee6308bdd738 (diff) | |
download | gnunet-f69bdc6985991ed4062ffa0bd3dc21dab5689613.tar.gz gnunet-f69bdc6985991ed4062ffa0bd3dc21dab5689613.zip |
set: add 'over' message, since cadet does not reliably detect channel termination
Diffstat (limited to 'src/set')
-rw-r--r-- | src/set/gnunet-service-set.c | 8 | ||||
-rw-r--r-- | src/set/gnunet-service-set_union.c | 43 | ||||
-rw-r--r-- | src/set/gnunet-service-set_union.h | 10 |
3 files changed, 56 insertions, 5 deletions
diff --git a/src/set/gnunet-service-set.c b/src/set/gnunet-service-set.c index 12af653c1..f98d43a7d 100644 --- a/src/set/gnunet-service-set.c +++ b/src/set/gnunet-service-set.c | |||
@@ -1250,6 +1250,10 @@ handle_client_listen (void *cls, | |||
1250 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE, | 1250 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE, |
1251 | struct GNUNET_MessageHeader, | 1251 | struct GNUNET_MessageHeader, |
1252 | NULL), | 1252 | NULL), |
1253 | GNUNET_MQ_hd_fixed_size (union_p2p_over, | ||
1254 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_OVER, | ||
1255 | struct GNUNET_MessageHeader, | ||
1256 | NULL), | ||
1253 | GNUNET_MQ_hd_fixed_size (union_p2p_full_done, | 1257 | GNUNET_MQ_hd_fixed_size (union_p2p_full_done, |
1254 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE, | 1258 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE, |
1255 | struct GNUNET_MessageHeader, | 1259 | struct GNUNET_MessageHeader, |
@@ -1501,6 +1505,10 @@ handle_client_evaluate (void *cls, | |||
1501 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE, | 1505 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE, |
1502 | struct GNUNET_MessageHeader, | 1506 | struct GNUNET_MessageHeader, |
1503 | op), | 1507 | op), |
1508 | GNUNET_MQ_hd_fixed_size (union_p2p_over, | ||
1509 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_OVER, | ||
1510 | struct GNUNET_MessageHeader, | ||
1511 | op), | ||
1504 | GNUNET_MQ_hd_fixed_size (union_p2p_full_done, | 1512 | GNUNET_MQ_hd_fixed_size (union_p2p_full_done, |
1505 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE, | 1513 | GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE, |
1506 | struct GNUNET_MessageHeader, | 1514 | struct GNUNET_MessageHeader, |
diff --git a/src/set/gnunet-service-set_union.c b/src/set/gnunet-service-set_union.c index fc7e578e6..bb2acbf59 100644 --- a/src/set/gnunet-service-set_union.c +++ b/src/set/gnunet-service-set_union.c | |||
@@ -1375,7 +1375,7 @@ send_client_element (struct Operation *op, | |||
1375 | * @param cls operation to destroy | 1375 | * @param cls operation to destroy |
1376 | */ | 1376 | */ |
1377 | static void | 1377 | static void |
1378 | send_done_and_destroy (void *cls) | 1378 | send_client_done (void *cls) |
1379 | { | 1379 | { |
1380 | struct Operation *op = cls; | 1380 | struct Operation *op = cls; |
1381 | struct GNUNET_MQ_Envelope *ev; | 1381 | struct GNUNET_MQ_Envelope *ev; |
@@ -1391,6 +1391,19 @@ send_done_and_destroy (void *cls) | |||
1391 | rm->current_size = GNUNET_htonll (GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element)); | 1391 | rm->current_size = GNUNET_htonll (GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element)); |
1392 | GNUNET_MQ_send (op->set->cs->mq, | 1392 | GNUNET_MQ_send (op->set->cs->mq, |
1393 | ev); | 1393 | ev); |
1394 | } | ||
1395 | |||
1396 | /** | ||
1397 | * Signal to the client that the operation has finished and | ||
1398 | * destroy the operation. | ||
1399 | * | ||
1400 | * @param cls operation to destroy | ||
1401 | */ | ||
1402 | static void | ||
1403 | send_client_done_and_destroy (void *cls) | ||
1404 | { | ||
1405 | struct Operation *op = cls; | ||
1406 | send_client_done (cls); | ||
1394 | /* Will also call the union-specific cancel function. */ | 1407 | /* Will also call the union-specific cancel function. */ |
1395 | _GSS_operation_destroy (op, | 1408 | _GSS_operation_destroy (op, |
1396 | GNUNET_YES); | 1409 | GNUNET_YES); |
@@ -1422,7 +1435,7 @@ maybe_finish (struct Operation *op) | |||
1422 | ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE); | 1435 | ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_UNION_P2P_DONE); |
1423 | GNUNET_MQ_send (op->mq, | 1436 | GNUNET_MQ_send (op->mq, |
1424 | ev); | 1437 | ev); |
1425 | /* We now wait until the other peer closes the channel | 1438 | /* We now wait until the other peer sends P2P_OVER |
1426 | * after it got all elements from us. */ | 1439 | * after it got all elements from us. */ |
1427 | } | 1440 | } |
1428 | } | 1441 | } |
@@ -1433,8 +1446,15 @@ maybe_finish (struct Operation *op) | |||
1433 | num_demanded); | 1446 | num_demanded); |
1434 | if (0 == num_demanded) | 1447 | if (0 == num_demanded) |
1435 | { | 1448 | { |
1449 | struct GNUNET_MQ_Envelope *ev; | ||
1450 | |||
1436 | op->state->phase = PHASE_DONE; | 1451 | op->state->phase = PHASE_DONE; |
1437 | send_done_and_destroy (op); | 1452 | ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_UNION_P2P_OVER); |
1453 | GNUNET_MQ_notify_sent (ev, | ||
1454 | &send_client_done, | ||
1455 | op); | ||
1456 | GNUNET_MQ_send (op->mq, | ||
1457 | ev); | ||
1438 | } | 1458 | } |
1439 | } | 1459 | } |
1440 | } | 1460 | } |
@@ -1850,7 +1870,7 @@ handle_union_p2p_full_done (void *cls, | |||
1850 | 1870 | ||
1851 | ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE); | 1871 | ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_UNION_P2P_FULL_DONE); |
1852 | GNUNET_MQ_notify_sent (ev, | 1872 | GNUNET_MQ_notify_sent (ev, |
1853 | &send_done_and_destroy, | 1873 | &send_client_done, |
1854 | op); | 1874 | op); |
1855 | GNUNET_MQ_send (op->mq, | 1875 | GNUNET_MQ_send (op->mq, |
1856 | ev); | 1876 | ev); |
@@ -1865,7 +1885,7 @@ handle_union_p2p_full_done (void *cls, | |||
1865 | /* We sent the full set, and got the response for that. We're done. */ | 1885 | /* We sent the full set, and got the response for that. We're done. */ |
1866 | op->state->phase = PHASE_DONE; | 1886 | op->state->phase = PHASE_DONE; |
1867 | GNUNET_CADET_receive_done (op->channel); | 1887 | GNUNET_CADET_receive_done (op->channel); |
1868 | send_done_and_destroy (op); | 1888 | send_client_done_and_destroy (op); |
1869 | return; | 1889 | return; |
1870 | } | 1890 | } |
1871 | break; | 1891 | break; |
@@ -2144,6 +2164,19 @@ handle_union_p2p_done (void *cls, | |||
2144 | } | 2164 | } |
2145 | } | 2165 | } |
2146 | 2166 | ||
2167 | /** | ||
2168 | * Handle a over message from a remote peer | ||
2169 | * | ||
2170 | * @param cls the union operation | ||
2171 | * @param mh the message | ||
2172 | */ | ||
2173 | void | ||
2174 | handle_union_p2p_over (void *cls, | ||
2175 | const struct GNUNET_MessageHeader *mh) | ||
2176 | { | ||
2177 | send_client_done (cls); | ||
2178 | } | ||
2179 | |||
2147 | 2180 | ||
2148 | /** | 2181 | /** |
2149 | * Initiate operation to evaluate a set union with a remote peer. | 2182 | * Initiate operation to evaluate a set union with a remote peer. |
diff --git a/src/set/gnunet-service-set_union.h b/src/set/gnunet-service-set_union.h index cbf60bcbc..086666770 100644 --- a/src/set/gnunet-service-set_union.h +++ b/src/set/gnunet-service-set_union.h | |||
@@ -235,5 +235,15 @@ void | |||
235 | handle_union_p2p_done (void *cls, | 235 | handle_union_p2p_done (void *cls, |
236 | const struct GNUNET_MessageHeader *mh); | 236 | const struct GNUNET_MessageHeader *mh); |
237 | 237 | ||
238 | /** | ||
239 | * Handle an over message from a remote peer | ||
240 | * | ||
241 | * @param cls the union operation | ||
242 | * @param mh the message | ||
243 | */ | ||
244 | void | ||
245 | handle_union_p2p_over (void *cls, | ||
246 | const struct GNUNET_MessageHeader *mh); | ||
247 | |||
238 | 248 | ||
239 | #endif | 249 | #endif |