[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r33374 - in gnunet/src: multicast psyc
From: |
gnunet |
Subject: |
[GNUnet-SVN] r33374 - in gnunet/src: multicast psyc |
Date: |
Fri, 23 May 2014 16:41:42 +0200 |
Author: tg
Date: 2014-05-23 16:41:42 +0200 (Fri, 23 May 2014)
New Revision: 33374
Modified:
gnunet/src/multicast/gnunet-service-multicast.c
gnunet/src/multicast/multicast_api.c
gnunet/src/psyc/gnunet-service-psyc.c
gnunet/src/psyc/psyc_api.c
Log:
psyc, multicast: fixes, comments
Modified: gnunet/src/multicast/gnunet-service-multicast.c
===================================================================
--- gnunet/src/multicast/gnunet-service-multicast.c 2014-05-23 14:04:48 UTC
(rev 33373)
+++ gnunet/src/multicast/gnunet-service-multicast.c 2014-05-23 14:41:42 UTC
(rev 33374)
@@ -499,10 +499,16 @@
{ /* First client, send join request. */
struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *)
&msg[1];
uint32_t relay_count = ntohs (msg->relay_count);
- struct GNUNET_MessageHeader *
- join_msg = ((struct GNUNET_MessageHeader *)
- ((char *) &msg[1]) + relay_count * sizeof (*relays));
- uint16_t join_msg_size = ntohs (join_msg->size);
+ uint16_t relay_size = relay_count * sizeof (*relays);
+ struct GNUNET_MessageHeader *join_msg = NULL;
+ uint16_t join_msg_size = 0;
+ if (sizeof (*msg) + relay_size + sizeof (struct GNUNET_MessageHeader)
+ <= ntohs (msg->header.size))
+ {
+ join_msg = (struct GNUNET_MessageHeader *)
+ (((char *) &msg[1]) + relay_size);
+ join_msg_size = ntohs (join_msg->size);
+ }
struct MulticastJoinRequestMessage *
req = GNUNET_malloc (sizeof (*req) + join_msg_size);
@@ -510,7 +516,8 @@
req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST);
req->group_key = grp->pub_key;
GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key);
- memcpy (&req[1], join_msg, join_msg_size);
+ if (0 < join_msg_size)
+ memcpy (&req[1], join_msg, join_msg_size);
req->purpose.size = htonl (sizeof (*req) + join_msg_size
- sizeof (req->header)
@@ -556,17 +563,18 @@
struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *)
&cl_dcsn[1];
uint32_t relay_count = ntohs (cl_dcsn->relay_count);
+ uint16_t relay_size = relay_count * sizeof (*relays);
struct GNUNET_MessageHeader *join_msg = NULL;
uint16_t join_msg_size = 0;
- if (sizeof (*cl_dcsn) + relay_count * sizeof (*relays) + sizeof (*m)
- <= ntohs (m->size))
+ if (sizeof (*cl_dcsn) + relay_size + sizeof (*m) <= ntohs (m->size))
{
- join_msg = ((struct GNUNET_MessageHeader *)
- ((char *) &cl_dcsn[1]) + relay_count * sizeof (*relays));
+ join_msg = (struct GNUNET_MessageHeader *)
+ (((char *) &cl_dcsn[1]) + relay_size);
join_msg_size = ntohs (join_msg->size);
}
+ int keep_dcsn = GNUNET_NO;
struct MulticastJoinDecisionMessage *
dcsn = GNUNET_malloc (sizeof (*dcsn) + join_msg_size);
dcsn->header.size = htons (sizeof (*dcsn) + join_msg_size);
@@ -600,10 +608,10 @@
if (GNUNET_YES == dcsn->is_admitted)
{ /* Member admitted, store join_decision. */
mem->join_decision = dcsn;
+ keep_dcsn = GNUNET_YES;
}
else
{ /* Refused entry, disconnect clients. */
- GNUNET_free (dcsn);
struct ClientList *cl = mem->grp.clients_head;
while (NULL != cl)
{
@@ -618,6 +626,8 @@
{
/* FIXME: send join decision to remote peers */
}
+ if (GNUNET_NO == keep_dcsn)
+ GNUNET_free (dcsn);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
Modified: gnunet/src/multicast/multicast_api.c
===================================================================
--- gnunet/src/multicast/multicast_api.c 2014-05-23 14:04:48 UTC (rev
33373)
+++ gnunet/src/multicast/multicast_api.c 2014-05-23 14:41:42 UTC (rev
33374)
@@ -676,8 +676,10 @@
dcsn->member_peer = jh->member_peer;
dcsn->is_admitted = is_admitted;
dcsn->relay_count = relay_count;
- memcpy (&dcsn[1], relays, relay_size);
- memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size);
+ if (0 < relay_size)
+ memcpy (&dcsn[1], relays, relay_size);
+ if (0 < join_resp_size)
+ memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size);
GNUNET_CONTAINER_DLL_insert_tail (grp->tmit_head, grp->tmit_tail, mq);
transmit_next (grp);
@@ -997,13 +999,15 @@
uint16_t join_msg_size = (NULL != join_msg) ? ntohs (join_msg->size) : 0;
struct MulticastMemberJoinMessage *
join = GNUNET_malloc (sizeof (*join) + relay_size + join_msg_size);
+ join->header.size = htons (sizeof (*join) + relay_size + join_msg_size);
join->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN);
- join->header.size = htons (sizeof (*join) + relay_size + join_msg_size);
join->group_key = *group_key;
join->member_key = *member_key;
join->origin = *origin;
- memcpy (&join[1], relays, relay_size);
- memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size);
+ if (0 < relay_size)
+ memcpy (&join[1], relays, relay_size);
+ if (0 < join_msg_size)
+ memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size);
grp->reconnect_msg = (struct GNUNET_MessageHeader *) join;
grp->is_origin = GNUNET_NO;
Modified: gnunet/src/psyc/gnunet-service-psyc.c
===================================================================
--- gnunet/src/psyc/gnunet-service-psyc.c 2014-05-23 14:04:48 UTC (rev
33373)
+++ gnunet/src/psyc/gnunet-service-psyc.c 2014-05-23 14:41:42 UTC (rev
33374)
@@ -628,7 +628,8 @@
req->header.size = htons (sizeof (*req) + join_msg_size);
req->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_JOIN_REQUEST);
req->slave_key = *slave_key;
- memcpy (&req[1], join_msg, join_msg_size);
+ if (0 < join_msg_size)
+ memcpy (&req[1], join_msg, join_msg_size);
struct JoinMemTestClosure *jcls = GNUNET_malloc (sizeof (*jcls));
jcls->slave_key = *slave_key;
@@ -1700,17 +1701,28 @@
}
+/**
+ * Queue PSYC message parts for sending to multicast.
+ *
+ * @param ch Channel to send to.
+ * @param client Client the message originates from.
+ * @param data_size Size of @a data.
+ * @param data Concatenated message parts.
+ * @param first_ptype First message part type in @a data.
+ * @param last_ptype Last message part type in @a data.
+ */
static void
queue_message (struct Channel *ch,
struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *msg,
+ size_t data_size,
+ const void *data,
uint16_t first_ptype, uint16_t last_ptype)
{
- uint16_t size = ntohs (msg->size) - sizeof (*msg);
- struct TransmitMessage *tmit_msg = GNUNET_malloc (sizeof (*tmit_msg) + size);
- memcpy (&tmit_msg[1], &msg[1], size);
+ struct TransmitMessage *
+ tmit_msg = GNUNET_malloc (sizeof (*tmit_msg) + data_size);
+ memcpy (&tmit_msg[1], data, data_size);
tmit_msg->client = client;
- tmit_msg->size = size;
+ tmit_msg->size = data_size;
tmit_msg->state = ch->tmit_state;
GNUNET_CONTAINER_DLL_insert_tail (ch->tmit_head, ch->tmit_tail, tmit_msg);
@@ -1723,16 +1735,22 @@
}
+/**
+ * Cancel transmission of current message.
+ *
+ * @param ch Channel to send to.
+ * @param client Client the message originates from.
+ */
static void
-transmit_error (struct Channel *ch, struct GNUNET_SERVER_Client *client)
+transmit_cancel (struct Channel *ch, struct GNUNET_SERVER_Client *client)
{
uint16_t type = GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL;
struct GNUNET_MessageHeader msg;
- msg.size = ntohs (sizeof (msg));
- msg.type = ntohs (type);
+ msg.size = htons (sizeof (msg));
+ msg.type = htons (type);
- queue_message (ch, client, &msg, type, type);
+ queue_message (ch, client, sizeof (msg), &msg, type, type);
transmit_message (ch);
/* FIXME: cleanup */
@@ -1768,7 +1786,7 @@
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%p Message payload too large\n", ch);
GNUNET_break (0);
- transmit_error (ch, client);
+ transmit_cancel (ch, client);
GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
return;
}
@@ -1782,12 +1800,13 @@
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"%p Received invalid message part from client.\n", ch);
GNUNET_break (0);
- transmit_error (ch, client);
+ transmit_cancel (ch, client);
GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
return;
}
- queue_message (ch, client, msg, first_ptype, last_ptype);
+ queue_message (ch, client, size - sizeof (*msg), &msg[1],
+ first_ptype, last_ptype);
transmit_message (ch);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
Modified: gnunet/src/psyc/psyc_api.c
===================================================================
--- gnunet/src/psyc/psyc_api.c 2014-05-23 14:04:48 UTC (rev 33373)
+++ gnunet/src/psyc/psyc_api.c 2014-05-23 14:41:42 UTC (rev 33374)
@@ -1272,7 +1272,7 @@
struct GNUNET_PSYC_Channel *ch = &jh->mst->ch;
struct MasterJoinDecision *dcsn;
- struct GNUNET_PSYC_MessageHeader *pmsg;
+ struct GNUNET_PSYC_MessageHeader *pmsg = NULL;
uint16_t pmsg_size = 0;
/* FIXME:
sizeof (*pmsg)
@@ -1285,14 +1285,14 @@
struct MessageQueue *
mq = GNUNET_malloc (sizeof (*mq) + sizeof (*dcsn) + relay_size +
pmsg_size);
dcsn = (struct MasterJoinDecision *) &mq[1];
+ dcsn->header.size = htons (sizeof (*dcsn) + relay_size + pmsg_size);
dcsn->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION);
- dcsn->header.size = htons (sizeof (*mq) + sizeof (*dcsn)
- + relay_size + pmsg_size);
dcsn->is_admitted = (GNUNET_YES == is_admitted) ? GNUNET_YES : GNUNET_NO;
dcsn->slave_key = jh->slave_key;
/* FIXME: add message parts to pmsg */
- memcpy (&dcsn[1], pmsg, pmsg_size);
+ if (0 < pmsg_size)
+ memcpy (&dcsn[1], pmsg, pmsg_size);
GNUNET_CONTAINER_DLL_insert_tail (ch->tmit_head, ch->tmit_tail, mq);
transmit_next (ch);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33374 - in gnunet/src: multicast psyc,
gnunet <=