more robust,more log

This commit is contained in:
wangyu-
2017-10-17 12:35:03 -05:00
parent 9e96a9432b
commit 93cbe528cf
7 changed files with 192 additions and 68 deletions

View File

@@ -47,7 +47,7 @@ int blob_encode_t::input(char *s,int len)
assert(current_len+len+sizeof(u16_t) +100<sizeof(input_buf));
assert(len<=65535&&len>=0);
counter++;
assert(counter<=max_fec_pending_packet_num);
assert(counter<=max_blob_packet_num);
write_u16(input_buf+current_len,len);
current_len+=sizeof(u16_t);
memcpy(input_buf+current_len,s,len);
@@ -99,7 +99,7 @@ int blob_decode_t::output(int &n,char ** &s_arr,int *&len_arr)
if(parser_pos+(int)sizeof(u32_t)>current_len) {mylog(log_info,"failed 0\n");return -1;}
n=(int)read_u32(input_buf+parser_pos);
if(n>max_fec_pending_packet_num) {mylog(log_info,"failed 1\n");return -1;}
if(n>max_blob_packet_num) {mylog(log_info,"failed 1\n");return -1;}
s_arr=output_buf;
len_arr=output_len;
@@ -146,7 +146,7 @@ int fec_encode_manager_t::re_init(int data_num,int redundant_num,int mtu,int pen
fec_pending_time=pending_time;
this->type=type;
assert(data_num+redundant_num<255);
assert(data_num+redundant_num<max_fec_packet_num);
counter=0;
blob_encode.clear();
ready_for_output=0;
@@ -171,11 +171,11 @@ int fec_encode_manager_t::append(char *s,int len/*,int &is_first_packet*/)
its.it_value.tv_nsec=(tmp_time%1000000llu)*1000llu;
timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
}
if(type==0)
if(type==0)//for type 0 use blob
{
assert(blob_encode.input(s,len)==0);
}
else if(type==1)
else if(type==1)//for tpe 1 use input_buf and counter
{
mylog(log_trace,"counter=%d\n",counter);
assert(len<=65535&&len>=0);
@@ -221,7 +221,7 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
if(type==0&& blob_encode.get_shard_len(fec_data_num,len)>=fec_mtu) {about_to_fec=1; delayed_append=1;}//fec then add packet
if(type==0) assert(counter<fec_pending_num);//counter cant = fec_pending_num,if that happens fec should already been done.
if(type==0) assert(counter<fec_pending_num);//counter will never equal fec_pending_num,if that happens fec should already been done.
if(type==1) assert(counter<fec_data_num);
@@ -230,7 +230,7 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
append(s,len);
}
if(type==0&& counter==fec_pending_num) {about_to_fec=1;} //
if(type==0&& counter==fec_pending_num) about_to_fec=1;
if(type==1&& counter==fec_data_num) about_to_fec=1;
@@ -408,27 +408,27 @@ int fec_encode_manager_t::input(char *s,int len/*,int &is_first_packet*/)
{
assert(counter>=1);
assert(counter<=255);
int buf_idx=counter-1;
int input_buf_idx=counter-1;
assert(ready_for_output==0);
ready_for_output=1;
first_packet_time_for_output=0;
output_n=1;
int tmp_idx=0;
write_u32(input_buf[buf_idx]+tmp_idx,seq);
write_u32(input_buf[input_buf_idx]+tmp_idx,seq);
tmp_idx+=sizeof(u32_t);
input_buf[buf_idx][tmp_idx++]=(unsigned char)type;
input_buf[buf_idx][tmp_idx++]=(unsigned char)0;
input_buf[buf_idx][tmp_idx++]=(unsigned char)0;
input_buf[buf_idx][tmp_idx++]=(unsigned char)((u32_t)buf_idx);
input_buf[input_buf_idx][tmp_idx++]=(unsigned char)type;
input_buf[input_buf_idx][tmp_idx++]=(unsigned char)0;
input_buf[input_buf_idx][tmp_idx++]=(unsigned char)0;
input_buf[input_buf_idx][tmp_idx++]=(unsigned char)((u32_t)input_buf_idx);
output_len[0]=input_len[buf_idx]+tmp_idx;
output_buf[0]=input_buf[buf_idx];
output_len[0]=input_len[input_buf_idx]+tmp_idx;
output_buf[0]=input_buf[input_buf_idx];
if(0)
{
printf("seq=%u,buf_idx=%d\n",seq,buf_idx);
printf("seq=%u,buf_idx=%d\n",seq,input_buf_idx);
for(int j=0;j<output_len[0];j++)
{
log_bare(log_warn,"0x%02x,",(u32_t)(unsigned char)output_buf[0][j]);
@@ -481,7 +481,15 @@ int fec_decode_manager_t::re_init()
int fec_decode_manager_t::input(char *s,int len)
{
assert(s!=0);
assert(len+100<buf_len);//guarenteed by upper level
int tmp_idx=0;
int tmp_header_len=sizeof(u32_t)+sizeof(char)*4;
if(len<tmp_header_len)
{
mylog(log_warn,"len =%d\n",len);
return -1;
}
u32_t seq=read_u32(s+tmp_idx);
tmp_idx+=sizeof(u32_t);
int type=(unsigned char)s[tmp_idx++];
@@ -490,20 +498,21 @@ int fec_decode_manager_t::input(char *s,int len)
int inner_index=(unsigned char)s[tmp_idx++];
len=len-tmp_idx;
mylog(log_trace,"input\n");
assert(len+100<buf_len);
//mylog(log_trace,"input\n");
if(len<0)
{
mylog(log_warn,"len<0\n");
return -1;
}
if(type==1&&len<(int)sizeof(u16_t))
{
mylog(log_warn,"type==1&&len<2\n");
return -1;
}
if(type==1)
{
if(len<(int)sizeof(u16_t))
{
mylog(log_warn,"type==1&&len<2\n");
return -1;
}
if(data_num==0&&(int)( read_u16(s+tmp_idx)+sizeof(u16_t))!=len)
{
mylog(log_warn,"inner_index<data_num&&read_u16(s+tmp_idx)+sizeof(u16_t)!=len %d %d\n",(int)( read_u16(s+tmp_idx)+sizeof(u16_t)),len);
@@ -511,9 +520,14 @@ int fec_decode_manager_t::input(char *s,int len)
}
}
if(type==0&&data_num==0)
{
mylog(log_warn,"unexpected type==0&&data_num==0\n");
return -1;
}
if(data_num+redundant_num>=max_fec_packet_num)
{
mylog(log_warn,"failed here\n");
mylog(log_warn,"data_num+redundant_num>=max_fec_packet_num\n");
return -1;
}
if(!anti_replay.is_vaild(seq))
@@ -524,18 +538,11 @@ int fec_decode_manager_t::input(char *s,int len)
if(mp[seq].group_mp.find(inner_index)!=mp[seq].group_mp.end() )
{
mylog(log_debug,"dup fec index\n");
mylog(log_debug,"dup fec index\n");//duplicate can happen on a normal network, so its just log_debug
return -1;
}
if(type==0&&data_num==0)
{
mylog(log_warn,"unexpected type==0&&data_num==0\n");
return -1;
}
int ok=1;
if(mp[seq].type==-1)
mp[seq].type=type;
else
@@ -543,7 +550,7 @@ int fec_decode_manager_t::input(char *s,int len)
if(mp[seq].type!=type)
{
mylog(log_warn,"type mismatch\n");
ok=0;
return -1;
}
}
@@ -561,18 +568,12 @@ int fec_decode_manager_t::input(char *s,int len)
{
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;
mylog(log_warn,"unexpected mp[seq].data_num!=data_num||mp[seq].redundant_num!=redundant_num||mp[seq].len!=len\n");
return -1;
}
}
}
if(ok==0)
{
mylog(log_warn,"fec packets invaild\n");
return -1;
}
if(fec_data[index].used!=0)
{
u32_t tmp_seq=fec_data[index].seq;
@@ -607,7 +608,13 @@ int fec_decode_manager_t::input(char *s,int len)
int about_to_fec=0;
if(type==0)
{
assert((int)inner_mp.size()<=data_num);
//assert((int)inner_mp.size()<=data_num);
if((int)inner_mp.size()>data_num)
{
mylog(log_warn,"inner_mp.size()>data_num\n");
anti_replay.set_invaild(seq);
goto end;
}
if((int)inner_mp.size()==data_num)
about_to_fec=1;
}
@@ -615,6 +622,12 @@ int fec_decode_manager_t::input(char *s,int len)
{
if(mp[seq].data_num!=-1)
{
if((int)inner_mp.size()>data_num+1)
{
mylog(log_warn,"inner_mp.size()>data_num+1\n");
anti_replay.set_invaild(seq);
goto end;
}
if((int)inner_mp.size()>=mp[seq].data_num)
{
about_to_fec=1;
@@ -637,17 +650,25 @@ int fec_decode_manager_t::input(char *s,int len)
fec_tmp_arr[it->first]=fec_data[it->second].buf;
}
assert(rs_decode2(group_data_num,group_data_num+group_redundant_num,fec_tmp_arr,len)==0); //the input data has been modified in-place
//this line should always succeed
blob_decode.clear();
for(int i=0;i<group_data_num;i++)
{
blob_decode.input(fec_tmp_arr[i],len);
}
blob_decode.output(output_n,output_s_arr,output_len_arr);
if(blob_decode.output(output_n,output_s_arr,output_len_arr)==0)
{
mylog(log_warn,"blob_decode failed\n");
//ready_for_output=0;
anti_replay.set_invaild(seq);
goto end;
}
assert(ready_for_output==0);
ready_for_output=1;
anti_replay.set_invaild(seq);
}
else
else//type==1
{
@@ -679,7 +700,6 @@ int fec_decode_manager_t::input(char *s,int len)
if(fec_data[it->second].len > max_len)
max_len=fec_data[it->second].len;
}
if(max_len!=mp[seq].len)
{
data_check_ok=0;
@@ -687,13 +707,15 @@ int fec_decode_manager_t::input(char *s,int len)
}
if(data_check_ok==0)
{
ready_for_output=0;
//ready_for_output=0;
mylog(log_warn,"data_check_ok==0\n");
anti_replay.set_invaild(seq);
goto end;
}
for(auto it=inner_mp.begin();it!=inner_mp.end();it++)
{
int tmp_idx=it->second;
assert(max_len>=fec_data[tmp_idx].len);//guarenteed by data_check_ok
memset(fec_data[tmp_idx].buf+fec_data[tmp_idx].len,0,max_len-fec_data[tmp_idx].len);
}
@@ -706,7 +728,7 @@ int fec_decode_manager_t::input(char *s,int len)
}
mylog(log_trace,"fec done,%d %d,missed_packet_counter=%d\n",group_data_num,group_redundant_num,missed_packet_counter);
assert(rs_decode2(group_data_num,group_data_num+group_redundant_num,output_s_arr_buf,max_len)==0);
assert(rs_decode2(group_data_num,group_data_num+group_redundant_num,output_s_arr_buf,max_len)==0);//this should always succeed
for(int i=0;i<group_data_num;i++)
{
@@ -751,9 +773,9 @@ int fec_decode_manager_t::input(char *s,int len)
ready_for_output=0;
}
anti_replay.set_invaild(seq);
}
}// end of type==1
}
else
else //not about_to_fec
{
if(decode_fast_send)