mirror of
				https://github.com/wangyu-/UDPspeeder.git
				synced 2025-11-04 03:45:37 +08:00 
			
		
		
		
	it works again
This commit is contained in:
		
							
								
								
									
										106
									
								
								fec_manager.cpp
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								fec_manager.cpp
									
									
									
									
									
								
							@@ -189,6 +189,7 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
 | 
			
		||||
{
 | 
			
		||||
	int about_to_fec=0;
 | 
			
		||||
	int delayed_append=0;
 | 
			
		||||
	//int counter_back=counter;
 | 
			
		||||
	if(type==0&& s!=0 &&counter==0&&blob_encode.get_shard_len(fec_data_num,len)>=fec_mtu)
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_warn,"message too long len=%d,ignored\n",len);
 | 
			
		||||
@@ -302,6 +303,9 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
 | 
			
		||||
 | 
			
		||||
		mylog(log_info,"!!! s= %d\n");
 | 
			
		||||
 | 
			
		||||
    	ready_for_output=1;
 | 
			
		||||
    	seq++;
 | 
			
		||||
    	counter=0;
 | 
			
		||||
    	output_n=actual_data_num+actual_redundant_num;
 | 
			
		||||
    	blob_encode.clear();
 | 
			
		||||
 | 
			
		||||
@@ -309,19 +313,18 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
 | 
			
		||||
		memset(&its,0,sizeof(its));
 | 
			
		||||
		timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
 | 
			
		||||
 | 
			
		||||
    	if(encode_fast_send&&s!=0&&type==1)
 | 
			
		||||
    	if(encode_fast_send&&type==1)
 | 
			
		||||
    	{
 | 
			
		||||
			int packet_to_send[max_fec_packet_num+5]={0};
 | 
			
		||||
			int packet_to_send_counter=0;
 | 
			
		||||
 | 
			
		||||
			assert(counter!=0);
 | 
			
		||||
			//assert(counter!=0);
 | 
			
		||||
			if(s!=0)
 | 
			
		||||
				packet_to_send[packet_to_send_counter++]=counter-1;
 | 
			
		||||
				packet_to_send[packet_to_send_counter++]=actual_data_num-1;
 | 
			
		||||
			for(int i=actual_data_num;i<actual_data_num+actual_redundant_num;i++)
 | 
			
		||||
			{
 | 
			
		||||
				{
 | 
			
		||||
 | 
			
		||||
					packet_to_send[packet_to_send_counter++]=i;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			output_n=packet_to_send_counter;//re write
 | 
			
		||||
			for(int i=0;i<packet_to_send_counter;i++)
 | 
			
		||||
@@ -331,11 +334,6 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
    	}
 | 
			
		||||
 | 
			
		||||
    	ready_for_output=1;
 | 
			
		||||
    	seq++;
 | 
			
		||||
    	counter=0;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
@@ -351,10 +349,11 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
 | 
			
		||||
    		int tmp_idx=0;
 | 
			
		||||
    		write_u32(buf[buf_idx]+tmp_idx,seq);
 | 
			
		||||
    		tmp_idx+=sizeof(u32_t);
 | 
			
		||||
 | 
			
		||||
    		buf[buf_idx][tmp_idx++]=(unsigned char)type;
 | 
			
		||||
    		buf[buf_idx][tmp_idx++]=(unsigned char)0;
 | 
			
		||||
    		buf[buf_idx][tmp_idx++]=(unsigned char)0;
 | 
			
		||||
    		buf[buf_idx][tmp_idx++]=(unsigned char)((u32_t)counter);
 | 
			
		||||
    		buf[buf_idx][tmp_idx++]=(unsigned char)((u32_t)buf_idx);
 | 
			
		||||
 | 
			
		||||
    		output_len[0]=buf_s_len[buf_idx]+tmp_idx;
 | 
			
		||||
    		output_buf[0]=buf[buf_idx];
 | 
			
		||||
@@ -440,10 +439,16 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
	}
 | 
			
		||||
	if(!anti_replay.is_vaild(seq))
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_info,"failed here2\n");
 | 
			
		||||
		//mylog(log_info,"failed here2\n");
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(mp[seq].group_mp.find(inner_index)!=mp[seq].group_mp.end() )
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_info,"dup inner_index\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int ok=1;
 | 
			
		||||
	if(mp[seq].type==-1)
 | 
			
		||||
		mp[seq].type=type;
 | 
			
		||||
@@ -452,7 +457,12 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
		if(mp[seq].type!=type) ok=0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(type==0) assert(data_num!=0);
 | 
			
		||||
	if(type==0&&data_num==0)
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_warn,"unexpected here,data_num=0\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	if(data_num!=0)
 | 
			
		||||
	{
 | 
			
		||||
@@ -467,18 +477,21 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			if(mp[seq].data_num!=data_num||mp[seq].redundant_num!=redundant_num||mp[seq].len!=len)
 | 
			
		||||
			{
 | 
			
		||||
				mylog(log_warn,"unexpected here\n");
 | 
			
		||||
				ok=0;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(ok==0)
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_info,"ok=0\n");
 | 
			
		||||
		//mylog(log_info,"ok=0\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_info,"ok=1\n");
 | 
			
		||||
		//mylog(log_info,"ok=1\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(fec_data[index].used!=0)
 | 
			
		||||
@@ -519,43 +532,58 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
	{
 | 
			
		||||
		if(mp[seq].data_num!=-1)
 | 
			
		||||
		{
 | 
			
		||||
			data_num=mp[seq].data_num;
 | 
			
		||||
			redundant_num=mp[seq].redundant_num;
 | 
			
		||||
			//int old_data_num=data_num;
 | 
			
		||||
			//int old_redundant_num=redundant_num;
 | 
			
		||||
 | 
			
		||||
			if(mp[seq].data_counter>data_num)
 | 
			
		||||
			//data_num=mp[seq].data_num;
 | 
			
		||||
			//redundant_num=mp[seq].redundant_num;
 | 
			
		||||
 | 
			
		||||
			/*if(mp[seq].data_counter>data_num)  //invaild
 | 
			
		||||
			{
 | 
			
		||||
				mylog(log_warn,"unexpected mp[seq].data_counter>mp[seq].data_num\n");
 | 
			
		||||
				anti_replay.set_invaild(seq);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}*/
 | 
			
		||||
			//assert((int)inner_mp.size()<=data_num);
 | 
			
		||||
			if((int)inner_mp.size()>=mp[seq].data_num)
 | 
			
		||||
			{
 | 
			
		||||
				about_to_fec=1;
 | 
			
		||||
			}
 | 
			
		||||
			else if(mp[seq].data_counter==data_num)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			else if(mp[seq].data_counter==data_num)   //no need to fec . (received first redundant packet ,or received a data packet after redunant packet)
 | 
			
		||||
			{
 | 
			
		||||
				anti_replay.set_invaild(seq);// dont do fec,but  still set invaild
 | 
			
		||||
			}
 | 
			
		||||
			else //mp[seq].data_counter < mp[seq].data_num
 | 
			
		||||
			{
 | 
			
		||||
				if((int)inner_mp.size()>data_num+1)
 | 
			
		||||
				if((int)inner_mp.size()>data_num)
 | 
			
		||||
				{
 | 
			
		||||
					mylog(log_warn,"unexpected (int)inner_mp.size()>data_num+1\n");
 | 
			
		||||
					anti_replay.set_invaild(seq);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
				}*/
 | 
			
		||||
 | 
			
		||||
				//if((int)inner_mp.size()==data_num)
 | 
			
		||||
					//about_to_fec=1;
 | 
			
		||||
 | 
			
		||||
				/*
 | 
			
		||||
				if((int)inner_mp.size()==data_num+1)
 | 
			
		||||
				{
 | 
			
		||||
					anti_replay.set_invaild(seq);
 | 
			
		||||
					if(data_num==0)
 | 
			
		||||
 | 
			
		||||
					if(old_data_num==0)
 | 
			
		||||
						return 0;
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						//mylog(log_warn,"data_num!=0\n"); //this is possible
 | 
			
		||||
						mylog(log_warn,"data_num=0\n");
 | 
			
		||||
						return -1;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				}*/
 | 
			
		||||
 | 
			
		||||
				if((int)inner_mp.size()==data_num)
 | 
			
		||||
					about_to_fec=1;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			//}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
@@ -564,9 +592,13 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
		//for()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	if(about_to_fec)
 | 
			
		||||
	{
 | 
			
		||||
		mylog(log_error,"fec here!\n");
 | 
			
		||||
		int group_data_num=mp[seq].data_num;
 | 
			
		||||
		int group_redundant_num=mp[seq].redundant_num;
 | 
			
		||||
 | 
			
		||||
		//mylog(log_error,"fec here!\n");
 | 
			
		||||
		if(type==0)
 | 
			
		||||
		{
 | 
			
		||||
			char *fec_tmp_arr[max_fec_packet_num+5]={0};
 | 
			
		||||
@@ -574,9 +606,9 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
			{
 | 
			
		||||
				fec_tmp_arr[it->first]=fec_data[it->second].buf;
 | 
			
		||||
			}
 | 
			
		||||
			rs_decode2(data_num,data_num+redundant_num,fec_tmp_arr,len); //the input data has been modified in-place
 | 
			
		||||
			rs_decode2(group_data_num,group_data_num+group_redundant_num,fec_tmp_arr,len); //the input data has been modified in-place
 | 
			
		||||
			blob_decode.clear();
 | 
			
		||||
			for(int i=0;i<data_num;i++)
 | 
			
		||||
			for(int i=0;i<group_data_num;i++)
 | 
			
		||||
			{
 | 
			
		||||
				blob_decode.input(fec_tmp_arr[i],len);
 | 
			
		||||
			}
 | 
			
		||||
@@ -587,6 +619,8 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			int max_len=-1;
 | 
			
		||||
			int fec_ok=1;
 | 
			
		||||
			int debug_num=inner_mp.size();
 | 
			
		||||
@@ -594,7 +628,7 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
 | 
			
		||||
			//memset(output_s_arr_buf,0,sizeof(output_s_arr_buf));//in efficient
 | 
			
		||||
 | 
			
		||||
			for(int i=0;i<data_num+redundant_num;i++)
 | 
			
		||||
			for(int i=0;i<group_data_num+group_redundant_num;i++)
 | 
			
		||||
			{
 | 
			
		||||
				output_s_arr_buf[i]=0;
 | 
			
		||||
			}
 | 
			
		||||
@@ -613,7 +647,7 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
			int missed_packet[max_fec_packet_num+5];
 | 
			
		||||
			int missed_packet_counter=0;
 | 
			
		||||
 | 
			
		||||
			for(int i=0;i<data_num;i++)
 | 
			
		||||
			for(int i=0;i<group_data_num;i++)
 | 
			
		||||
			{
 | 
			
		||||
				if(output_s_arr_buf[i]==0 ||i==inner_index) //only missed packet +current packet
 | 
			
		||||
				{
 | 
			
		||||
@@ -621,14 +655,14 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			rs_decode2(data_num,data_num+redundant_num,output_s_arr_buf,max_len);
 | 
			
		||||
			for(int i=0;i<data_num;i++)
 | 
			
		||||
			rs_decode2(group_data_num,group_data_num+group_redundant_num,output_s_arr_buf,max_len);
 | 
			
		||||
			for(int i=0;i<group_data_num;i++)
 | 
			
		||||
			{
 | 
			
		||||
				output_len_arr_buf[i]=read_u16(output_s_arr_buf[i]);
 | 
			
		||||
				output_s_arr_buf[i]+=sizeof(u16_t);
 | 
			
		||||
				if(output_len_arr_buf[i]>max_data_len)
 | 
			
		||||
				{
 | 
			
		||||
					mylog(log_warn,"invaild len %d,seq= %u,data_num= %d r_num= %d,i= %d\n",output_len_arr_buf[i],seq,data_num,redundant_num,i);
 | 
			
		||||
					mylog(log_warn,"invaild len %d,seq= %u,data_num= %d r_num= %d,i= %d\n",output_len_arr_buf[i],seq,group_data_num,group_redundant_num,i);
 | 
			
		||||
					fec_ok=0;
 | 
			
		||||
					for(int i=0;i<missed_packet_counter;i++)
 | 
			
		||||
					{
 | 
			
		||||
@@ -641,7 +675,7 @@ int fec_decode_manager_t::input(char *s,int len)
 | 
			
		||||
			if(fec_ok)
 | 
			
		||||
			{
 | 
			
		||||
 | 
			
		||||
				output_n=data_num;
 | 
			
		||||
				output_n=group_data_num;
 | 
			
		||||
 | 
			
		||||
				if(decode_fast_send)
 | 
			
		||||
				{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user