浏览代码

add expire time for anti_replay

root 7 年之前
父节点
当前提交
b00d8e6927
共有 3 个文件被更改,包括 34 次插入8 次删除
  1. 5 0
      common.cpp
  2. 1 0
      common.h
  3. 28 8
      fec_manager.h

+ 5 - 0
common.cpp

@@ -211,6 +211,11 @@ u64_t get_current_time()//ms
 	return (u64_t)(ev_time()*1000);
 }
 
+u64_t get_current_time_rough()//ms
+{
+	return (u64_t)(ev_now(ev_default_loop(0))*1000);
+}
+
 u64_t get_current_time_us()
 {
 	//timespec tmp_time;

+ 1 - 0
common.h

@@ -220,6 +220,7 @@ struct pseudo_header {
 };
 
 u64_t get_current_time();
+u64_t get_current_time_rough();
 u64_t get_current_time_us();
 u64_t pack_u64(u32_t a,u32_t b);
 

+ 28 - 8
fec_manager.h

@@ -29,12 +29,19 @@ extern int g_fec_mode;
 extern int dynamic_update_fec;
 /*end for first time init or dynamic update*/
 
+const int anti_replay_timeout=60*1000;// 60s
 
 struct anti_replay_t
 {
 
+	struct info_t
+	{
+		my_time_t my_time;
+		int index;
+	};
+
 	u64_t replay_buffer[anti_replay_buff_size];
-	unordered_set<u32_t> st;
+	unordered_map<u32_t,info_t> mp;
 	int index;
 	anti_replay_t()
 	{
@@ -43,34 +50,47 @@ struct anti_replay_t
 	int clear()
 	{
 		memset(replay_buffer,-1,sizeof(replay_buffer));
-		st.clear();
-		st.rehash(anti_replay_buff_size*3);
+		mp.clear();
+		mp.rehash(anti_replay_buff_size*3);
 		index=0;
 		return 0;
 	}
 	void set_invaild(u32_t seq)
 	{
 
-		if(st.find(seq)!=st.end() )
+		if(is_vaild(seq)==0)
 		{
 			mylog(log_trace,"seq %u exist\n",seq);
+			assert(mp.find(seq)!=mp.end());
+			mp[seq].my_time=get_current_time_rough();
 			return;
 			//return 0;
 		}
 		if(replay_buffer[index]!=u64_t(i64_t(-1)))
 		{
-			assert(st.find(replay_buffer[index])!=st.end());
-			st.erase(replay_buffer[index]);
+			assert(mp.find(replay_buffer[index])!=mp.end());
+			mp.erase(replay_buffer[index]);
 		}
 		replay_buffer[index]=seq;
-		st.insert(seq);
+		assert(mp.find(seq)==mp.end());
+		mp[seq].my_time=get_current_time_rough();
+		mp[seq].index=index;
 		index++;
 		if(index==int(anti_replay_buff_size)) index=0;
 		//return 1; //for complier check
 	}
 	int is_vaild(u32_t seq)
 	{
-		return st.find(seq)==st.end();
+		if(mp.find(seq)==mp.end()) return 1;
+		
+		if(get_current_time_rough()-mp[seq].my_time>anti_replay_timeout)
+		{
+			replay_buffer[mp[seq].index]=u64_t(i64_t(-1));
+			mp.erase(seq);
+			return 1;
+		}
+
+		return 0;
 	}
 };