aboutsummaryrefslogtreecommitdiff
path: root/src/mesh/gnunet-service-mesh.c
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2012-11-05 17:28:17 +0000
committerBart Polot <bart@net.in.tum.de>2012-11-05 17:28:17 +0000
commit4a9be5d0f9f2bc26d0e8150d042cbc6552084b8a (patch)
tree00394feea19c1011ad5336ad80e61dda51112cc0 /src/mesh/gnunet-service-mesh.c
parentdaf4b7a9199b41f6d3ae69375bfd89448403290b (diff)
downloadgnunet-4a9be5d0f9f2bc26d0e8150d042cbc6552084b8a.tar.gz
gnunet-4a9be5d0f9f2bc26d0e8150d042cbc6552084b8a.zip
- allow force ACK to enable polling
Diffstat (limited to 'src/mesh/gnunet-service-mesh.c')
-rw-r--r--src/mesh/gnunet-service-mesh.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index 2b313e84b..1035445b3 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -351,12 +351,17 @@ struct MeshTunnel
351 */ 351 */
352 uint32_t bck_pid; 352 uint32_t bck_pid;
353 353
354 /** 354 /**
355 * SKIP value for this tunnel. 355 * SKIP value for this tunnel.
356 */ 356 */
357 uint32_t skip; 357 uint32_t skip;
358 358
359 /** 359 /**
360 * Force sending ACK? Flag to allow duplicate ACK on POLL.
361 */
362 int force_ack;
363
364 /**
360 * MeshTunnelChildInfo of all children, indexed by GNUNET_PEER_Id. 365 * MeshTunnelChildInfo of all children, indexed by GNUNET_PEER_Id.
361 * Contains the Flow Control info: FWD ACK value received, 366 * Contains the Flow Control info: FWD ACK value received,
362 * last BCK ACK sent, PID and SKIP values. 367 * last BCK ACK sent, PID and SKIP values.
@@ -2969,7 +2974,6 @@ tunnel_poll (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2969 struct GNUNET_PeerIdentity id; 2974 struct GNUNET_PeerIdentity id;
2970 struct MeshTunnel *t; 2975 struct MeshTunnel *t;
2971 2976
2972 return; // FIXME fc activate
2973 cinfo->fc_poll = GNUNET_SCHEDULER_NO_TASK; 2977 cinfo->fc_poll = GNUNET_SCHEDULER_NO_TASK;
2974 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 2978 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
2975 { 2979 {
@@ -4007,13 +4011,17 @@ tunnel_send_fwd_ack (struct MeshTunnel *t, uint16_t type)
4007 case GNUNET_MESSAGE_TYPE_MESH_ACK: 4011 case GNUNET_MESSAGE_TYPE_MESH_ACK:
4008 case GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK: 4012 case GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK:
4009 break; 4013 break;
4014 case GNUNET_MESSAGE_TYPE_MESH_POLL:
4015 t->force_ack = GNUNET_YES;
4016 break;
4010 default: 4017 default:
4011 GNUNET_break (0); 4018 GNUNET_break (0);
4012 } 4019 }
4013 4020
4014 /* Check if we need no retransmit the ACK */ 4021 /* Check if we need to transmit the ACK */
4015 if (t->fwd_queue_max > t->fwd_queue_n * 4 && 4022 if (t->fwd_queue_max > t->fwd_queue_n * 4 &&
4016 GMC_is_pid_bigger(t->last_fwd_ack, t->fwd_pid)) 4023 GMC_is_pid_bigger(t->last_fwd_ack, t->fwd_pid) &&
4024 GNUNET_NO == t->force_ack)
4017 { 4025 {
4018 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending ACK, buffer free\n"); 4026 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending ACK, buffer free\n");
4019 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4027 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -4029,7 +4037,7 @@ tunnel_send_fwd_ack (struct MeshTunnel *t, uint16_t type)
4029 ack = tunnel_get_fwd_ack (t); 4037 ack = tunnel_get_fwd_ack (t);
4030 4038
4031 /* If speed_min and not all children have ack'd, dont send yet */ 4039 /* If speed_min and not all children have ack'd, dont send yet */
4032 if (ack == t->last_fwd_ack) 4040 if (ack == t->last_fwd_ack && GNUNET_NO == t->force_ack)
4033 { 4041 {
4034 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending FWD ACK, not ready\n"); 4042 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending FWD ACK, not ready\n");
4035 return; 4043 return;
@@ -4039,6 +4047,7 @@ tunnel_send_fwd_ack (struct MeshTunnel *t, uint16_t type)
4039 GNUNET_PEER_resolve (tree_get_predecessor (t->tree), &id); 4047 GNUNET_PEER_resolve (tree_get_predecessor (t->tree), &id);
4040 send_ack (t, &id, ack); 4048 send_ack (t, &id, ack);
4041 debug_fwd_ack++; 4049 debug_fwd_ack++;
4050 t->force_ack = GNUNET_NO;
4042} 4051}
4043 4052
4044 4053
@@ -4062,9 +4071,8 @@ tunnel_send_child_bck_ack (void *cls,
4062 cinfo = tunnel_get_neighbor_fc (t, &peer); 4071 cinfo = tunnel_get_neighbor_fc (t, &peer);
4063 ack = cinfo->bck_pid + t->bck_queue_max - t->bck_queue_n; 4072 ack = cinfo->bck_pid + t->bck_queue_max - t->bck_queue_n;
4064 4073
4065 if (cinfo->bck_ack == ack) 4074 if (cinfo->bck_ack == ack && GNUNET_NO == t->force_ack)
4066 { 4075 {
4067 // FIXME fc allow force on poll
4068 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4076 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4069 " Not sending ACK, not needed\n"); 4077 " Not sending ACK, not needed\n");
4070 return; 4078 return;
@@ -4168,7 +4176,9 @@ tunnel_send_bck_ack (struct MeshTunnel *t, uint16_t type)
4168 break; 4176 break;
4169 case GNUNET_MESSAGE_TYPE_MESH_ACK: 4177 case GNUNET_MESSAGE_TYPE_MESH_ACK:
4170 case GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK: 4178 case GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK:
4179 break;
4171 case GNUNET_MESSAGE_TYPE_MESH_POLL: 4180 case GNUNET_MESSAGE_TYPE_MESH_POLL:
4181 t->force_ack = GNUNET_YES;
4172 break; 4182 break;
4173 default: 4183 default:
4174 GNUNET_break (0); 4184 GNUNET_break (0);
@@ -4176,6 +4186,7 @@ tunnel_send_bck_ack (struct MeshTunnel *t, uint16_t type)
4176 4186
4177 tunnel_send_clients_bck_ack (t); 4187 tunnel_send_clients_bck_ack (t);
4178 tree_iterate_children (t->tree, &tunnel_send_child_bck_ack, t); 4188 tree_iterate_children (t->tree, &tunnel_send_child_bck_ack, t);
4189 t->force_ack = GNUNET_NO;
4179} 4190}
4180 4191
4181 4192