📄 pathload_rcv_func.c
字号:
test if Rmax and Rmin range is smaller than user specified bw resolution or if Gmin and Gmax range is smaller than grey bw resolution.*/l_int32 converged(){ int ret_val=0; if ( (converged_gmx_rmx_tm && converged_gmn_rmn_tm) || converged_rmn_rmx_tm ) ret_val=1; else if ( tr_max != 0 && tr_max != tr_min ) { if ( tr_max - tr_min <= bw_resol ) { converged_rmn_rmx=1; ret_val=1; } else if( tr_max - grey_max <= grey_bw_resolution() && grey_min - tr_min <= grey_bw_resolution() ) { converged_gmn_rmn = 1; converged_gmx_rmx = 1; ret_val=1; } } return ret_val ;}/* Calculate next fleet rate when fleet showed INCREASING trend. */void radj_increasing() { if ( grey_max != 0 && grey_max >= tr_min ) { if ( tr_max - grey_max <= grey_bw_resolution() ) { converged_gmx_rmx = 1; exp_flag=0; if ( grey_min || tr_min ) radj_notrend() ; else { if ( grey_min < grey_max ) tr = grey_min/2. ; else tr = grey_max/2. ; } } else tr = ( tr_max + grey_max)/2. ; } else tr = (tr_max + tr_min)/2.<min_rate?min_rate:(tr_min+tr_max)/2. ;}/* Calculate next fleet rate when fleet showed NOTREND trend. */void radj_notrend() { if ( exp_flag ) tr = 2*tr>max_rate?max_rate:2*tr ; else { if ( grey_min != 0 && grey_min <= tr_max ) { if ( grey_min - tr_min <= grey_bw_resolution() ) { converged_gmn_rmn = 1; radj_increasing() ; } else tr = (tr_min+grey_min)/2.<min_rate?min_rate:(tr_min+grey_min)/2. ; } else tr = (tr_max + tr_min)/2.<min_rate?min_rate:(tr_min+tr_max)/2. ; }}/* Calculate next fleet rate when fleet showed GREY trend. */void radj_greymax(){ if ( tr_max == 0 ) tr = (tr+.5*tr)<max_rate?(tr+.5*tr):max_rate ; else if ( tr_max - grey_max <= grey_bw_resolution() ) { converged_gmx_rmx = 1; radj_greymin() ; } else tr = ( tr_max + grey_max)/2. ;}/* Calculate next fleet rate when fleet showed GREY trend. */void radj_greymin(){ if ( grey_min - tr_min <= grey_bw_resolution() ) { converged_gmn_rmn = 1; radj_greymax() ; } else tr = (tr_min+grey_min)/2.<min_rate?min_rate:(tr_min+grey_min)/2. ;}/* dpending upon trend in fleet :- - update the state variables. - decide the next fleet rate return -1 when converged*/l_int32 rate_adjustment(l_int32 flag){ l_int32 ret_val = 0 ; if( flag == INCREASING ) { if ( max_rate_flag) max_rate_flag=0; if ( grey_max >= tr ) grey_max = grey_min = 0 ; tr_max = tr ; if (!converged_gmx_rmx_tm ) { if ( !converged() ) radj_increasing() ; else ret_val=-1 ; //return -1; } else { exp_flag = 0 ; if ( !converged() ) radj_notrend() ; } } else if ( flag == NOTREND ) { if ( grey_min < tr ) grey_min = 0 ; if ( grey_max < tr ) grey_max = grey_min = 0 ; if ( tr > tr_min ) tr_min = tr ; if ( !converged_gmn_rmn_tm && !converged() ) radj_notrend() ; else ret_val=-1 ; //return -1 ; } else if ( flag == GREY ) { if ( grey_max == 0 && grey_min == 0 ) grey_max = grey_min = tr ; if (tr==grey_max || tr>grey_max ) { grey_max = tr ; if ( !converged_gmx_rmx_tm ) { if ( !converged() ) radj_greymax() ; else ret_val=-1 ; //return -1 ; } else { exp_flag = 0 ; if ( !converged() ) radj_notrend() ; else ret_val=-1; } } else if ( tr < grey_min || grey_min == 0 ) { grey_min = tr ; if ( !converged() ) radj_greymin() ; else ret_val=-1 ; //return -1 ; } } if (Verbose) { printf(" Rmin-Rmax :: %.2f-%.2fMbps\n",tr_min,tr_max); printf(" Gmin-Gmax :: %.2f-%.2fMbps\n",grey_min,grey_max); } fprintf(pathload_fp," Rmin-Rmax :: %.2f-%.2fMbps\n",tr_min,tr_max); fprintf(pathload_fp," Gmin-Gmax :: %.2f-%.2fMbps\n",grey_min,grey_max); if ( ret_val == -1 ) return -1 ; if ( tr >= max_rate ) max_rate_flag++ ; if ( max_rate_flag > 1 ) return -1 ; if ( min_rate_flag > 1 ) return -1 ; transmission_rate = (l_int32) rint(1000000 * tr ) ; return 0 ;}/* calculates fleet param L,T . calc_param returns -1, if we have reached to upper/lower limits of the stream parameters like L,T . otherwise returns 0 .*/l_int32 calc_param(){ double tmp_tr ; l_int32 tmp ; l_int32 tmp_time_interval; if (tr < 150 ) { time_interval = 80>min_time_interval?80:min_time_interval ; cur_pkt_sz=rint(tr*time_interval/8.) - 28; if ( cur_pkt_sz < MIN_PKT_SZ ) { cur_pkt_sz = MIN_PKT_SZ ; time_interval =rint ((cur_pkt_sz + 28)*8./tr) ; tr = ( cur_pkt_sz + 28 )*8. /time_interval ; } else if ( cur_pkt_sz > max_pkt_sz ) { cur_pkt_sz = max_pkt_sz; time_interval = min_time_interval ; tmp_tr = ( cur_pkt_sz + 28 )*8. /time_interval ; if ( equal(tr,tmp_tr)) tr = tmp_tr; else return -1 ; } } else if ( tr < 600 ) { tmp_tr = tr ; tmp_time_interval = rint(( max_pkt_sz + 28 )* 8 / tr) ; if ( cur_pkt_sz == max_pkt_sz && tmp_time_interval == time_interval ) return -1 ; time_interval = tmp_time_interval ; tmp=rint(tr*time_interval/8.)-28; cur_pkt_sz=tmp<max_pkt_sz?tmp:max_pkt_sz; tr = ( cur_pkt_sz + 28 ) *8./time_interval ; if ((tr_min && (equal(tr,tr_min) || tr<tr_min)) || (grey_max && tmp_tr>grey_max && (equal(tr,grey_max) || tr<grey_max))) { do { --time_interval; cur_pkt_sz=rint(tr*time_interval/8.)-28; }while (cur_pkt_sz > max_pkt_sz); tr = ( cur_pkt_sz + 28 ) *8./time_interval ; } } else { cur_pkt_sz = max_pkt_sz ; time_interval = rint(( cur_pkt_sz + 28 )* 8 / tr) ; tr = ( cur_pkt_sz + 28 ) *8./time_interval ; if ((tr_min && (equal(tr,tr_min) || tr<tr_min)) ) { return -1 ; } if( equal(tr,tr_max) ) { tr_max = tr ; if ( grey_max ) { converged_gmx_rmx_tm=1; if ( !converged_gmn_rmn && !converged_gmn_rmn_tm ) radj_notrend(); else return -1 ; } else { converged_rmn_rmx=1; return -1 ; } } } return 0 ;}/* splits stream iff sender sent packets more than time_interval+1000 usec apart.*/l_int32 eliminate_sndr_side_CS (double sndr_time_stamp[], l_int32 split_owd[]){ l_int32 j = 0,k=0; l_int32 cs_threshold; cs_threshold = 2*time_interval>time_interval+1000?2*time_interval:time_interval+1000; for ( k = 0 ; k < stream_len-1 ; k++ ) { if ( sndr_time_stamp[k] == 0 || sndr_time_stamp[k+1] == 0 ) continue; else if ((sndr_time_stamp[k+1]-sndr_time_stamp[k]) > cs_threshold) split_owd[j++] = k; } return j ;}/* discards owd of packets received when receiver was NOT running.*/l_int32 eliminate_rcvr_side_CS ( double rcvr_time_stamp[] , double owd[],double owdfortd[], l_int32 low,l_int32 high,l_int32 *num_rcvr_cs,l_int32 *tmp_b2b ){ l_int32 b2b_pkt[MAX_STREAM_LEN] ; l_int32 i,k=0 ; l_int32 len=0; l_int32 min_gap; min_gap = MIN_TIME_INTERVAL > 1.5*rcv_latency ? MIN_TIME_INTERVAL :2.5*rcv_latency ; for ( i = low ; i <= high ; i++ ) { if ( rcvr_time_stamp[i] == 0 || rcvr_time_stamp[i+1] == 0 ) continue ; else if ((rcvr_time_stamp[i+1]- rcvr_time_stamp[i])> min_gap) owdfortd[len++] = owd[i]; else b2b_pkt[k++] = i ; } /* go through discarded list and count b2b discards as 1 CS instance */ for (i=1;i<k;i++) if ( b2b_pkt[i]-b2b_pkt[i-1] != 1) (*num_rcvr_cs)++; *tmp_b2b += k; return len ;}/* eliminates packets received b2b due to IC */l_int32 eliminate_b2b_pkt_ic ( double rcvr_time_stamp[] , double owd[],double owdfortd[], l_int32 low,l_int32 high,l_int32 *num_rcvr_cs,l_int32 *tmp_b2b ){ l_int32 b2b_pkt[MAX_STREAM_LEN] ; l_int32 i,k=0 ; l_int32 len=0; l_int32 min_gap; l_int32 tmp=0; min_gap = MIN_TIME_INTERVAL > 3*rcv_latency ? MIN_TIME_INTERVAL :3*rcv_latency ; for ( i = low ; i <= high ; i++ ) { if ( rcvr_time_stamp[i] == 0 || rcvr_time_stamp[i+1] == 0 ) continue ; //fprintf(stderr,"i %d owd %.2f dispersion %.2f",i, owd[i],rcvr_time_stamp[i+1]- rcvr_time_stamp[i]); if ((rcvr_time_stamp[i+1]- rcvr_time_stamp[i])< min_gap) { b2b_pkt[k++] = i ; tmp++; //fprintf(stderr," b\n"); } else { if ( tmp >= 3 ) { //fprintf(stderr," j\n"); tmp=0; owdfortd[len++] = owd[i]; } } } return len ;}/* Adjust offset to zero again */void adjust_offset_to_zero(double owd[], l_int32 len){ l_int32 owd_min = 0; l_int32 i ; for (i=0; i< len; i++) { if ( owd_min == 0 && owd[i] != 0 ) owd_min=owd[i]; else if (owd_min != 0 && owd[i] != 0 && owd[i]<owd_min) owd_min=owd[i]; } for (i=0; i< len; i++) { if ( owd[i] != 0 ) owd[i] -= owd_min; }}#define INCR 1#define NOTR 2#define DISCARD 3#define UNCL 4void get_pct_trend(double pct_metric[], l_int32 pct_trend[], l_int32 pct_result_cnt ){ l_int32 i ; for (i=0; i < pct_result_cnt;i++ ) { pct_trend[i] = UNCL ; if ( pct_metric[i] == -1 ) { if (Verbose) printf("d"); fprintf(pathload_fp,"d"); pct_trend[i] = DISCARD ; } else if ( pct_metric[i] > 1.1 * PCT_THRESHOLD ) { if (Verbose) printf("I"); fprintf(pathload_fp,"I"); pct_trend[i] = INCR ; } else if ( pct_metric[i] < .9 * PCT_THRESHOLD ) { if (Verbose) printf("N"); fprintf(pathload_fp,"N"); pct_trend[i] = NOTR ; } else if(pct_metric[i] <= PCT_THRESHOLD*1.1 && pct_metric[i] >= PCT_THRESHOLD*.9 ) { if (Verbose) printf("U"); fprintf(pathload_fp,"U"); pct_trend[i] = UNCL ; } } if (Verbose) printf("\n"); fprintf(pathload_fp,"\n");}void get_pdt_trend(double pdt_metric[], l_int32 pdt_trend[], l_int32 pdt_result_cnt ){ l_int32 i ; for (i=0; i < pdt_result_cnt;i++ ) { if ( pdt_metric[i] == 2 ) { if (Verbose) printf("d"); fprintf(pathload_fp,"d"); pdt_trend[i] = DISCARD ; } else if ( pdt_metric[i] > 1.1 * PDT_THRESHOLD ) { if (Verbose) printf("I"); fprintf(pathload_fp,"I"); pdt_trend[i] = INCR ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -