gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit 7bbbb8a1f5725497b1edf68cba59529d95fe585d
parent bcdae74167d2e1f9d8dd9b01fb368bf8bcc2287d
Author: Gabor X Toth <*@tg-x.net>
Date:   Fri, 27 Sep 2013 10:13:36 +0000

multicast: simplistic origin_to_all() code to be able to test the psyc service

Diffstat:
Msrc/include/gnunet_multicast_service.h | 24+++++++++---------------
Msrc/include/gnunet_psyc_service.h | 3---
Msrc/include/gnunet_signatures.h | 4++++
Msrc/multicast/multicast_api.c | 143++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
4 files changed, 133 insertions(+), 41 deletions(-)

diff --git a/src/include/gnunet_multicast_service.h b/src/include/gnunet_multicast_service.h @@ -476,10 +476,10 @@ GNUNET_MULTICAST_replay_response2 (struct GNUNET_MULTICAST_ReplayHandle *rh, * @param cfg Configuration to use. * @param priv_key ECC key that will be used to sign messages for this * multicast session; public key is used to identify the multicast group; - * @param last_fragment_id Last fragment ID to continue counting fragments from - * when restarting the origin. 0 for a new group. + * @param next_fragment_id Next fragment ID to continue counting fragments from + * when restarting the origin. 1 for a new group. * @param join_cb Function called to approve / disapprove joining of a peer. - * @param test_cb Function multicast can use to test group membership. + * @param mem_test_cb Function multicast can use to test group membership. * @param replay_frag_cb Function that can be called to replay a message fragment. * @param replay_msg_cb Function that can be called to replay a message. * @param request_cb Function called with message fragments from group members. @@ -492,16 +492,16 @@ GNUNET_MULTICAST_replay_response2 (struct GNUNET_MULTICAST_ReplayHandle *rh, struct GNUNET_MULTICAST_Origin * GNUNET_MULTICAST_origin_start (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_CRYPTO_EccPrivateKey *priv_key, - uint64_t last_fragment_id, + uint64_t next_fragment_id, GNUNET_MULTICAST_JoinCallback join_cb, - GNUNET_MULTICAST_MembershipTestCallback test_cb, + GNUNET_MULTICAST_MembershipTestCallback mem_test_cb, GNUNET_MULTICAST_ReplayFragmentCallback replay_frag_cb, GNUNET_MULTICAST_ReplayMessageCallback replay_msg_cb, GNUNET_MULTICAST_RequestCallback request_cb, GNUNET_MULTICAST_MessageCallback message_cb, void *cls); -/** +/** * Function called to provide data for a transmission from the origin to all * members. * @@ -509,8 +509,6 @@ GNUNET_MULTICAST_origin_start (const struct GNUNET_CONFIGURATION_Handle *cfg, * invalidates the respective transmission handle. * * @param cls Closure. - * @param fragment_id Set to the unique fragment ID that was generated for - * this message. * @param[in,out] data_size Initially set to the number of bytes available in * @a data, should be set to the number of bytes written to data. * @param[out] data Where to write the body of the message to give to the @@ -524,7 +522,6 @@ GNUNET_MULTICAST_origin_start (const struct GNUNET_CONFIGURATION_Handle *cfg, */ typedef int (*GNUNET_MULTICAST_OriginTransmitNotify) (void *cls, - uint64_t fragment_id, size_t *data_size, void *data); @@ -591,7 +588,7 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin); * @a message_cb is invoked with a (failure) response and then with NULL. If * the join succeeds, outstanding (state) messages and ongoing multicast * messages will be given to the @a message_cb until the member decides to part - * the group. The @a test_cb and @a replay_cb functions may be called at + * the group. The @a mem_test_cb and @a replay_cb functions may be called at * anytime by the multicast service to support relaying messages to other * members of the group. * @@ -611,7 +608,7 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin); * identity/pseudonym to peer identity, application-level message to * origin, etc.). * @param join_cb Function called to approve / disapprove joining of a peer. - * @param test_cb Function multicast can use to test group membership. + * @param mem_test_cb Function multicast can use to test group membership. * @param replay_frag_cb Function that can be called to replay message fragments * this peer already knows from this group. NULL if this * client is unable to support replay. @@ -633,7 +630,7 @@ GNUNET_MULTICAST_member_join (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_PeerIdentity *relays, const struct GNUNET_MessageHeader *join_request, GNUNET_MULTICAST_JoinCallback join_cb, - GNUNET_MULTICAST_MembershipTestCallback test_cb, + GNUNET_MULTICAST_MembershipTestCallback mem_test_cb, GNUNET_MULTICAST_ReplayFragmentCallback replay_frag_cb, GNUNET_MULTICAST_ReplayMessageCallback replay_msg_cb, GNUNET_MULTICAST_MessageCallback message_cb, @@ -719,8 +716,6 @@ GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *member); * invalidates the respective transmission handle. * * @param cls Closure. - * @param fragment_id Set to the unique fragment ID that was generated for - * this message. * @param[in,out] data_size Initially set to the number of bytes available in * @a data, should be set to the number of bytes written to data. * @param[out] data Where to write the body of the message to give to the @@ -734,7 +729,6 @@ GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *member); */ typedef int (*GNUNET_MULTICAST_MemberTransmitNotify) (void *cls, - uint64_t fragment_id, size_t *data_size, void *data); diff --git a/src/include/gnunet_psyc_service.h b/src/include/gnunet_psyc_service.h @@ -436,8 +436,6 @@ GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg, * invalidates the respective transmission handle. * * @param cls Closure. - * @param message_id Set to the unique message ID that was generated for - * this message. * @param[in,out] data_size Initially set to the number of bytes available in * @a data, should be set to the number of bytes written to data. * @param[out] data Where to write the body of the message to give to the @@ -451,7 +449,6 @@ GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg, */ typedef int (*GNUNET_PSYC_MasterTransmitNotify) (void *cls, - uint64_t message_id, size_t *data_size, void *data); diff --git a/src/include/gnunet_signatures.h b/src/include/gnunet_signatures.h @@ -131,6 +131,10 @@ extern "C" */ #define GNUNET_SIGNATURE_PURPOSE_REGEX_ACCEPT 18 +/** + * Signature of a multicast message. + */ +#define GNUNET_SIGNATURE_PURPOSE_MULTICAST_MESSAGE 19 #if 0 /* keep Emacsens' auto-indent happy */ diff --git a/src/multicast/multicast_api.c b/src/multicast/multicast_api.c @@ -25,13 +25,23 @@ * @author Gabor X Toth */ #include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_signatures.h" #include "gnunet_multicast_service.h" +#include "multicast.h" /** - * Opaque handle for a multicast group member. + * Handle for a request to send a message to all multicast group members + * (from the origin). */ -struct GNUNET_MULTICAST_Member +struct GNUNET_MULTICAST_OriginMessageHandle { + GNUNET_MULTICAST_OriginTransmitNotify notify; + void *notify_cls; + + uint64_t message_id; + uint64_t group_generation; + uint64_t fragment_offset; }; @@ -40,6 +50,34 @@ struct GNUNET_MULTICAST_Member */ struct GNUNET_MULTICAST_Origin { + struct GNUNET_CRYPTO_EccPrivateKey priv_key; + struct GNUNET_MULTICAST_OriginMessageHandle msg_handle; + + GNUNET_MULTICAST_JoinCallback join_cb; + GNUNET_MULTICAST_MembershipTestCallback mem_test_cb; + GNUNET_MULTICAST_ReplayFragmentCallback replay_frag_cb; + GNUNET_MULTICAST_ReplayMessageCallback replay_msg_cb; + GNUNET_MULTICAST_RequestCallback request_cb; + GNUNET_MULTICAST_MessageCallback message_cb; + void *cls; + + uint64_t next_fragment_id; +}; + + +/** + * Handle for a message to be delivered from a member to the origin. + */ +struct GNUNET_MULTICAST_MemberRequestHandle +{ +}; + + +/** + * Opaque handle for a multicast group member. + */ +struct GNUNET_MULTICAST_Member +{ }; @@ -272,10 +310,10 @@ GNUNET_MULTICAST_replay_response2 (struct GNUNET_MULTICAST_ReplayHandle *rh, * @param cfg Configuration to use. * @param priv_key ECC key that will be used to sign messages for this * multicast session; public key is used to identify the multicast group; - * @param last_fragment_id Last fragment ID to continue counting fragments from + * @param next_fragment_id Next fragment ID to continue counting fragments from * when restarting the origin. 0 for a new group. * @param join_cb Function called to approve / disapprove joining of a peer. - * @param test_cb Function multicast can use to test group membership. + * @param mem_test_cb Function multicast can use to test group membership. * @param replay_frag_cb Function that can be called to replay a message fragment. * @param replay_msg_cb Function that can be called to replay a message. * @param request_cb Function called with message fragments from group members. @@ -288,27 +326,81 @@ GNUNET_MULTICAST_replay_response2 (struct GNUNET_MULTICAST_ReplayHandle *rh, struct GNUNET_MULTICAST_Origin * GNUNET_MULTICAST_origin_start (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_CRYPTO_EccPrivateKey *priv_key, - uint64_t last_fragment_id, + uint64_t next_fragment_id, GNUNET_MULTICAST_JoinCallback join_cb, - GNUNET_MULTICAST_MembershipTestCallback test_cb, + GNUNET_MULTICAST_MembershipTestCallback mem_test_cb, GNUNET_MULTICAST_ReplayFragmentCallback replay_frag_cb, GNUNET_MULTICAST_ReplayMessageCallback replay_msg_cb, GNUNET_MULTICAST_RequestCallback request_cb, GNUNET_MULTICAST_MessageCallback message_cb, void *cls) { - return NULL; + struct GNUNET_MULTICAST_Origin *orig = GNUNET_malloc (sizeof (*orig)); + orig->priv_key = *priv_key; + orig->next_fragment_id = next_fragment_id; + orig->join_cb = join_cb; + orig->mem_test_cb = mem_test_cb; + orig->replay_frag_cb = replay_frag_cb; + orig->replay_msg_cb = replay_msg_cb; + orig->request_cb = request_cb; + orig->message_cb = message_cb; + orig->cls = cls; + return orig; } -/** - * Handle for a request to send a message to all multicast group members - * (from the origin). - */ -struct GNUNET_MULTICAST_OriginMessageHandle +/* FIXME: for now just send back to the client what it sent. */ +static void +schedule_origin_to_all (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { -}; + struct GNUNET_MULTICAST_Origin *orig = cls; + struct GNUNET_MULTICAST_OriginMessageHandle *mh = &orig->msg_handle; + + size_t buf_size = GNUNET_MULTICAST_FRAGMENT_MAX_SIZE; + struct GNUNET_MULTICAST_MessageHeader *msg + = GNUNET_malloc (sizeof (*msg) + buf_size); + int ret = mh->notify (mh->notify_cls, &buf_size, &msg[1]); + + if (ret != GNUNET_YES || ret != GNUNET_NO) + { + /* FIXME: handle error */ + return; + } + + msg->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MESSAGE); + msg->header.size = htons (buf_size); + msg->message_id = mh->message_id; + msg->group_generation = mh->group_generation; + + /* FIXME: add fragment ID and signature in the service */ + msg->fragment_id = orig->next_fragment_id++; + msg->fragment_offset = mh->fragment_offset; + mh->fragment_offset += buf_size; + msg->purpose.size = htonl (buf_size + - sizeof (msg->header) + - sizeof (msg->hop_counter) + - sizeof (msg->signature)); + msg->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MULTICAST_MESSAGE); + + if (GNUNET_OK != GNUNET_CRYPTO_ecc_sign (&orig->priv_key, &msg->purpose, + &msg->signature)) + { + /* FIXME: handle error */ + return; + } + + /* FIXME: send msg to the service and only then call message_cb with the + * returned signed message. + * FIXME: Also send to local members in this group. + */ + orig->message_cb (orig->cls, msg); + if (GNUNET_NO == ret) + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, 1), + schedule_origin_to_all, mh); + +} /** * Send a message to the multicast group. @@ -328,7 +420,16 @@ GNUNET_MULTICAST_origin_to_all (struct GNUNET_MULTICAST_Origin *origin, GNUNET_MULTICAST_OriginTransmitNotify notify, void *notify_cls) { - return NULL; + struct GNUNET_MULTICAST_OriginMessageHandle *mh = &origin->msg_handle; + mh->message_id = message_id; + mh->group_generation = group_generation; + mh->notify = notify; + mh->notify_cls = notify_cls; + + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, 1), + schedule_origin_to_all, origin); + return &origin->msg_handle; } @@ -363,6 +464,7 @@ GNUNET_MULTICAST_origin_to_all_cancel (struct GNUNET_MULTICAST_OriginMessageHand void GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin) { + GNUNET_free (origin); } @@ -422,7 +524,9 @@ GNUNET_MULTICAST_member_join (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MULTICAST_MessageCallback message_cb, void *cls) { - return NULL; + struct GNUNET_MULTICAST_Member *mem = GNUNET_malloc (sizeof (*mem)); + + return mem; } @@ -508,18 +612,11 @@ GNUNET_MULTICAST_member_replay_cancel (struct GNUNET_MULTICAST_MemberReplayHandl void GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *member) { + GNUNET_free (member); } /** - * Handle for a message to be delivered from a member to the origin. - */ -struct GNUNET_MULTICAST_MemberRequestHandle -{ -}; - - -/** * Send a message to the origin of the multicast group. * * @param member Membership handle.