tsn_gap_acked is an important state flag in chunk, which indicates if the
chunk has been acked in gap reports before. SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Neil Horman <nhorman@tuxdriver.com> Date: 2013-11-22 12:10:37
On Fri, Nov 22, 2013 at 08:49:49AM +0100, Chang Xiangzhong wrote:
quoted hunk
tsn_gap_acked is an important state flag in chunk, which indicates if the
chunk has been acked in gap reports before. SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
tsn_gap_acked is an important state flag in chunk, which indicates if the
chunk has been acked in gap reports before.
Actually, this bit indicates simply that the chunk has been acked. It
doesn't state whether it's been acked in a gap report or via cumulative tsn.
quoted hunk
SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
The current code will set the state if it hasn't been set yet. Why is
this needed?
Now there is an issue with tracking highest_new_tsn_in_sack. The spec
is a little vague on this, but the highest_new_tsn_in_sack only supposed
to track tsns that have not been resent. If a tsn has been reneged, and
then sent again, it is not considered 'new' thus should not count
toward highest_new_tsn_in_sack. We currently do not track this right.
-vlad
-vlad
} else {
if (tchunk->tsn_gap_acked) {
pr_debug("%s: receiver reneged on data TSN:0x%x\n",
tsn_gap_acked is an important state flag in chunk, which indicates if the
chunk has been acked in gap reports before.
Actually, this bit indicates simply that the chunk has been acked. It
doesn't state whether it's been acked in a gap report or via cumulative tsn.
Thanks for pointing this out. Sorry for not having made that clear.
quoted
SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
The current code will set the state if it hasn't been set yet. Why is
this needed?
Because in line 1420 ~ 1440 The SFR-CACC algorithms use tsn_gap_acked.
That "if block" would never be triggered because the varaiable's been
set. That's why I move the "state changing sentence" to the end of the
iteration.
Now there is an issue with tracking highest_new_tsn_in_sack. The spec
is a little vague on this, but the highest_new_tsn_in_sack only supposed
to track tsns that have not been resent. If a tsn has been reneged, and
then sent again, it is not considered 'new' thus should not count
toward highest_new_tsn_in_sack. We currently do not track this right.
I'll try to figure this out.
-vlad
-vlad
quoted
} else {
if (tchunk->tsn_gap_acked) {
pr_debug("%s: receiver reneged on data TSN:0x%x\n",
tsn_gap_acked is an important state flag in chunk, which indicates if
the
chunk has been acked in gap reports before.
Actually, this bit indicates simply that the chunk has been acked. It
doesn't state whether it's been acked in a gap report or via
cumulative tsn.
Thanks for pointing this out. Sorry for not having made that clear.
quoted
quoted
SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the
SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
sctp_outq *q,
* while DATA was outstanding).
*/
if (!tchunk->tsn_gap_acked) {
- tchunk->tsn_gap_acked = 1;
if (TSN_lt(*highest_new_tsn_in_sack, tsn))
*highest_new_tsn_in_sack = tsn;
bytes_acked += sctp_data_size(tchunk);
The current code will set the state if it hasn't been set yet. Why is
this needed?
Because in line 1420 ~ 1440 The SFR-CACC algorithms use tsn_gap_acked.
That "if block" would never be triggered because the varaiable's been
set. That's why I move the "state changing sentence" to the end of the
iteration.
quoted
Now there is an issue with tracking highest_new_tsn_in_sack. The spec
is a little vague on this, but the highest_new_tsn_in_sack only supposed
to track tsns that have not been resent. If a tsn has been reneged, and
then sent again, it is not considered 'new' thus should not count
toward highest_new_tsn_in_sack. We currently do not track this right.
I'll try to figure this out.
So the solution that's been proposed before is to move the CACC block up
and merge it with the !tsn_gap_acked block. This requires additional
change though to only mark highest_new_tsn if the chunk has not been
retransmitted (which you've added in a prior patch).
-vlad
quoted
-vlad
-vlad
quoted
} else {
if (tchunk->tsn_gap_acked) {
pr_debug("%s: receiver reneged on data TSN:0x%x\n",
tsn_gap_acked is an important state flag in chunk, which indicates if
the
chunk has been acked in gap reports before.
Actually, this bit indicates simply that the chunk has been acked. It
doesn't state whether it's been acked in a gap report or via
cumulative tsn.
Thanks for pointing this out. Sorry for not having made that clear.
quoted
quoted
SFR-CACC algorithm depends on this
variable. So set this at the end of each iteration, otherwise the
SFR-CACC
algorithm would never be toggled.
Signed-off-by: Chang Xiangzhong <redacted>
---
net/sctp/outqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
sctp_outq *q,
* while DATA was outstanding).
*/
if (!tchunk->tsn_gap_acked) {
- tchunk->tsn_gap_acked = 1;
if (TSN_lt(*highest_new_tsn_in_sack, tsn))
*highest_new_tsn_in_sack = tsn;
bytes_acked += sctp_data_size(tchunk);
The current code will set the state if it hasn't been set yet. Why is
this needed?
Because in line 1420 ~ 1440 The SFR-CACC algorithms use tsn_gap_acked.
That "if block" would never be triggered because the varaiable's been
set. That's why I move the "state changing sentence" to the end of the
iteration.
quoted
Now there is an issue with tracking highest_new_tsn_in_sack. The spec
is a little vague on this, but the highest_new_tsn_in_sack only supposed
to track tsns that have not been resent. If a tsn has been reneged, and
then sent again, it is not considered 'new' thus should not count
toward highest_new_tsn_in_sack. We currently do not track this right.
I'll try to figure this out.
So the solution that's been proposed before is to move the CACC block up
and merge it with the !tsn_gap_acked block. This requires additional
change though to only mark highest_new_tsn if the chunk has not been
retransmitted (which you've added in a prior patch).
-vlad
Yeah, I've mixed that up with a prior patch. How was the previous patch?
Was it approved?
-chang
quoted
quoted
-vlad
-vlad
quoted
} else {
if (tchunk->tsn_gap_acked) {
pr_debug("%s: receiver reneged on data TSN:0x%x\n",
Hi,
Could you please why a **reneged** newly acked TSN doesn't qualify the
highest_new_tsn? What's the wrongs of doing that?
I've been thinking a few scenarios, but I couldn't figure out what's
wrong with that.
Hi,
Could you please why a **reneged** newly acked TSN doesn't qualify the
highest_new_tsn? What's the wrongs of doing that?
I've been thinking a few scenarios, but I couldn't figure out what's
wrong with that.
The spec is a bit conflicting on this topic. Here is what it says
Section 7.2.4
Miss indications SHOULD follow the HTNA (Highest TSN Newly
Acknowledged) algorithm. For each incoming SACK, miss indications
are incremented only for missing TSNs prior to the highest TSN newly
acknowledged in the SACK. A newly acknowledged DATA chunk is one not
previously acknowledged in a SACK.
But section 6.2.1 says:
iii) If the SACK is missing a TSN that was previously acknowledged
via a Gap Ack Block (e.g., the data receiver reneged on the
data), then consider the corresponding DATA that might be
possibly missing: Count one miss indication towards Fast
Retransmit as described in Section 7.2.4, and if no
retransmit timer is running for the destination address to
which the DATA chunk was originally transmitted, then T3-rtx
is started for that destination address.
So, the question becomes does the reneged tsn update HTNA counter? It
has been acked by a previous SACK, but 6.2.1 says to treat as missing.
The more I look at this the more I think we should continue doing what
we are doing which is following section 6.2.1.
-vlad