enum GNUNET_BLOCK_Type type;
/**
- * Did we transmit this request already? YES if we are
- * in the 'waiting_map', NO if we are in the 'pending' DLL.
+ * Did we transmit this request already? #GNUNET_YES if we are
+ * in the 'waiting_map', #GNUNET_NO if we are in the 'pending' DLL.
*/
int was_transmitted;
};
struct GSF_MeshRequest *pending_tail;
/**
- * Map from query to 'struct GSF_MeshRequest's waiting for
+ * Map from query to `struct GSF_MeshRequest`s waiting for
* a reply.
*/
struct GNUNET_CONTAINER_MultiHashMap *waiting_map;
* Iterator called on each entry in a waiting map to
* move it back to the pending list.
*
- * @param cls the 'struct MeshHandle'
+ * @param cls the `struct MeshHandle`
* @param key the key of the entry in the map (the query)
- * @param value the 'struct GSF_MeshRequest' to move to pending
- * @return GNUNET_YES (continue to iterate)
+ * @param value the `struct GSF_MeshRequest` to move to pending
+ * @return #GNUNET_YES (continue to iterate)
*/
static int
move_to_pending (void *cls,
mh,
&mh->target,
GNUNET_APPLICATION_TYPE_FS_BLOCK_TRANSFER,
- GNUNET_NO,
- GNUNET_YES);
+ GNUNET_MESH_OPTION_RELIABLE);
transmit_pending (mh);
}
/**
* Task called when it is time to destroy an inactive mesh channel.
*
- * @param cls the 'struct MeshHandle' to tear down
+ * @param cls the `struct MeshHandle` to tear down
* @param tc scheduler context, unused
*/
static void
/**
* Task called when it is time to reset an mesh.
*
- * @param cls the 'struct MeshHandle' to tear down
+ * @param cls the `struct MeshHandle` to tear down
* @param tc scheduler context, unused
*/
static void
/**
- * Closure for 'handle_reply'.
+ * Closure for handle_reply().
*/
struct HandleReplyClosure
{
* Iterator called on each entry in a waiting map to
* process a result.
*
- * @param cls the 'struct HandleReplyClosure'
+ * @param cls the `struct HandleReplyClosure`
* @param key the key of the entry in the map (the query)
- * @param value the 'struct GSF_MeshRequest' to handle result for
+ * @param value the `struct GSF_MeshRequest` to handle result for
* @return #GNUNET_YES (continue to iterate)
*/
static int
* Functions with this signature are called whenever a complete reply
* is received.
*
- * @param cls closure with the 'struct MeshHandle'
+ * @param cls closure with the `struct MeshHandle`
* @param channel channel handle
* @param channel_ctx channel context
* @param message the actual message
&srm[1], msize, &query))
{
GNUNET_break_op (0);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Received bogus reply of type %u with %u bytes via mesh from peer %s\n",
+ type,
+ msize,
+ GNUNET_i2s (&mh->target));
reset_mesh_async (mh);
return GNUNET_SYSERR;
}
mh);
mh->waiting_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_YES);
mh->target = *target;
- mh->channel = GNUNET_MESH_channel_create (mesh_handle,
- mh,
- &mh->target,
- GNUNET_APPLICATION_TYPE_FS_BLOCK_TRANSFER,
- GNUNET_NO,
- GNUNET_YES);
GNUNET_assert (GNUNET_OK ==
GNUNET_CONTAINER_multipeermap_put (mesh_map,
&mh->target,
mh,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+ mh->channel = GNUNET_MESH_channel_create (mesh_handle,
+ mh,
+ &mh->target,
+ GNUNET_APPLICATION_TYPE_FS_BLOCK_TRANSFER,
+ GNUNET_MESH_OPTION_RELIABLE);
+ GNUNET_assert (mh ==
+ GNUNET_CONTAINER_multipeermap_get (mesh_map,
+ target));
return mh;
}
if (NULL != p)
{
/* signal failure / cancellation to callback */
- p (sr->proc_cls, GNUNET_BLOCK_TYPE_ANY,
+ p (sr->proc_cls, GNUNET_BLOCK_TYPE_ANY,
GNUNET_TIME_UNIT_ZERO_ABS,
0, NULL);
}
/**
* Function called by mesh when a client disconnects.
- * Cleans up our 'struct MeshClient' of that channel.
+ * Cleans up our `struct MeshClient` of that channel.
*
* @param cls NULL
* @param channel channel of the disconnecting client
mh->channel = NULL;
while (NULL != (sr = mh->pending_head))
GSF_mesh_query_cancel (sr);
+ /* first remove `mh` from the `mesh_map`, so that if the
+ callback from `free_waiting_entry()` happens to re-issue
+ the request, we don't immediately have it back in the
+ `waiting_map`. */
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_remove (mesh_map,
+ &mh->target,
+ mh));
GNUNET_CONTAINER_multihashmap_iterate (mh->waiting_map,
&free_waiting_entry,
mh);
GNUNET_SCHEDULER_cancel (mh->timeout_task);
if (GNUNET_SCHEDULER_NO_TASK != mh->reset_task)
GNUNET_SCHEDULER_cancel (mh->reset_task);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (mesh_map,
- &mh->target,
- mh));
+ GNUNET_assert (0 ==
+ GNUNET_CONTAINER_multihashmap_size (mh->waiting_map));
GNUNET_CONTAINER_multihashmap_destroy (mh->waiting_map);
GNUNET_free (mh);
}
void *value)
{
struct MeshHandle *mh = value;
- struct GNUNET_MESH_Channel *tun;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Timeout on mesh channel to %s\n",
GNUNET_i2s (&mh->target));
- tun = mh->channel;
- mh->channel = NULL;
- if (NULL != tun)
- GNUNET_MESH_channel_destroy (tun);
+ if (NULL != mh->channel)
+ GNUNET_MESH_channel_destroy (mh->channel);
return GNUNET_YES;
}