@@ -330,10 +330,12 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
330330 u32 srtt [2 ]= {0xffffffff ,0xffffffff };
331331 u32 min_rtt [2 ]= {0xffffffff ,0xffffffff };
332332 u32 num_acks [2 ]= {0 ,0 };
333+ u32 num_acks_head [2 ]= {0 ,0 };
333334 int rate_diff , buffer_diff ;
334335 int rate_diff_sub [2 ] = {0 ,0 };
335336 int buffer_sub [2 ] = {0 ,0 };
336337 u32 last_buffer_size [2 ] = {0 , 0 }, init_buffer_size [2 ] = {0 , 0 }, tput [2 ] = {0 , 0 };
338+ u16 head_length ;
337339 u8 threshold_cnt ;
338340 u8 buffer_threshold_cnt ;
339341 unsigned int time_diff , loop_counter = 0 ;
@@ -516,8 +518,6 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
516518 mptcp_sched_probe_init (& sprobe );
517519 iter ++ ;
518520
519- /*These two are read for every function call, e.g, every segment
520- * we log every 100ms or longer*/
521521 subflow_rate = READ_ONCE (tp_it -> rate_delivered );
522522 subflow_intv = READ_ONCE (tp_it -> rate_interval_us );
523523 if (subflow_rate && subflow_intv ) {
@@ -555,6 +555,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
555555 meta_tp -> rate_delivered += total_rate ;//no use
556556 meta_tp -> delivered ++ ;
557557
558+
558559 iter = 0 ;
559560 mptcp_for_each_sub (mpcb , mptcp ) {
560561 struct sock * sk_it = mptcp_to_sock (mptcp );
@@ -565,8 +566,26 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
565566 rsp_temp -> delivered ++ ;
566567 iter ++ ;
567568 }
569+
568570
569571 time_diff = jiffies_to_msecs (jiffies - meta_tp -> rate_interval_us );
572+ meta_tp -> head_length = meta_tp -> ratio_rate_sample /2 ;
573+ if (time_diff == meta_tp -> head_length && meta_tp -> lost ){
574+ in_search = meta_tp -> lost ;
575+ //printk("Time elapsed since last change: %u", time_diff);
576+ iter = 0 ;
577+ mptcp_for_each_sub (mpcb , mptcp ) {
578+ struct sock * sk_it = mptcp_to_sock (mptcp );
579+ struct tcp_sock * tp_it_temp = tcp_sk (sk_it );
580+ u32 subflow_rate ;
581+ subflow_rate = tp_it_temp -> delivered - tp_it_temp -> prev_tx_bytes ;
582+ meta_tp -> num_acks_head [iter ] = subflow_rate ;
583+ iter ++ ;
584+ }
585+ // printk("Number of ACKs collected: %u",
586+ // meta_tp->num_acks_head[0] + meta_tp->num_acks_head[1]);
587+ }
588+
570589 /*start dynamic ratio search*/
571590 if (time_diff >= meta_tp -> ratio_rate_sample ) {
572591 /*Load parameter from previous probe interval*/
@@ -578,14 +597,19 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
578597 last_trigger_tstamp = meta_tp -> prior_ssthresh ;
579598 count_set_init_rate = meta_tp -> total_retrans ;
580599 init_rate = meta_tp -> prior_cwnd ;
600+
601+ num_acks_head [0 ] = (in_search == 0 )? 0 : meta_tp -> num_acks_head [0 ];
602+ num_acks_head [1 ] = (in_search == 0 )? 0 : meta_tp -> num_acks_head [1 ];
603+ head_length = (num_acks_head [0 ]== 0 )? 0 :meta_tp -> head_length ;
604+ //printk("head_length this period: %u", head_length);
581605 memcpy (init_buffer_size , meta_tp -> init_buffer_size , 2 * sizeof (u32 ));
582606 memcpy (last_buffer_size , meta_tp -> last_buffer_size , 2 * sizeof (u32 ));
583607 /*End loading*/
584608
585609 iter = 0 ;
586610 meta_tp -> rate_delivered = 0 ; //reset this container so that we can use it to calculate rate
587611
588- /*Value estimation per sampling interval */
612+ /*Value estimation for each interface */
589613 mptcp_for_each_sub (mpcb , mptcp ) {
590614 struct sock * sk_it = mptcp_to_sock (mptcp );
591615 struct tcp_sock * tp_it_temp = tcp_sk (sk_it );
@@ -595,10 +619,14 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
595619 do_div (rsp_temp -> buffer_size , meta_tp -> delivered );
596620 do_div (buffer_sub [iter ], 1000 );//KB
597621 curr_tstamp = jiffies ;
598- subflow_rate = tp_it_temp -> delivered - tp_it_temp -> prev_tx_bytes ;//number of ACKs came back
622+ //printk("Original ACKs %llu", tp_it_temp->delivered-
623+ // tp_it_temp->prev_tx_bytes);
624+ subflow_rate = tp_it_temp -> delivered - tp_it_temp -> prev_tx_bytes - num_acks_head [iter ];//number of ACKs came back
625+ //printk("Deducted ACKs: %u", subflow_rate);
599626 num_acks [iter ] = subflow_rate ;
600627 tp_it_temp -> prev_tx_bytes = tp_it_temp -> delivered ;
601- subflow_intv = jiffies_to_msecs (curr_tstamp - tp_it_temp -> prev_tstamp );
628+ subflow_intv = jiffies_to_msecs (curr_tstamp
629+ - tp_it_temp -> prev_tstamp )- head_length ;
602630 tp_it_temp -> prev_tstamp = curr_tstamp ;
603631 subflow_rate64 = (u64 )subflow_rate * tp_it_temp -> mss_cache * 8 * MSEC_PER_SEC ;
604632 do_div (subflow_rate64 , subflow_intv );
@@ -609,7 +637,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
609637 meta_tp -> rate_delivered += tput [iter ];//cummulate rate on both interface
610638 rsp_temp -> snd_una_saved = tp_it_temp -> snd_una ;
611639 iter ++ ;
612- }
640+ }/*Value estimation for each interface*/
613641
614642 for (iter = 0 ; iter < 5 ; iter ++ ) {
615643 if (iter == 4 )
@@ -917,7 +945,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
917945 }
918946 meta_tp -> rate_interval_us = jiffies ;
919947
920- }/*end dynamic ratio_search */
948+ }/*end dynamic ratio search */
921949 // AUTO-RATE search
922950
923951 mptcp_for_each_sub (mpcb , mptcp ) {
0 commit comments