⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pathload_rcv_func.c

📁 pashload是应用在linux下的网络带宽测试源程序精确度比较高 ///////////////////////////////////// Pathload is a tool for es
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -