diff options
author | Bart Polot <bart@net.in.tum.de> | 2013-10-10 18:23:48 +0000 |
---|---|---|
committer | Bart Polot <bart@net.in.tum.de> | 2013-10-10 18:23:48 +0000 |
commit | 990ca23b4da56d67f093d0ad967731998d9851fb (patch) | |
tree | 745f206b33c9566964259192d63185141c415b81 /src/mesh | |
parent | 0b2836dbc4f3da21c9321caefbaa229500c75adf (diff) | |
download | gnunet-990ca23b4da56d67f093d0ad967731998d9851fb.tar.gz gnunet-990ca23b4da56d67f093d0ad967731998d9851fb.zip |
- fixes in local
Diffstat (limited to 'src/mesh')
-rw-r--r-- | src/mesh/gnunet-service-mesh_channel.c | 7 | ||||
-rw-r--r-- | src/mesh/gnunet-service-mesh_local.c | 61 | ||||
-rw-r--r-- | src/mesh/gnunet-service-mesh_local.h | 10 |
3 files changed, 37 insertions, 41 deletions
diff --git a/src/mesh/gnunet-service-mesh_channel.c b/src/mesh/gnunet-service-mesh_channel.c index d2935ec4e..3607ae56c 100644 --- a/src/mesh/gnunet-service-mesh_channel.c +++ b/src/mesh/gnunet-service-mesh_channel.c | |||
@@ -1380,7 +1380,12 @@ GMCH_handle_create (const struct GNUNET_MESH_ChannelCreate *msg, | |||
1380 | 1380 | ||
1381 | GMCH_send_create (ch); | 1381 | GMCH_send_create (ch); |
1382 | GMCH_send_ack (ch, fwd); | 1382 | GMCH_send_ack (ch, fwd); |
1383 | GML_send_ack (ch, !fwd); | 1383 | |
1384 | if (GNUNET_NO == ch->dest_rel->client_ready) | ||
1385 | { | ||
1386 | GML_send_ack (ch->dest, ch->lid_dest); | ||
1387 | ch->dest_rel->client_ready = GNUNET_YES; | ||
1388 | } | ||
1384 | 1389 | ||
1385 | return ch; | 1390 | return ch; |
1386 | } | 1391 | } |
diff --git a/src/mesh/gnunet-service-mesh_local.c b/src/mesh/gnunet-service-mesh_local.c index a1ff2b12c..2d6214d3e 100644 --- a/src/mesh/gnunet-service-mesh_local.c +++ b/src/mesh/gnunet-service-mesh_local.c | |||
@@ -913,10 +913,10 @@ GML_channel_remove (struct MeshClient *client, | |||
913 | uint32_t chid, | 913 | uint32_t chid, |
914 | struct MeshChannel *ch) | 914 | struct MeshChannel *ch) |
915 | { | 915 | { |
916 | if (chid >= GNUNET_MESH_LOCAL_CHANNEL_ID_SERV) | 916 | if (GNUNET_MESH_LOCAL_CHANNEL_ID_SERV <= chid) |
917 | GNUNET_CONTAINER_multihashmap32_remove (c->incoming_channels, chid, ch); | 917 | GNUNET_CONTAINER_multihashmap32_remove (client->incoming_channels, chid, ch); |
918 | else if (chid >= GNUNET_MESH_LOCAL_CHANNEL_ID_CLI) | 918 | else if (GNUNET_MESH_LOCAL_CHANNEL_ID_CLI <= chid) |
919 | GNUNET_CONTAINER_multihashmap32_remove (c->own_channels, chid, ch); | 919 | GNUNET_CONTAINER_multihashmap32_remove (client->own_channels, chid, ch); |
920 | else | 920 | else |
921 | GNUNET_break (0); | 921 | GNUNET_break (0); |
922 | } | 922 | } |
@@ -978,25 +978,32 @@ GML_client_get_by_port (uint32_t port) | |||
978 | * | 978 | * |
979 | * @param c Client whose tunnel to delete. | 979 | * @param c Client whose tunnel to delete. |
980 | * @param ch Channel which should be deleted. | 980 | * @param ch Channel which should be deleted. |
981 | * @param id Channel ID. | ||
981 | */ | 982 | */ |
982 | void | 983 | void |
983 | GML_client_delete_channel (struct MeshClient *c, struct MeshChannel *ch) | 984 | GML_client_delete_channel (struct MeshClient *c, |
985 | struct MeshChannel *ch, | ||
986 | MESH_ChannelNumber id) | ||
984 | { | 987 | { |
985 | int res; | 988 | int res; |
986 | 989 | ||
987 | if (c == ch->root) | 990 | if (GNUNET_MESH_LOCAL_CHANNEL_ID_SERV <= id) |
988 | { | 991 | { |
989 | res = GNUNET_CONTAINER_multihashmap32_remove (c->own_channels, | 992 | res = GNUNET_CONTAINER_multihashmap32_remove (c->incoming_channels, |
990 | ch->lid_root, ch); | 993 | id, ch); |
991 | if (GNUNET_YES != res) | 994 | if (GNUNET_YES != res) |
992 | LOG (GNUNET_ERROR_TYPE_DEBUG, "client_delete_channel owner KO\n"); | 995 | LOG (GNUNET_ERROR_TYPE_DEBUG, "client_delete_channel dest KO\n"); |
993 | } | 996 | } |
994 | if (c == ch->dest) | 997 | else if (GNUNET_MESH_LOCAL_CHANNEL_ID_CLI <= id) |
995 | { | 998 | { |
996 | res = GNUNET_CONTAINER_multihashmap32_remove (c->incoming_channels, | 999 | res = GNUNET_CONTAINER_multihashmap32_remove (c->own_channels, |
997 | ch->lid_dest, ch); | 1000 | id, ch); |
998 | if (GNUNET_YES != res) | 1001 | if (GNUNET_YES != res) |
999 | LOG (GNUNET_ERROR_TYPE_DEBUG, "client_delete_tunnel client KO\n"); | 1002 | LOG (GNUNET_ERROR_TYPE_DEBUG, "client_delete_tunnel root KO\n"); |
1003 | } | ||
1004 | else | ||
1005 | { | ||
1006 | GNUNET_break (0); | ||
1000 | } | 1007 | } |
1001 | } | 1008 | } |
1002 | 1009 | ||
@@ -1005,39 +1012,21 @@ GML_client_delete_channel (struct MeshClient *c, struct MeshChannel *ch) | |||
1005 | * | 1012 | * |
1006 | * If the client was already allowed to send data, do nothing. | 1013 | * If the client was already allowed to send data, do nothing. |
1007 | * | 1014 | * |
1008 | * @param ch Channel on which to send the ACK. | ||
1009 | * @param c Client to whom send the ACK. | 1015 | * @param c Client to whom send the ACK. |
1010 | * @param fwd Set to GNUNET_YES for FWD ACK (dest->root) | 1016 | * @param id Channel ID to use |
1011 | */ | 1017 | */ |
1012 | void | 1018 | void |
1013 | GML_send_ack (struct MeshChannel *ch, int fwd) | 1019 | GML_send_ack (struct MeshClient *c, MESH_ChannelNumber id) |
1014 | { | 1020 | { |
1015 | struct GNUNET_MESH_LocalAck msg; | 1021 | struct GNUNET_MESH_LocalAck msg; |
1016 | struct MeshChannelReliability *rel; | ||
1017 | struct MeshClient *c; | ||
1018 | |||
1019 | c = fwd ? ch->root : ch->dest; | ||
1020 | rel = fwd ? ch->root_rel : ch->dest_rel; | ||
1021 | |||
1022 | if (GNUNET_YES == rel->client_ready) | ||
1023 | return; /* don't send double ACKs to client */ | ||
1024 | |||
1025 | rel->client_ready = GNUNET_YES; | ||
1026 | 1022 | ||
1027 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1023 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
1028 | "send local %s ack on %s:%X towards %p\n", | 1024 | "send local %s ack on %X towards %p\n", |
1029 | fwd ? "FWD" : "BCK", peer2s (ch->t->peer), ch->gid, c); | 1025 | id < GNUNET_MESH_LOCAL_CHANNEL_ID_SERV ? "FWD" : "BCK", id, c); |
1030 | 1026 | ||
1031 | if (NULL == c | ||
1032 | || ( fwd && (0 == ch->lid_root || c != ch->root)) | ||
1033 | || (!fwd && (0 == ch->lid_dest || c != ch->dest)) ) | ||
1034 | { | ||
1035 | GNUNET_break (0); | ||
1036 | return; | ||
1037 | } | ||
1038 | msg.header.size = htons (sizeof (msg)); | 1027 | msg.header.size = htons (sizeof (msg)); |
1039 | msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK); | 1028 | msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK); |
1040 | msg.channel_id = htonl (fwd ? ch->lid_root : ch->lid_dest); | 1029 | msg.channel_id = htonl (id); |
1041 | GNUNET_SERVER_notification_context_unicast (nc, | 1030 | GNUNET_SERVER_notification_context_unicast (nc, |
1042 | c->handle, | 1031 | c->handle, |
1043 | &msg.header, | 1032 | &msg.header, |
diff --git a/src/mesh/gnunet-service-mesh_local.h b/src/mesh/gnunet-service-mesh_local.h index e91165dec..6b126a2f7 100644 --- a/src/mesh/gnunet-service-mesh_local.h +++ b/src/mesh/gnunet-service-mesh_local.h | |||
@@ -141,21 +141,23 @@ GML_client_get_by_port (uint32_t port); | |||
141 | * | 141 | * |
142 | * @param c Client whose tunnel to delete. | 142 | * @param c Client whose tunnel to delete. |
143 | * @param ch Channel which should be deleted. | 143 | * @param ch Channel which should be deleted. |
144 | * @param id Channel ID. | ||
144 | */ | 145 | */ |
145 | void | 146 | void |
146 | GML_client_delete_channel (struct MeshClient *c, struct MeshChannel *ch); | 147 | GML_client_delete_channel (struct MeshClient *c, |
148 | struct MeshChannel *ch, | ||
149 | MESH_ChannelNumber id); | ||
147 | 150 | ||
148 | /** | 151 | /** |
149 | * Build a local ACK message and send it to a local client, if needed. | 152 | * Build a local ACK message and send it to a local client, if needed. |
150 | * | 153 | * |
151 | * If the client was already allowed to send data, do nothing. | 154 | * If the client was already allowed to send data, do nothing. |
152 | * | 155 | * |
153 | * @param ch Channel on which to send the ACK. | ||
154 | * @param c Client to whom send the ACK. | 156 | * @param c Client to whom send the ACK. |
155 | * @param fwd Set to GNUNET_YES for FWD ACK (dest->root) | 157 | * @param id Channel ID to use |
156 | */ | 158 | */ |
157 | void | 159 | void |
158 | GML_send_ack (struct MeshChannel *ch, int fwd); | 160 | GML_send_ack (struct MeshClient *c, MESH_ChannelNumber id); |
159 | 161 | ||
160 | /** | 162 | /** |
161 | * Notify the appropriate client that a new incoming channel was created. | 163 | * Notify the appropriate client that a new incoming channel was created. |