-
- received_msg = (struct GNUNET_DV_MessageReceived *) msg;
- packed_msg_len = ntohl (received_msg->msg_len);
- sender_address_len =
- ntohs (msg->size) - packed_msg_len -
- sizeof (struct GNUNET_DV_MessageReceived);
- GNUNET_assert (sender_address_len > 0);
- sender_address = GNUNET_malloc (sender_address_len);
- memcpy (sender_address, &received_msg[1], sender_address_len);
- packed_msg_start = (char *) &received_msg[1];
- packed_msg = GNUNET_malloc (packed_msg_len);
- memcpy (packed_msg, &packed_msg_start[sender_address_len], packed_msg_len);
-
-#if DEBUG_DV_MESSAGES
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DV_API receive: packed message type: %d or %d\n",
- ntohs (((struct GNUNET_MessageHeader *) packed_msg)->type),
- ((struct GNUNET_MessageHeader *) packed_msg)->type);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DV_API receive: message sender reported as %s\n",
- GNUNET_i2s (&received_msg->sender));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "DV_API receive: distance is %u\n",
- ntohl (received_msg->distance));
-#endif
-
- handle->receive_handler (handle->receive_cls, &received_msg->sender,
- packed_msg, packed_msg_len,
- ntohl (received_msg->distance), sender_address,
- sender_address_len);
-
- GNUNET_free (sender_address);
+ }
+ cm = (const struct GNUNET_DV_ConnectMessage *) msg;
+ peer = GNUNET_CONTAINER_multipeermap_get (sh->peers,
+ &cm->peer);
+ if (NULL != peer)
+ {
+ GNUNET_break (0);
+ reconnect (sh);
+ return;
+ }
+ peer = GNUNET_new (struct ConnectedPeer);
+ peer->pid = cm->peer;
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_put (sh->peers,
+ &peer->pid,
+ peer,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+ sh->connect_cb (sh->cls,
+ &cm->peer,
+ ntohl (cm->distance),
+ (enum GNUNET_ATS_Network_Type) ntohl (cm->network));