Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759478Ab3JORZN (ORCPT ); Tue, 15 Oct 2013 13:25:13 -0400 Received: from mail-qe0-f49.google.com ([209.85.128.49]:45105 "EHLO mail-qe0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758936Ab3JORZK (ORCPT ); Tue, 15 Oct 2013 13:25:10 -0400 Message-ID: <525D7A72.70200@gmail.com> Date: Tue, 15 Oct 2013 13:25:06 -0400 From: Vlad Yasevich User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: Chang Xiangzhong CC: nhorman@tuxdriver.com, davem@davemloft.net, linux-sctp@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] For for each TSN t being newly acked (Not only cumulatively, but also SELECTIVELY) cacc_saw_newack should be set to 1. References: <1381856348-15503-1-git-send-email-changxiangzhong@gmail.com> In-Reply-To: <1381856348-15503-1-git-send-email-changxiangzhong@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7672 Lines: 207 On 10/15/2013 12:59 PM, Chang Xiangzhong wrote: > Signed-off-by: Xiangzhong Chang > --- > net/sctp/outqueue.c | 142 ++++++++++++++++++++++++--------------------------- > 1 file changed, 68 insertions(+), 74 deletions(-) > > diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c > index 94df758..f10d848 100644 > --- a/net/sctp/outqueue.c > +++ b/net/sctp/outqueue.c > @@ -1357,84 +1357,78 @@ static void sctp_check_transmitted(struct sctp_outq *q, > > tsn = ntohl(tchunk->subh.data_hdr->tsn); > if (sctp_acked(sack, tsn)) { > - /* If this queue is the retransmit queue, the > - * retransmit timer has already reclaimed > - * the outstanding bytes for this chunk, so only > - * count bytes associated with a transport. > - */ > - if (transport) { > - /* If this chunk is being used for RTT > - * measurement, calculate the RTT and update > - * the RTO using this value. > - * > - * 6.3.1 C5) Karn's algorithm: RTT measurements > - * MUST NOT be made using packets that were > - * retransmitted (and thus for which it is > - * ambiguous whether the reply was for the > - * first instance of the packet or a later > - * instance). > - */ > - if (!tchunk->tsn_gap_acked && > - tchunk->rtt_in_progress) { > - tchunk->rtt_in_progress = 0; > - rtt = jiffies - tchunk->sent_at; > - sctp_transport_update_rto(transport, > - rtt); > - } > - } > - > - /* If the chunk hasn't been marked as ACKED, > - * mark it and account bytes_acked if the > - * chunk had a valid transport (it will not > - * have a transport if ASCONF had deleted it > - * while DATA was outstanding). > - */ > if (!tchunk->tsn_gap_acked) { > - tchunk->tsn_gap_acked = 1; > - *highest_new_tsn_in_sack = tsn; > - bytes_acked += sctp_data_size(tchunk); > - if (!tchunk->transport) > - migrate_bytes += sctp_data_size(tchunk); > - forward_progress = true; > + /* If this queue is the retransmit queue, the > + * retransmit timer has already reclaimed > + * the outstanding bytes for this chunk, so only > + * count bytes associated with a transport. > + * > + * If this chunk is being used for RTT > + * measurement, calculate the RTT and update > + * the RTO using this value. > + * > + * 6.3.1 C5) Karn's algorithm: RTT measurements > + * MUST NOT be made using packets that were > + * retransmitted (and thus for which it is > + * ambiguous whether the reply was for the > + * first instance of the packet or a later > + * instance). > + */ > + if (transport && tchunk->rtt_in_progress) { > + tchunk->rtt_in_progress = 0; > + rtt = jiffies - tchunk->sent_at; > + sctp_transport_update_rto(transport, > + rtt); > + } > + > + /* If the chunk hasn't been marked as ACKED, > + * mark it and account bytes_acked if the > + * chunk had a valid transport (it will not > + * have a transport if ASCONF had deleted it > + * while DATA was outstanding). > + */ > + tchunk->tsn_gap_acked = 1; > + *highest_new_tsn_in_sack = tsn; > + bytes_acked += sctp_data_size(tchunk); > + if (!tchunk->transport) > + migrate_bytes += sctp_data_size(tchunk); > + forward_progress = true; > + > + /* > + * SFR-CACC algorithm: > + * 2) If the SACK contains gap acks > + * and the flag CHANGEOVER_ACTIVE is > + * set the receiver of the SACK MUST > + * take the following action: > + * > + * B) For each TSN t being acked that > + * has not been acked in any SACK so > + * far, set cacc_saw_newack to 1 for > + * the destination that the TSN was > + * sent to. > + */ > + if (transport && > + sack->num_gap_ack_blocks && > + q->asoc->peer.primary_path->cacc. > + changeover_active) > + transport->cacc.cacc_saw_newack = 1; > } Indents should be tab based. This is a bit more of a re-write that is needed for the this particualar patch. What's wrong with just doing this? @@ -1396,6 +1396,25 @@ static void sctp_check_transmitted(struct sctp_outq *q, if (!tchunk->transport) migrate_bytes += sctp_data_size(tchunk); forward_progress = true; + + /* + * SFR-CACC algorithm: + * 2) If the SACK contains gap acks + * and the flag CHANGEOVER_ACTIVE is + * set the receiver of the SACK MUST + * take the following action: + * + * B) For each TSN t being acked that + * has not been acked in any SACK so + * far, set cacc_saw_newack to 1 for + * the destination that the TSN was + * sent to. + */ + if (transport && + sack->num_gap_ack_blocks && + q->asoc->peer.primary_path->cacc. + changeover_active) + transport->cacc.cacc_saw_newack = 1; } if (TSN_lte(tsn, sack_ctsn)) { -vlad > > if (TSN_lte(tsn, sack_ctsn)) { > - /* RFC 2960 6.3.2 Retransmission Timer Rules > - * > - * R3) Whenever a SACK is received > - * that acknowledges the DATA chunk > - * with the earliest outstanding TSN > - * for that address, restart T3-rtx > - * timer for that address with its > - * current RTO. > - */ > - restart_timer = 1; > - forward_progress = true; > - > - if (!tchunk->tsn_gap_acked) { > - /* > - * SFR-CACC algorithm: > - * 2) If the SACK contains gap acks > - * and the flag CHANGEOVER_ACTIVE is > - * set the receiver of the SACK MUST > - * take the following action: > - * > - * B) For each TSN t being acked that > - * has not been acked in any SACK so > - * far, set cacc_saw_newack to 1 for > - * the destination that the TSN was > - * sent to. > - */ > - if (transport && > - sack->num_gap_ack_blocks && > - q->asoc->peer.primary_path->cacc. > - changeover_active) > - transport->cacc.cacc_saw_newack > - = 1; > - } > - > - list_add_tail(&tchunk->transmitted_list, > - &q->sacked); > + /* RFC 2960 6.3.2 Retransmission Timer Rules > + * > + * R3) Whenever a SACK is received > + * that acknowledges the DATA chunk > + * with the earliest outstanding TSN > + * for that address, restart T3-rtx > + * timer for that address with its > + * current RTO. > + */ > + restart_timer = 1; > + forward_progress = true; > + > + list_add_tail(&tchunk->transmitted_list, > + &q->sacked); > } else { > /* RFC2960 7.2.4, sctpimpguide-05 2.8.2 > * M2) Each time a SACK arrives reporting > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/