DCCP protocol discussions
 help / color / mirror / Atom feed
From: Gerrit Renker <gerrit@erg.abdn.ac.uk>
To: dccp@vger.kernel.org
Subject: Re: [SUMMARY]: Problems with loss interval recalculation / audit against [RFC 3448, 5.4]
Date: Tue, 09 Jan 2007 08:38:52 +0000	[thread overview]
Message-ID: <200701090838.52855@strip-the-willow> (raw)
In-Reply-To: <200701051829.20415@strip-the-willow>

|  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

  parent reply	other threads:[~2007-01-09  8:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-05 18:29 [SUMMARY]: Problems with loss interval recalculation / audit against [RFC 3448, 5.4] Gerrit Renker
2007-01-05 21:26 ` [SUMMARY]: Problems with loss interval recalculation / audit Eddie Kohler
2007-01-08 16:32 ` [SUMMARY]: Problems with loss interval recalculation / audit against [RFC 3448, 5.4] Gerrit Renker
2007-01-08 16:55 ` [SUMMARY]: Problems with loss interval recalculation / audit Eddie Kohler
2007-01-08 17:48 ` [SUMMARY]: Problems with loss interval recalculation / audit against [RFC 3448, 5.4] Arnaldo Carvalho de Melo
2007-01-08 20:36 ` Ian McDonald
2007-01-09  8:38 ` Gerrit Renker [this message]
2007-01-10  3:14 ` Ian McDonald
2007-01-10  4:27 ` Ian McDonald
2007-01-10 11:32 ` Gerrit Renker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200701090838.52855@strip-the-willow \
    --to=gerrit@erg.abdn.ac.uk \
    --cc=dccp@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox