dhcp-4.2.1-retransmission.patch 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. diff -up dhcp-4.2.1b1/client/dhc6.c.retransmission dhcp-4.2.1b1/client/dhc6.c
  2. --- dhcp-4.2.1b1/client/dhc6.c.retransmission 2011-01-28 08:40:56.000000000 +0100
  3. +++ dhcp-4.2.1b1/client/dhc6.c 2011-01-28 08:39:22.000000000 +0100
  4. @@ -361,7 +361,7 @@ dhc6_retrans_init(struct client_state *c
  5. static void
  6. dhc6_retrans_advance(struct client_state *client)
  7. {
  8. - struct timeval elapsed;
  9. + struct timeval elapsed, elapsed_after_RT;
  10. /* elapsed = cur - start */
  11. elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
  12. @@ -378,6 +378,8 @@ dhc6_retrans_advance(struct client_state
  13. elapsed.tv_sec += 1;
  14. elapsed.tv_usec -= 1000000;
  15. }
  16. + elapsed_after_RT.tv_sec = elapsed.tv_sec;
  17. + elapsed_after_RT.tv_usec = elapsed.tv_usec;
  18. /*
  19. * RT for each subsequent message transmission is based on the previous
  20. @@ -415,13 +417,10 @@ dhc6_retrans_advance(struct client_state
  21. elapsed.tv_usec -= 1000000;
  22. }
  23. if (elapsed.tv_sec >= client->MRD) {
  24. - /*
  25. - * wake at RT + cur = start + MRD
  26. - */
  27. - client->RT = client->MRD +
  28. - (client->start_time.tv_sec - cur_tv.tv_sec);
  29. - client->RT = client->RT * 100 +
  30. - (client->start_time.tv_usec - cur_tv.tv_usec) / 10000;
  31. + client->RT = client->MRD - elapsed_after_RT.tv_sec;
  32. + client->RT = client->RT * 100 - elapsed_after_RT.tv_usec / 10000;
  33. + if (client->RT < 0)
  34. + client->RT = 0;
  35. }
  36. client->txcount++;
  37. }
  38. @@ -1497,7 +1496,7 @@ check_timing6 (struct client_state *clie
  39. }
  40. /* Check if finished (-1 argument). */
  41. - if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
  42. + if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
  43. log_info("Max retransmission duration exceeded.");
  44. return(CHK_TIM_MRD_EXCEEDED);
  45. }