aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authort3sserakt <t3ss@posteo.de>2024-01-25 09:07:50 +0100
committert3sserakt <t3ss@posteo.de>2024-01-25 09:31:34 +0100
commit94caa7dae192871e512d7162010779936abfc26a (patch)
treee4b6284844681137d9666211b12384b4f8bf6ad1 /src
parent5f566289dc905c68309a07e990164049d36d0a9b (diff)
downloadgnunet-94caa7dae192871e512d7162010779936abfc26a.tar.gz
gnunet-94caa7dae192871e512d7162010779936abfc26a.zip
Fixed bug in resend logic for fragments, especially for DV boxes.
Diffstat (limited to 'src')
-rw-r--r--src/service/transport/gnunet-service-transport.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/service/transport/gnunet-service-transport.c b/src/service/transport/gnunet-service-transport.c
index bc7364838..f37abaae0 100644
--- a/src/service/transport/gnunet-service-transport.c
+++ b/src/service/transport/gnunet-service-transport.c
@@ -9910,17 +9910,20 @@ static unsigned int
9910check_next_attempt_tree (struct PendingMessage *pm) 9910check_next_attempt_tree (struct PendingMessage *pm)
9911{ 9911{
9912 struct PendingMessage *pos; 9912 struct PendingMessage *pos;
9913 enum GNUNET_GenericReturnValue frags_in_flight_round;
9913 9914
9914 pos = pm->head_frag; 9915 pos = pm->head_frag;
9915 while (NULL != pos) 9916 while (NULL != pos)
9916 { 9917 {
9917 if (pos->frags_in_flight_round != pm->frags_in_flight_round || 9918 if (pos->frags_in_flight_round == pm->frags_in_flight_round ||
9918 GNUNET_YES == check_next_attempt_tree (pos)) 9919 GNUNET_YES == check_next_attempt_tree (pos))
9919 return GNUNET_YES; 9920 frags_in_flight_round = GNUNET_NO;
9921 else
9922 frags_in_flight_round = GNUNET_YES;
9920 pos = pos->next_frag; 9923 pos = pos->next_frag;
9921 } 9924 }
9922 9925
9923 return GNUNET_NO; 9926 return frags_in_flight_round;
9924} 9927}
9925 9928
9926 9929
@@ -9965,9 +9968,14 @@ update_pm_next_attempt (struct PendingMessage *pm,
9965 while (NULL != root->frag_parent && PMT_DV_BOX != root->pmt) 9968 while (NULL != root->frag_parent && PMT_DV_BOX != root->pmt)
9966 root = root->frag_parent; 9969 root = root->frag_parent;
9967 9970
9971 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
9972 "frag_count %u\n",
9973 root->frag_count);
9974
9968 if (GNUNET_NO == root->frags_in_flight) 9975 if (GNUNET_NO == root->frags_in_flight)
9969 { 9976 {
9970 root->next_attempt = next_attempt; 9977 root->next_attempt = next_attempt;
9978 root->frags_in_flight_round++;
9971 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 9979 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
9972 "Next attempt for fragmented message <%" PRIu64 "> (<%" PRIu64 9980 "Next attempt for fragmented message <%" PRIu64 "> (<%" PRIu64
9973 ">)set to %" PRIu64 "\n", 9981 ">)set to %" PRIu64 "\n",
@@ -9991,6 +9999,8 @@ update_pm_next_attempt (struct PendingMessage *pm,
9991 ", reorder root! Next attempt is %" PRIu64 "\n", 9999 ", reorder root! Next attempt is %" PRIu64 "\n",
9992 root->logging_uuid, 10000 root->logging_uuid,
9993 root->next_attempt.abs_value_us); 10001 root->next_attempt.abs_value_us);
10002 if (PMT_DV_BOX == root->pmt)
10003 root = root->frag_parent;
9994 reorder_root_pm (root, root->next_attempt); 10004 reorder_root_pm (root, root->next_attempt);
9995 root->frag_count = 0; 10005 root->frag_count = 0;
9996 root->next_attempt = GNUNET_TIME_UNIT_ZERO_ABS; 10006 root->next_attempt = GNUNET_TIME_UNIT_ZERO_ABS;
@@ -10005,6 +10015,10 @@ update_pm_next_attempt (struct PendingMessage *pm,
10005 GNUNET_TIME_absolute_get_remaining (root->next_attempt); 10015 GNUNET_TIME_absolute_get_remaining (root->next_attempt);
10006 struct GNUNET_TIME_Relative plus = GNUNET_TIME_absolute_get_remaining ( 10016 struct GNUNET_TIME_Relative plus = GNUNET_TIME_absolute_get_remaining (
10007 next_attempt); 10017 next_attempt);
10018
10019 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
10020 "frag_count %u after factor\n",
10021 root->frag_count);
10008 s1 = GNUNET_TIME_relative_multiply_double (plus_mean, 10022 s1 = GNUNET_TIME_relative_multiply_double (plus_mean,
10009 factor); 10023 factor);
10010 s2 = GNUNET_TIME_relative_divide (plus, 10024 s2 = GNUNET_TIME_relative_divide (plus,