- typo
[oweals/gnunet.git] / src / multicast / multicast_api.c
index 6a7cf98ebcc42a567dd46c186f6bf5fdc8e1e477..31a02b96d67ea9e2805ae224b448a11808dd99b4 100644 (file)
@@ -18,7 +18,7 @@
      Boston, MA 02111-1307, USA.
 */
 
-/** 
+/**
  * @file multicast/multicast_api.c
  * @brief multicast service; establish tunnels to distant peers
  * @author Christian Grothoff
@@ -30,6 +30,9 @@
 #include "gnunet_multicast_service.h"
 #include "multicast.h"
 
+#define LOG(kind,...) GNUNET_log_from (kind, "multicast-api",__VA_ARGS__)
+
+
 /** 
  * Handle for a request to send a message to all multicast group members
  * (from the origin).
@@ -38,6 +41,7 @@ struct GNUNET_MULTICAST_OriginMessageHandle
 {
   GNUNET_MULTICAST_OriginTransmitNotify notify;
   void *notify_cls;
+  struct GNUNET_MULTICAST_Origin *origin;
 
   uint64_t message_id;
   uint64_t group_generation;
@@ -45,12 +49,12 @@ struct GNUNET_MULTICAST_OriginMessageHandle
 };
 
 
-/** 
+/**
  * Handle for the origin of a multicast group.
  */
 struct GNUNET_MULTICAST_Origin
 {
-  struct GNUNET_CRYPTO_EccPrivateKey priv_key;
+  struct GNUNET_CRYPTO_EddsaPrivateKey priv_key;
   struct GNUNET_MULTICAST_OriginMessageHandle msg_handle;
 
   GNUNET_MULTICAST_JoinCallback join_cb;
@@ -65,7 +69,7 @@ struct GNUNET_MULTICAST_Origin
 };
 
 
-/** 
+/**
  * Handle for a message to be delivered from a member to the origin.
  */
 struct GNUNET_MULTICAST_MemberRequestHandle
@@ -73,7 +77,7 @@ struct GNUNET_MULTICAST_MemberRequestHandle
 };
 
 
-/** 
+/**
  * Opaque handle for a multicast group member.
  */
 struct GNUNET_MULTICAST_Member
@@ -83,12 +87,12 @@ struct GNUNET_MULTICAST_Member
 
 GNUNET_NETWORK_STRUCT_BEGIN
 
-/** 
+/**
  * Header of a request from a member to the origin.
  */
 struct GNUNET_MULTICAST_RequestHeader
 {
-  /** 
+  /**
    * Header for all requests from a member to the origin.
    */
   struct GNUNET_MessageHeader header;
@@ -96,31 +100,31 @@ struct GNUNET_MULTICAST_RequestHeader
   /**
    * Public key of the sending member.
    */
-  struct GNUNET_CRYPTO_EccPublicSignKey member_key;
+  struct GNUNET_CRYPTO_EddsaPublicKey member_key;
 
-  /** 
+  /**
    * ECC signature of the request fragment.
    *
    * Signature must match the public key of the multicast group.
    */
-  struct GNUNET_CRYPTO_EccSignature signature;
+  struct GNUNET_CRYPTO_EddsaSignature signature;
 
-  /** 
+  /**
    * Purpose for the signature and size of the signed data.
    */
   struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
 
-  /** 
+  /**
    * Number of the request fragment, monotonically increasing.
    */
   uint64_t fragment_id GNUNET_PACKED;
 
-  /** 
+  /**
    * Byte offset of this @e fragment of the @e request.
    */
   uint64_t fragment_offset GNUNET_PACKED;
 
-  /** 
+  /**
    * Number of the request this fragment belongs to.
    *
    * Set in GNUNET_MULTICAST_origin_to_all().
@@ -135,24 +139,24 @@ struct GNUNET_MULTICAST_RequestHeader
   /* Followed by request body. */
 };
 
-/** 
+/**
  * Header of a join request sent to the origin or another member.
  */
 struct GNUNET_MULTICAST_JoinRequest
 {
-  /** 
+  /**
    * Header for the join request.
    */
   struct GNUNET_MessageHeader header;
 
-  /** 
+  /**
    * ECC signature of the rest of the fields of the join request.
    *
    * Signature must match the public key of the joining member.
    */
-  struct GNUNET_CRYPTO_EccSignature signature;
+  struct GNUNET_CRYPTO_EddsaSignature signature;
 
-  /** 
+  /**
    * Purpose for the signature and size of the signed data.
    */
   struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
@@ -160,12 +164,12 @@ struct GNUNET_MULTICAST_JoinRequest
   /**
    * Public key of the target group.
    */
-  struct GNUNET_CRYPTO_EccPublicSignKey group_key;
+  struct GNUNET_CRYPTO_EddsaPublicKey group_key;
 
   /**
    * Public key of the joining member.
    */
-  struct GNUNET_CRYPTO_EccPublicSignKey member_key;
+  struct GNUNET_CRYPTO_EddsaPublicKey member_key;
 
   /**
    * Peer identity of the joining member.
@@ -178,7 +182,7 @@ struct GNUNET_MULTICAST_JoinRequest
 GNUNET_NETWORK_STRUCT_END
 
 
-/** 
+/**
  * Handle that identifies a join request.
  *
  * Used to match calls to #GNUNET_MULTICAST_JoinCallback to the
@@ -189,7 +193,7 @@ struct GNUNET_MULTICAST_JoinHandle
 };
 
 
-/** 
+/**
  * Function to call with the decision made for a join request.
  *
  * Must be called once and only once in response to an invocation of the
@@ -222,7 +226,7 @@ GNUNET_MULTICAST_join_decision (struct GNUNET_MULTICAST_JoinHandle *jh,
 }
 
 
-/** 
+/**
  * Handle to pass back for the answer of a membership test.
  */
 struct GNUNET_MULTICAST_MembershipTestHandle
@@ -230,7 +234,7 @@ struct GNUNET_MULTICAST_MembershipTestHandle
 };
 
 
-/** 
+/**
  * Call informing multicast about the decision taken for a membership test.
  *
  * @param mth Handle that was given for the query.
@@ -244,7 +248,7 @@ GNUNET_MULTICAST_membership_test_result (struct GNUNET_MULTICAST_MembershipTestH
 }
 
 
-/** 
+/**
  * Opaque handle to a replay request from the multicast service.
  */
 struct GNUNET_MULTICAST_ReplayHandle
@@ -252,7 +256,7 @@ struct GNUNET_MULTICAST_ReplayHandle
 };
 
 
-/** 
+/**
  * Replay a message fragment for the multicast group.
  *
  * @param rh Replay handle identifying which replay operation was requested.
@@ -267,7 +271,7 @@ GNUNET_MULTICAST_replay_response (struct GNUNET_MULTICAST_ReplayHandle *rh,
 }
 
 
-/** 
+/**
  * Indicate the end of the replay session.
  *
  * Invalidates the replay handle.
@@ -280,7 +284,7 @@ GNUNET_MULTICAST_replay_response_end (struct GNUNET_MULTICAST_ReplayHandle *rh)
 }
 
 
-/** 
+/**
  * Replay a message for the multicast group.
  *
  * @param rh Replay handle identifying which replay operation was requested.
@@ -295,7 +299,7 @@ GNUNET_MULTICAST_replay_response2 (struct GNUNET_MULTICAST_ReplayHandle *rh,
 }
 
 
-/** 
+/**
  * Start a multicast group.
  *
  * Will advertise the origin in the P2P overlay network under the respective
@@ -325,7 +329,7 @@ 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,
+                               const struct GNUNET_CRYPTO_EddsaPrivateKey *priv_key,
                                uint64_t next_fragment_id,
                                GNUNET_MULTICAST_JoinCallback join_cb,
                                GNUNET_MULTICAST_MembershipTestCallback mem_test_cb,
@@ -353,6 +357,7 @@ GNUNET_MULTICAST_origin_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
 static void
 schedule_origin_to_all (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "schedule_origin_to_all()\n");
   struct GNUNET_MULTICAST_Origin *orig = cls;
   struct GNUNET_MULTICAST_OriginMessageHandle *mh = &orig->msg_handle;
 
@@ -361,12 +366,18 @@ schedule_origin_to_all (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc
     = GNUNET_malloc (sizeof (*msg) + buf_size);
   int ret = mh->notify (mh->notify_cls, &buf_size, &msg[1]);
 
-  if (ret != GNUNET_YES || ret != GNUNET_NO)
+  if (! (GNUNET_YES == ret || GNUNET_NO == ret)
+      || buf_size > GNUNET_MULTICAST_FRAGMENT_MAX_SIZE)
   {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "MasterTransmitNotify() returned error or invalid message size.\n");
     /* FIXME: handle error */
     return;
   }
 
+  if (GNUNET_NO == ret && 0 == buf_size)
+    return; /* Transmission paused. */
+
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MESSAGE);
   msg->header.size = htons (buf_size);
   msg->message_id = mh->message_id;
@@ -382,7 +393,7 @@ schedule_origin_to_all (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc
                              - sizeof (msg->signature));
   msg->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MULTICAST_MESSAGE);
 
-  if (GNUNET_OK != GNUNET_CRYPTO_ecc_sign (&orig->priv_key, &msg->purpose,
+  if (GNUNET_OK != GNUNET_CRYPTO_eddsa_sign (&orig->priv_key, &msg->purpose,
                                            &msg->signature))
   {
     /* FIXME: handle error */
@@ -393,16 +404,16 @@ schedule_origin_to_all (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc
    *        returned signed message.
    * FIXME: Also send to local members in this group.
    */
-  orig->message_cb (orig->cls, msg);
+  orig->message_cb (orig->cls, (const struct GNUNET_MessageHeader *) msg);
 
   if (GNUNET_NO == ret)
     GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
                                   (GNUNET_TIME_UNIT_SECONDS, 1),
-                                  schedule_origin_to_all, mh);
+                                  schedule_origin_to_all, orig);
 
 }
 
-/** 
+/**
  * Send a message to the multicast group.
  *
  * @param origin Handle to the multicast group.
@@ -421,6 +432,7 @@ GNUNET_MULTICAST_origin_to_all (struct GNUNET_MULTICAST_Origin *origin,
                                 void *notify_cls)
 {
   struct GNUNET_MULTICAST_OriginMessageHandle *mh = &origin->msg_handle;
+  mh->origin = origin;
   mh->message_id = message_id;
   mh->group_generation = group_generation;
   mh->notify = notify;
@@ -433,7 +445,7 @@ GNUNET_MULTICAST_origin_to_all (struct GNUNET_MULTICAST_Origin *origin,
 }
 
 
-/** 
+/**
  * Resume message transmission to multicast group.
  *
  * @param mh Request to cancel.
@@ -441,11 +453,11 @@ GNUNET_MULTICAST_origin_to_all (struct GNUNET_MULTICAST_Origin *origin,
 void
 GNUNET_MULTICAST_origin_to_all_resume (struct GNUNET_MULTICAST_OriginMessageHandle *mh)
 {
-
+  GNUNET_SCHEDULER_add_now (schedule_origin_to_all, mh->origin);
 }
 
 
-/** 
+/**
  * Cancel request for message transmission to multicast group.
  *
  * @param mh Request to cancel.
@@ -456,7 +468,7 @@ GNUNET_MULTICAST_origin_to_all_cancel (struct GNUNET_MULTICAST_OriginMessageHand
 }
 
 
-/** 
+/**
  * Stop a multicast group.
  *
  * @param origin Multicast group to stop.
@@ -468,7 +480,7 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin)
 }
 
 
-/** 
+/**
  * Join a multicast group.
  *
  * The entity joining is always the local peer.  Further information about the
@@ -511,8 +523,8 @@ GNUNET_MULTICAST_origin_stop (struct GNUNET_MULTICAST_Origin *origin)
  */
 struct GNUNET_MULTICAST_Member *
 GNUNET_MULTICAST_member_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
-                              const struct GNUNET_CRYPTO_EccPublicSignKey *group_key,
-                              const struct GNUNET_CRYPTO_EccPrivateKey *member_key,
+                              const struct GNUNET_CRYPTO_EddsaPublicKey *group_key,
+                              const struct GNUNET_CRYPTO_EddsaPrivateKey *member_key,
                               const struct GNUNET_PeerIdentity *origin,
                               uint32_t relay_count,
                               const struct GNUNET_PeerIdentity *relays,
@@ -530,7 +542,7 @@ GNUNET_MULTICAST_member_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
 }
 
 
-/** 
+/**
  * Handle for a replay request.
  */
 struct GNUNET_MULTICAST_MemberReplayHandle
@@ -538,7 +550,7 @@ struct GNUNET_MULTICAST_MemberReplayHandle
 };
 
 
-/** 
+/**
  * Request a fragment to be replayed by fragment ID.
  *
  * Useful if messages below the @e max_known_fragment_id given when joining are
@@ -561,7 +573,7 @@ GNUNET_MULTICAST_member_replay_fragment (struct GNUNET_MULTICAST_Member *member,
 }
 
 
-/** 
+/**
  * Request a message fragment to be replayed.
  *
  * Useful if messages below the @e max_known_fragment_id given when joining are
@@ -588,7 +600,7 @@ GNUNET_MULTICAST_member_replay_message (struct GNUNET_MULTICAST_Member *member,
 }
 
 
-/** 
+/**
  * Cancel a replay request.
  *
  * @param rh Request to cancel.
@@ -599,7 +611,7 @@ GNUNET_MULTICAST_member_replay_cancel (struct GNUNET_MULTICAST_MemberReplayHandl
 }
 
 
-/** 
+/**
  * Part a multicast group.
  *
  * Disconnects from all group members and invalidates the @a member handle.
@@ -616,9 +628,9 @@ GNUNET_MULTICAST_member_part (struct GNUNET_MULTICAST_Member *member)
 }
 
 
-/** 
+/**
  * Send a message to the origin of the multicast group.
- * 
+ *
  * @param member Membership handle.
  * @param message_id Application layer ID for the message.  Opaque to multicast.
  * @param notify Callback to call to get the message.
@@ -635,7 +647,7 @@ GNUNET_MULTICAST_member_to_origin (struct GNUNET_MULTICAST_Member *member,
 }
 
 
-/** 
+/**
  * Resume message transmission to origin.
  *
  * @param rh Request to cancel.
@@ -647,7 +659,7 @@ GNUNET_MULTICAST_member_to_origin_resume (struct GNUNET_MULTICAST_MemberRequestH
 }
 
 
-/** 
+/**
  * Cancel request for message transmission to origin.
  *
  * @param rh Request to cancel.