fec_manager.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /*
  2. * fec_manager.h
  3. *
  4. * Created on: Sep 27, 2017
  5. * Author: root
  6. */
  7. #ifndef FEC_MANAGER_H_
  8. #define FEC_MANAGER_H_
  9. #include "common.h"
  10. #include "log.h"
  11. #include "lib/rs.h"
  12. const int max_blob_packet_num=30000;//how many packet can be contain in a blob_t ,can be set very large
  13. const u32_t anti_replay_buff_size=30000;//can be set very large
  14. const int max_fec_packet_num=255;// this is the limitation of the rs lib
  15. extern u32_t fec_buff_num;
  16. /*begin for first time init or dynamic update*/
  17. extern int g_fec_data_num;
  18. extern int g_fec_redundant_num;
  19. extern int g_fec_mtu;
  20. extern int g_fec_queue_len;
  21. extern int g_fec_timeout; //8ms
  22. extern int g_fec_mode;
  23. extern int dynamic_update_fec;
  24. /*end for first time init or dynamic update*/
  25. const int anti_replay_timeout=60*1000;// 60s
  26. struct anti_replay_t
  27. {
  28. struct info_t
  29. {
  30. my_time_t my_time;
  31. int index;
  32. };
  33. u64_t replay_buffer[anti_replay_buff_size];
  34. unordered_map<u32_t,info_t> mp;
  35. int index;
  36. anti_replay_t()
  37. {
  38. clear();
  39. }
  40. int clear()
  41. {
  42. memset(replay_buffer,-1,sizeof(replay_buffer));
  43. mp.clear();
  44. mp.rehash(anti_replay_buff_size*3);
  45. index=0;
  46. return 0;
  47. }
  48. void set_invaild(u32_t seq)
  49. {
  50. if(is_vaild(seq)==0)
  51. {
  52. mylog(log_trace,"seq %u exist\n",seq);
  53. assert(mp.find(seq)!=mp.end());
  54. mp[seq].my_time=get_current_time_rough();
  55. return;
  56. //return 0;
  57. }
  58. if(replay_buffer[index]!=u64_t(i64_t(-1)))
  59. {
  60. assert(mp.find(replay_buffer[index])!=mp.end());
  61. mp.erase(replay_buffer[index]);
  62. }
  63. replay_buffer[index]=seq;
  64. assert(mp.find(seq)==mp.end());
  65. mp[seq].my_time=get_current_time_rough();
  66. mp[seq].index=index;
  67. index++;
  68. if(index==int(anti_replay_buff_size)) index=0;
  69. //return 1; //for complier check
  70. }
  71. int is_vaild(u32_t seq)
  72. {
  73. if(mp.find(seq)==mp.end()) return 1;
  74. if(get_current_time_rough()-mp[seq].my_time>anti_replay_timeout)
  75. {
  76. replay_buffer[mp[seq].index]=u64_t(i64_t(-1));
  77. mp.erase(seq);
  78. return 1;
  79. }
  80. return 0;
  81. }
  82. };
  83. struct blob_encode_t
  84. {
  85. char input_buf[(max_fec_packet_num+5)*buf_len];
  86. int current_len;
  87. int counter;
  88. char *output_buf[max_fec_packet_num+100];
  89. blob_encode_t();
  90. int clear();
  91. int get_num();
  92. int get_shard_len(int n);
  93. int get_shard_len(int n,int next_packet_len);
  94. int input(char *s,int len); //len=use len=0 for second and following packet
  95. int output(int n,char ** &s_arr,int & len);
  96. };
  97. struct blob_decode_t
  98. {
  99. char input_buf[(max_fec_packet_num+5)*buf_len];
  100. int current_len;
  101. int last_len;
  102. int counter;
  103. char *output_buf[max_blob_packet_num+100];
  104. int output_len[max_blob_packet_num+100];
  105. blob_decode_t();
  106. int clear();
  107. int input(char *input,int len);
  108. int output(int &n,char ** &output,int *&len_arr);
  109. };
  110. class fec_encode_manager_t
  111. {
  112. private:
  113. u32_t seq;
  114. int fec_mode;
  115. int fec_data_num,fec_redundant_num;
  116. int fec_mtu;
  117. int fec_queue_len;
  118. int fec_timeout;
  119. my_time_t first_packet_time;
  120. my_time_t first_packet_time_for_output;
  121. blob_encode_t blob_encode;
  122. char input_buf[max_fec_packet_num+5][buf_len];
  123. int input_len[max_fec_packet_num+100];
  124. char *output_buf[max_fec_packet_num+100];
  125. int output_len[max_fec_packet_num+100];
  126. int counter;
  127. //int timer_fd;
  128. //u64_t timer_fd64;
  129. int ready_for_output;
  130. u32_t output_n;
  131. int append(char *s,int len);
  132. ev_timer timer;
  133. struct ev_loop *loop=0;
  134. void (*cb) (struct ev_loop *loop, struct ev_timer *watcher, int revents)=0;
  135. public:
  136. fec_encode_manager_t();
  137. ~fec_encode_manager_t();
  138. void set_data(void * data)
  139. {
  140. timer.data=data;
  141. }
  142. void set_loop_and_cb(struct ev_loop *loop,void (*cb) (struct ev_loop *loop, struct ev_timer *watcher, int revents))
  143. {
  144. this->loop=loop;
  145. this->cb=cb;
  146. ev_init(&timer,cb);
  147. }
  148. int clear_data()
  149. {
  150. counter=0;
  151. blob_encode.clear();
  152. ready_for_output=0;
  153. seq=(u32_t)get_fake_random_number(); //TODO temp solution for a bug.
  154. if(loop)
  155. {
  156. ev_timer_stop(loop,&timer);
  157. }
  158. return 0;
  159. }
  160. int clear_all()
  161. {
  162. //itimerspec zero_its;
  163. //memset(&zero_its, 0, sizeof(zero_its));
  164. //timerfd_settime(timer_fd, TFD_TIMER_ABSTIME, &zero_its, 0);
  165. if(loop)
  166. {
  167. ev_timer_stop(loop,&timer);
  168. loop=0;
  169. cb=0;
  170. }
  171. clear_data();
  172. return 0;
  173. }
  174. my_time_t get_first_packet_time()
  175. {
  176. return first_packet_time_for_output;
  177. }
  178. int get_pending_time()
  179. {
  180. return fec_timeout;
  181. }
  182. int get_type()
  183. {
  184. return fec_mode;
  185. }
  186. //u64_t get_timer_fd64();
  187. int reset_fec_parameter(int data_num,int redundant_num,int mtu,int pending_num,int pending_time,int type);
  188. int input(char *s,int len/*,int &is_first_packet*/);
  189. int output(int &n,char ** &s_arr,int *&len);
  190. };
  191. struct fec_data_t
  192. {
  193. int used;
  194. u32_t seq;
  195. int type;
  196. int data_num;
  197. int redundant_num;
  198. int idx;
  199. char buf[buf_len];
  200. int len;
  201. };
  202. struct fec_group_t
  203. {
  204. int type=-1;
  205. int data_num=-1;
  206. int redundant_num=-1;
  207. int len=-1;
  208. //int data_counter=0;
  209. map<int,int> group_mp;
  210. };
  211. class fec_decode_manager_t
  212. {
  213. anti_replay_t anti_replay;
  214. fec_data_t *fec_data;
  215. unordered_map<u32_t, fec_group_t> mp;
  216. blob_decode_t blob_decode;
  217. int index;
  218. int output_n;
  219. char ** output_s_arr;
  220. int * output_len_arr;
  221. int ready_for_output;
  222. char *output_s_arr_buf[max_fec_packet_num+100];//only for type=1,for type=0 the buf inside blot_t is used
  223. int output_len_arr_buf[max_fec_packet_num+100];//same
  224. public:
  225. fec_decode_manager_t()
  226. {
  227. fec_data=new fec_data_t[fec_buff_num+5];
  228. clear();
  229. }
  230. fec_decode_manager_t(const fec_decode_manager_t &b)
  231. {
  232. assert(0==1);//not allowed to copy
  233. }
  234. ~fec_decode_manager_t()
  235. {
  236. delete fec_data;
  237. }
  238. int clear()
  239. {
  240. anti_replay.clear();
  241. mp.clear();
  242. mp.rehash(fec_buff_num*3);
  243. for(int i=0;i<(int)fec_buff_num;i++)
  244. fec_data[i].used=0;
  245. ready_for_output=0;
  246. index=0;
  247. return 0;
  248. }
  249. //int re_init();
  250. int input(char *s,int len);
  251. int output(int &n,char ** &s_arr,int* &len_arr);
  252. };
  253. #endif /* FEC_MANAGER_H_ */