Re: [SUMMARY]: Problems with loss interval recalculation / audit against [RFC 3448, 5.4]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



|  How can I get a complete copy of the DCCP source checked out, including 
|  your/Ian's patches?  Where is there something on line that explains the git 
|  process?  Thanks for your/anyone's help.
I found the following tutorial useful:
  http://www.kernel.org/pub/software/scm/git/docs/tutorial.html
In addition, Ian's links are also very helpful - they have helped me in the past. 
In the git sources there are a few summary documents as well, I found Documentation/everyday.txt good

Both my patches on    http://www.erg.abdn.ac.uk/users/gerrit/dccp/patch-backlog/the_whole_lot.tar.gz
and Ian's patches on  http://wand.net.nz/~iam4/dccp/patches/
are `stacked': if you have the quilt tool then it is best to fork a new git branch and apply
them in order. (If not, one can use for p in `cat series`; do patch -p1 < $p; done).
There is overlap between Ian's and my patch set; I usually copy those patches from the list where
we have finished discussion. 

|  > ( I just found out that there is another
|  >   PROBLEM#1: For the first loss interval (as per [RFC 3448, 6.3.1]), the timestamp
|  >             and sequence number are not stored, only the interval is. )
I just noted that I was wrong here - timestamp and sequence number are stored, but by a
different routine (dccp_li_hist_interval_new) - it would be great if we could perform the
storing of timestamp/sequence number always in the same function (dccp_li_update_li).

|  > 
|  > For all other loss events, timestamp and sequence number are stored. This also holds
|  > for I_0; it could be that the interval is 0 here due to (seq_temp becomes `interval')
|  >    seq_temp = dccp_delta_seqno(head->dccplih_seqno, seq_nonloss);
|  > but I am not entirely sure about that. And it is probably safer to encode this
|  > case more explicitly.
|  > 
|  > In any way, this clarification leads to 
|  > PROBLEM#2: Since I_0 always sits at the head of the list, there are at most n=7 
|  >            completed loss interval entries (not 8 as the RFC recommends).
|  
|  I find this difficult to follow, but is there still confusion?  According to 
|  my reading of the patches, and Ian confirmed this, what RFC3448 means by I_0 
|  **is not stored on the list at all**.  The list stores I_1...I_8.  Remember 
|  that I_0 is the incomplete loss interval.
ACK - I_0 is the incomplete loss interval. The way the code is currently organised,
I_0 sits always on top of the list, which is due to:
 * in ccid3_hc_rx_packet_recv(), the call to ccid3_hc_rx_detect_loss() comes first
 * ccid3_hc_rx_detect_loss in turn calls dccp_li_update_li()
 * control then resumes in ccid3_hc_rx_packet_recv()
Hence the detection of a loss event always triggers insertion of the sequence number 
and timestamp at the head of the list. 
With regard to your above comment, we should probably change this so that I_0 is
not stored on top of the list - or adapt the list handling so that I_0 can be distinguished
from I_1 ... I_k (k <= 8).

 
|  > |  Your comments about Ian's patch are also wrong, for the same reason.  I 
|  > |  believe Ian's patch calculates I_tot0 and I_tot1 correctly, although with 
|  > |  swapped names.  Certainly if there is a problem it is not the one you have 
|  > |  identified.
|  > If the above assumption that the interval of I_0 is 0 holds then in Ian's patch
|  > (where I_0' is the interval called `non_loss' in Ian's patch) we have that
|  >  -  I_tot0 is the sum  I_1 * w_1 + ... I_7 * w_7  
|  >  -  I_tot1 is the sum  I_0' * w_0 + I_1 * w_2 +  I_2 * w3 + ... + I_6 * w_7
|  > This can't be right.
|  
|  Your analysis is wrong, I think.  Ian's patch sent 12/27 calculates
|  
|     I_tot0 = I_1 * w_0 + ... + I_8 * w_7
|     I_tot1 = I_0 * w_0 + I_1 * w_1 + ... + I_7 * w_7.
|  
|  Because "i" starts at 0.  The relevant part of the patch.
|  
|    			i_tot0 += li_entry->dccplih_interval * dccp_li_hist_w[i];
|    			w_tot  += dccp_li_hist_w[i];
|  +			if (i != 7)
|  +				i_tot1 += li_entry->dccplih_interval
|  +				   * dccp_li_hist_w[i + 1];
|  +			if (i == 0) {
|  +				non_loss = dccp_hdr_seq(skb);
|  +				sub48(&non_loss, li_entry->dccplih_seqno);
|  +			}
|  
|  When "i == 0", the loop is examining I_1.  Then i_tot0 += I_1*w[0], and i_tot1 
|  += I_1*w[1], exactly as one would like.  The case "i==7" (that is, I_8) 
|  affects i_tot0 but not i_tot1, exactly as one would like.
I think it is different - that when 'i == 0' then we are looking at I_0. This is confirmed by the statement
		if (i == 0) {
			non_loss = dccp_hdr_seq(skb);
			sub48(&non_loss, li_entry->dccplih_seqno);
		}
which shows how the code uses the last recorded loss sequence number li_entry->dccplih_seqno to compute
the interval length for non_loss = I_0. 
Hence we have here that i_tot0 += I_0' * w[0] and i_tot1 += I_0' * w[1], where I_0' is the interval
stored in li_entry. As per earlier email this could be 0 but I am still not entirely sure it is.
 
In the second iteration of the loop we have 

 i_tot0 += I_1 * w[1]
 i_tot1 += I_1 * w[2]

and in the third we have

 i_tot0 += I_2 * w[2]
 i_tot1 += I_2 * w[3]

but the RFC says

 I_tot0 = I_0 * w[0] + I_1 * w[1] + I_2 * w[2] + I_3 * w[3] + I_4 * w[4] + I_5 * w[5] + I_6 * w[6] + I_7 * w[7]
 I_tot1 = I_1 * w[0] + I_2 * w[1] + I_3 * w[2] + I_4 * w[3] + I_5 * w[4] + I_6 * w[5] + I_7 * w[6] + I_8 * w[7]

which is different from what the above code does. 

So I think what we can take home as `todo' items from this is
 * correct the list handling with regard to I_0 
 * ensure that I_1 ... I_8 all fit in the list
 * compute the interval length I_0 as done for `non_loss' in Ian's patch
 * change the summation loop so that it matches the one in the RFC

I am still trying to compile all this into (yet another :) summary, thanks for your comments.

Gerrit
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [IETF DCCP]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux