[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r29646 - in gnunet/src: include multicast
From: |
gnunet |
Subject: |
[GNUnet-SVN] r29646 - in gnunet/src: include multicast |
Date: |
Fri, 27 Sep 2013 12:13:37 +0200 |
Author: tg
Date: 2013-09-27 12:13:36 +0200 (Fri, 27 Sep 2013)
New Revision: 29646
Modified:
gnunet/src/include/gnunet_multicast_service.h
gnunet/src/include/gnunet_psyc_service.h
gnunet/src/include/gnunet_signatures.h
gnunet/src/multicast/multicast_api.c
Log:
multicast: simplistic origin_to_all() code to be able to test the psyc service
Modified: gnunet/src/include/gnunet_multicast_service.h
===================================================================
--- gnunet/src/include/gnunet_multicast_service.h 2013-09-27 09:49:39 UTC
(rev 29645)
+++ gnunet/src/include/gnunet_multicast_service.h 2013-09-27 10:13:36 UTC
(rev 29646)
@@ -476,10 +476,10 @@
* @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 @@
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 @@
* 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 @@
*/
typedef int
(*GNUNET_MULTICAST_OriginTransmitNotify) (void *cls,
- uint64_t fragment_id,
size_t *data_size,
void *data);
@@ -591,7 +588,7 @@
* @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 @@
* 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 @@
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 @@
* 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 @@
*/
typedef int
(*GNUNET_MULTICAST_MemberTransmitNotify) (void *cls,
- uint64_t fragment_id,
size_t *data_size,
void *data);
Modified: gnunet/src/include/gnunet_psyc_service.h
===================================================================
--- gnunet/src/include/gnunet_psyc_service.h 2013-09-27 09:49:39 UTC (rev
29645)
+++ gnunet/src/include/gnunet_psyc_service.h 2013-09-27 10:13:36 UTC (rev
29646)
@@ -436,8 +436,6 @@
* 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 @@
*/
typedef int
(*GNUNET_PSYC_MasterTransmitNotify) (void *cls,
- uint64_t message_id,
size_t *data_size,
void *data);
Modified: gnunet/src/include/gnunet_signatures.h
===================================================================
--- gnunet/src/include/gnunet_signatures.h 2013-09-27 09:49:39 UTC (rev
29645)
+++ gnunet/src/include/gnunet_signatures.h 2013-09-27 10:13:36 UTC (rev
29646)
@@ -131,6 +131,10 @@
*/
#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 */
Modified: gnunet/src/multicast/multicast_api.c
===================================================================
--- gnunet/src/multicast/multicast_api.c 2013-09-27 09:49:39 UTC (rev
29645)
+++ gnunet/src/multicast/multicast_api.c 2013-09-27 10:13:36 UTC (rev
29646)
@@ -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,9 +50,37 @@
*/
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
+{
+};
+
+
GNUNET_NETWORK_STRUCT_BEGIN
/**
@@ -272,10 +310,10 @@
* @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,28 +326,82 @@
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_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 @@
void
GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin)
{
+ GNUNET_free (origin);
}
@@ -422,7 +524,9 @@
GNUNET_MULTICAST_MessageCallback message_cb,
void *cls)
{
- return NULL;
+ struct GNUNET_MULTICAST_Member *mem = GNUNET_malloc (sizeof (*mem));
+
+ return mem;
}
@@ -508,18 +612,11 @@
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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r29646 - in gnunet/src: include multicast,
gnunet <=