X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fgnunet-service-mesh_local.c;h=9b868124a1d96b3f2d5c4dfbafd9151d2ed6386d;hb=33354bfe79f97acb2c98d08fa4f1c32f2d2b1220;hp=eba5b88dee60f2dc6400241a6538e0252e3ceb63;hpb=d254743f5668e69b13b0d82b373699562f3a0738;p=oweals%2Fgnunet.git diff --git a/src/mesh/gnunet-service-mesh_local.c b/src/mesh/gnunet-service-mesh_local.c index eba5b88de..9b868124a 100644 --- a/src/mesh/gnunet-service-mesh_local.c +++ b/src/mesh/gnunet-service-mesh_local.c @@ -28,7 +28,6 @@ #include "mesh_protocol_enc.h" // GNUNET_MESH_Data is shared #include "gnunet-service-mesh_local.h" -#include "gnunet-service-mesh_tunnel.h" #define LOG(level, ...) GNUNET_log_from(level,"mesh-loc",__VA_ARGS__) @@ -180,6 +179,7 @@ handle_client_connect (void *cls, struct GNUNET_SERVER_Client *client) { struct MeshClient *c; + LOG (GNUNET_ERROR_TYPE_DEBUG, "client connected: %p\n", client); if (NULL == client) return; c = GNUNET_new (struct MeshClient); @@ -192,6 +192,31 @@ handle_client_connect (void *cls, struct GNUNET_SERVER_Client *client) } +/** + * Iterator for deleting each channel whose client endpoint disconnected. + * + * @param cls Closure (client that has disconnected). + * @param key The local channel id (used to access the hashmap). + * @param value The value stored at the key (channel to destroy). + * + * @return GNUNET_OK, keep iterating. + */ +static int +channel_destroy_iterator (void *cls, + uint32_t key, + void *value) +{ + struct MeshChannel *ch = value; + struct MeshClient *c = cls; + + LOG (GNUNET_ERROR_TYPE_DEBUG, + " Channel %s destroy, due to client %s shutdown.\n", + GMCH_2s (ch), GML_2s (c)); + + GMCH_handle_local_destroy (ch, c); + return GNUNET_OK; +} + /** * Handler for client disconnection * @@ -211,7 +236,7 @@ handle_client_disconnect (void *cls, struct GNUNET_SERVER_Client *client) return; } - c = client_get (client); + c = GML_client_get (client); if (NULL != c) { LOG (GNUNET_ERROR_TYPE_DEBUG, "matching client found (%u, %p)\n", @@ -329,17 +354,12 @@ static void handle_channel_create (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { - struct GNUNET_MESH_ChannelMessage *msg; - struct MeshPeer *peer; - struct MeshTunnel2 *t; - struct MeshChannel *ch; struct MeshClient *c; - MESH_ChannelNumber chid; LOG (GNUNET_ERROR_TYPE_DEBUG, "new channel requested\n"); /* Sanity check for client registration */ - if (NULL == (c = client_get (client))) + if (NULL == (c = GML_client_get (client))) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); @@ -355,67 +375,14 @@ handle_channel_create (void *cls, struct GNUNET_SERVER_Client *client, return; } - msg = (struct GNUNET_MESH_ChannelMessage *) message; - LOG (GNUNET_ERROR_TYPE_DEBUG, " towards %s:%u\n", - GNUNET_i2s (&msg->peer), ntohl (msg->port)); - chid = ntohl (msg->channel_id); - - /* Sanity check for duplicate channel IDs */ - if (NULL != channel_get_by_local_id (c, chid)) + if (GNUNET_OK != + GMCH_handle_local_create (c, + (struct GNUNET_MESH_ChannelMessage *) message)) { - GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } - peer = peer_get (&msg->peer); - if (NULL == peer->tunnel) - { - peer->tunnel = tunnel_new (); - peer->tunnel->peer = peer; - if (peer->id == myid) - { - tunnel_change_state (peer->tunnel, MESH_TUNNEL_READY); - } - else - { - peer_connect (peer); - } - } - t = peer->tunnel; - - /* Create channel */ - ch = channel_new (t, c, chid); - if (NULL == ch) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - ch->port = ntohl (msg->port); - channel_set_options (ch, ntohl (msg->opt)); - - /* In unreliable channels, we'll use the DLL to buffer BCK data */ - ch->root_rel = GNUNET_new (struct MeshChannelReliability); - ch->root_rel->ch = ch; - ch->root_rel->expected_delay = MESH_RETRANSMIT_TIME; - - LOG (GNUNET_ERROR_TYPE_DEBUG, "CREATED CHANNEL %s[%x]:%u (%x)\n", - peer2s (t->peer), ch->gid, ch->port, ch->lid_root); - - /* Send create channel */ - { - struct GNUNET_MESH_ChannelCreate msgcc; - - msgcc.header.size = htons (sizeof (msgcc)); - msgcc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE); - msgcc.chid = htonl (ch->gid); - msgcc.port = msg->port; - msgcc.opt = msg->opt; - - GMT_queue_data (t, ch, &msgcc.header, GNUNET_YES); - } - GNUNET_SERVER_receive_done (client, GNUNET_OK); return; } @@ -435,14 +402,13 @@ handle_channel_destroy (void *cls, struct GNUNET_SERVER_Client *client, struct GNUNET_MESH_ChannelMessage *msg; struct MeshClient *c; struct MeshChannel *ch; - struct MeshTunnel2 *t; MESH_ChannelNumber chid; LOG (GNUNET_ERROR_TYPE_DEBUG, "Got a DESTROY CHANNEL from client!\n"); /* Sanity check for client registration */ - if (NULL == (c = client_get (client))) + if (NULL == (c = GML_client_get (client))) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); @@ -462,7 +428,7 @@ handle_channel_destroy (void *cls, struct GNUNET_SERVER_Client *client, /* Retrieve tunnel */ chid = ntohl (msg->channel_id); - ch = channel_get_by_local_id (c, chid); + ch = GML_channel_get (c, chid); if (NULL == ch) { LOG (GNUNET_ERROR_TYPE_ERROR, " channel %X not found\n", chid); @@ -471,27 +437,7 @@ handle_channel_destroy (void *cls, struct GNUNET_SERVER_Client *client, return; } - /* Cleanup after the tunnel */ - client_delete_channel (c, ch); - if (c == ch->dest && GNUNET_MESH_LOCAL_CHANNEL_ID_SERV <= chid) - { - ch->dest = NULL; - } - else if (c == ch->root && GNUNET_MESH_LOCAL_CHANNEL_ID_SERV > chid) - { - ch->root = NULL; - } - else - { - LOG (GNUNET_ERROR_TYPE_ERROR, - " channel %X client %p (%p, %p)\n", - chid, c, ch->root, ch->dest); - GNUNET_break (0); - } - - t = ch->t; - channel_destroy (ch); - tunnel_destroy_if_empty (t); + GMCH_handle_local_destroy (ch, c); GNUNET_SERVER_receive_done (client, GNUNET_OK); return; @@ -512,7 +458,6 @@ handle_data (void *cls, struct GNUNET_SERVER_Client *client, struct GNUNET_MESH_LocalData *msg; struct MeshClient *c; struct MeshChannel *ch; - struct MeshChannelReliability *rel; MESH_ChannelNumber chid; size_t size; int fwd; @@ -551,30 +496,14 @@ handle_data (void *cls, struct GNUNET_SERVER_Client *client, return; } - rel = fwd ? ch->root_rel : ch->dest_rel; - rel->client_ready = GNUNET_NO; - - /* Ok, everything is correct, send the message. */ + if (GNUNET_OK != + GMCH_handle_local_data (ch, c, + (struct GNUNET_MessageHeader *)&msg[1], fwd)) { - struct GNUNET_MESH_Data *payload; - uint16_t p2p_size = sizeof(struct GNUNET_MESH_Data) + size; - unsigned char cbuf[p2p_size]; - - payload = (struct GNUNET_MESH_Data *) cbuf; - payload->mid = htonl (rel->mid_send); - rel->mid_send++; - memcpy (&payload[1], &msg[1], size); - payload->header.size = htons (p2p_size); - payload->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_DATA); - payload->chid = htonl (ch->gid); - LOG (GNUNET_ERROR_TYPE_DEBUG, " sending on channel...\n"); - send_prebuilt_message_channel (&payload->header, ch, fwd); - - if (GNUNET_YES == ch->reliable) - channel_save_copy (ch, &payload->header, fwd); + GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + return; } - if (tunnel_get_buffer (ch->t, fwd) > 0) - send_local_ack (ch, fwd); + LOG (GNUNET_ERROR_TYPE_DEBUG, "receive done OK\n"); GNUNET_SERVER_receive_done (client, GNUNET_OK); @@ -626,12 +555,12 @@ handle_ack (void *cls, struct GNUNET_SERVER_Client *client, return; } - /* If client is root, the ACK is going FWD, therefore this is "BCK". */ - /* If client is dest, the ACK is going BCK, therefore this is "FWD" */ + /* If client is root, the ACK is going FWD, therefore this is "BCK ACK". */ + /* If client is dest, the ACK is going BCK, therefore this is "FWD ACK" */ fwd = chid >= GNUNET_MESH_LOCAL_CHANNEL_ID_SERV; - GNUNET_SERVER_receive_done (client, GNUNET_OK); GMCH_handle_local_ack (ch, fwd); + GNUNET_SERVER_receive_done (client, GNUNET_OK); return; } @@ -797,6 +726,7 @@ static struct GNUNET_SERVER_MessageHandler client_handlers[] = { void GML_init (struct GNUNET_SERVER_Handle *handle) { + LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n"); server_handle = handle; GNUNET_SERVER_suspend (server_handle); ports = GNUNET_CONTAINER_multihashmap32_create (32); @@ -955,7 +885,7 @@ GML_client_get_by_port (uint32_t port) /** - * Deletes a tunnel from a client (either owner or destination). + * Deletes a channel from a client (either owner or destination). * * @param c Client whose tunnel to delete. * @param ch Channel which should be deleted.