cc_feedback_adapter.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <stdlib.h>
  2. #include "../estimator/cc_feedback_adapter.h"
  3. #include "../cc/razor_log.h"
  4. #define k_history_cache_ms 60000
  5. void cc_feedback_adapter_init(feedback_adapter_t* adapter)
  6. {
  7. int i;
  8. for (i = 0; i < FEEDBACK_RTT_WIN_SIZE; ++i){
  9. adapter->rtts[i] = -1;
  10. }
  11. adapter->min_feedback_rtt = 10;
  12. adapter->num = 0;
  13. adapter->index = 0;
  14. adapter->hist = sender_history_create((uint32_t)k_history_cache_ms);
  15. }
  16. void cc_feedback_adapter_destroy(feedback_adapter_t* adapter)
  17. {
  18. if (adapter != NULL && adapter->hist != NULL){
  19. sender_history_destroy(adapter->hist);
  20. adapter->hist = NULL;
  21. }
  22. }
  23. void cc_feedback_add_packet(feedback_adapter_t* adapter, uint16_t seq, size_t size)
  24. {
  25. packet_feedback_t packet;
  26. packet.arrival_ts = -1;
  27. packet.create_ts = packet.send_ts = (int64_t)GET_SYS_MS();
  28. packet.payload_size = size;
  29. packet.sequence_number = seq;
  30. sender_history_add(adapter->hist, &packet);
  31. }
  32. static int feedback_packet_comp(const void* arg1, const void* arg2)
  33. {
  34. packet_feedback_t *p1, *p2;
  35. p1 = (packet_feedback_t*)arg1;
  36. p2 = (packet_feedback_t*)arg2;
  37. if (p1->arrival_ts < p2->arrival_ts)
  38. return -1;
  39. else if (p1->arrival_ts > p2->arrival_ts)
  40. return 1;
  41. else if (p1->send_ts < p2->send_ts)
  42. return -1;
  43. else
  44. return 1;
  45. }
  46. static inline void feedback_qsort(feedback_adapter_t* adapter)
  47. {
  48. qsort(adapter->packets, adapter->num, sizeof(packet_feedback_t), feedback_packet_comp);
  49. }
  50. int cc_feedback_on_feedback(feedback_adapter_t* adapter, feedback_msg_t* msg)
  51. {
  52. int32_t i, feedback_rtt;
  53. int64_t now_ts;
  54. now_ts = (int64_t)GET_SYS_MS();
  55. feedback_rtt = -1;
  56. adapter->num = 0;
  57. for (i = 0; i < msg->samples_num; i++){
  58. /*根据反馈的SEQ获取对应的报文发送信息,计算反馈RTT,更新报文到达时刻*/
  59. if (sender_history_get(adapter->hist, msg->samples[i].seq, &adapter->packets[adapter->num], 1) == 0){
  60. /*计算反馈RTT*/
  61. if (adapter->packets[adapter->num].send_ts > 0){
  62. feedback_rtt = SU_MAX(now_ts - adapter->packets[adapter->num].send_ts, feedback_rtt);
  63. adapter->rtts[adapter->index % FEEDBACK_RTT_WIN_SIZE] = feedback_rtt;
  64. adapter->index++;
  65. }
  66. /*更新到达的值*/
  67. adapter->packets[adapter->num].arrival_ts = msg->samples[i].ts;
  68. adapter->num++;
  69. }
  70. }
  71. /*更新报文与反馈的rtt最小值*/
  72. if (feedback_rtt > 0){
  73. adapter->min_feedback_rtt = adapter->rtts[0];
  74. for (i = 1; i < FEEDBACK_RTT_WIN_SIZE; i++){
  75. if (adapter->min_feedback_rtt > adapter->rtts[i] && adapter->rtts[i] > 0)
  76. adapter->min_feedback_rtt = adapter->rtts[i];
  77. }
  78. }
  79. /*进行按到达时间的先后顺序进行排序*/
  80. feedback_qsort(adapter);
  81. return adapter->num;
  82. }