17 Feb, 2014

1 commit

  • dccp tfrc: revert

    This reverts 6aee49c558de ("dccp: make local variable static") since
    the variable tfrc_debug is referenced by the tfrc_pr_debug(fmt, ...)
    macro when TFRC debugging is enabled. If it is enabled, use of the
    macro produces a compilation error.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     

05 Jan, 2014

1 commit


20 Oct, 2013

1 commit

  • There are a mix of function prototypes with and without extern
    in the kernel sources. Standardize on not using extern for
    function prototypes.

    Function prototypes don't need to be written with extern.
    extern is assumed by the compiler. Its use is as unnecessary as
    using auto to declare automatic/local variables in a block.

    Signed-off-by: Joe Perches
    Signed-off-by: David S. Miller

    Joe Perches
     

12 Jan, 2013

1 commit

  • The CONFIG_EXPERIMENTAL config item has not carried much meaning for a
    while now and is almost always enabled by default. As agreed during the
    Linux kernel summit, remove it from any "depends on" lines in Kconfigs.

    CC: Gerrit Renker
    CC: "David S. Miller"
    Signed-off-by: Kees Cook
    Acked-by: David S. Miller
    Acked-by: Gerrit Renker

    Kees Cook
     

16 Aug, 2012

1 commit

  • The CCID3 code fails to initialize the trailing padding bytes of struct
    tfrc_tx_info added for alignment on 64 bit architectures. It that for
    potentially leaks four bytes kernel stack via the getsockopt() syscall.
    Add an explicit memset(0) before filling the structure to avoid the
    info leak.

    Signed-off-by: Mathias Krause
    Cc: Gerrit Renker
    Signed-off-by: David S. Miller

    Mathias Krause
     

11 Jul, 2012

1 commit


16 Apr, 2012

1 commit


04 Mar, 2012

1 commit

  • This replaces an unjustified BUG_ON(), which could get triggered under normal
    conditions: X_calc can be 0 when p > 0. X would in this case be set to the
    minimum, s/t_mbi. Its replacement avoids t_ipi = 0 (unbounded sending rate).

    Thanks to Jordi, Victor and Xavier who reported this.

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald

    Gerrit Renker
     

20 Dec, 2011

1 commit

  • module_param(bool) used to counter-intuitively take an int. In
    fddd5201 (mid-2009) we allowed bool or int/unsigned int using a messy
    trick.

    It's time to remove the int/unsigned int option. For this version
    it'll simply give a warning, but it'll break next kernel version.

    (Thanks to Joe Perches for suggesting coccinelle for 0/1 -> true/false).

    Cc: "David S. Miller"
    Cc: netdev@vger.kernel.org
    Signed-off-by: Rusty Russell
    Signed-off-by: David S. Miller

    Rusty Russell
     

01 Nov, 2011

1 commit


01 Aug, 2011

4 commits

  • This patch causes CCID-2 to check the Ack Ratio after reducing the congestion
    window. If the Ack Ratio is greater than the congestion window, it is
    reduced. This prevents timeouts caused by an Ack Ratio larger than the
    congestion window.

    In this situation, we choose to set the Ack Ratio to half the congestion window
    (or one if that's zero) so that if we loose one ack we don't trigger a timeout.

    Signed-off-by: Samuel Jero
    Acked-by: Gerrit Renker

    Samuel Jero
     
  • This patch fixes an issue where CCID-2 will not increase the congestion
    window for numerous RTTs after an idle period, application-limited period,
    or a loss once the algorithm is in Congestion Avoidance.

    What happens is that, when CCID-2 is in Congestion Avoidance mode, it will
    increase hc->tx_packets_acked by one for every packet and will increment cwnd
    every cwnd packets. However, if there is now an idle period in the connection,
    cwnd will be reduced, possibly below the slow start threshold. This will
    cause the connection to go into Slow Start. However, in Slow Start CCID-2
    performs this test to increment cwnd every second ack:

    ++hc->tx_packets_acked == 2

    Unfortunately, this will be incorrect, if cwnd previous to the idle period
    was larger than 2 and if tx_packets_acked was close to cwnd. For example:
    cwnd=50 and tx_packets_acked=45.

    In this case, the current code, will increment tx_packets_acked until it
    equals two, which will only be once tx_packets_acked (an unsigned 32-bit
    integer) overflows.

    My fix is simply to change that test for tx_packets_acked greater than or
    equal to two in slow start.

    Signed-off-by: Samuel Jero
    Acked-by: Gerrit Renker

    Samuel Jero
     
  • Add a check to prevent CCID-2 from increasing the cwnd greater than the
    Sequence Window.

    When the congestion window becomes bigger than the Sequence Window, CCID-2
    will attempt to keep more data in the network than the DCCP Sequence Window
    code considers possible. This results in the Sequence Window code issuing
    a Sync, thereby inducing needless overhead. Further, if this occurs at the
    sender, CCID-2 will never detect the problem because the Acks it receives
    will indicate no losses. I have seen this cause a drop of 1/3rd in throughput
    for a connection.

    Also add code to adjust the Sequence Window to be about 5 times the number of
    packets in the network (RFC 4340, 7.5.2) and to adjust the Ack Ratio so that
    the remote Sequence Window will hold about 5 times the number of packets in
    the network. This allows the congestion window to increase correctly without
    being limited by the Sequence Window.

    Signed-off-by: Samuel Jero
    Acked-by: Gerrit Renker

    Samuel Jero
     
  • This uses the new feature-negotiation framework to signal Ack Ratio changes,
    as required by RFC 4341, sec. 6.1.2.

    That raises some problems with CCID-2, which at the moment can not cope
    gracefully with Ack Ratios > 1. Since these issues are not directly related
    to feature negotiation, they are marked by a FIXME.

    Signed-off-by: Gerrit Renker
    Signed-off-by: Samuel Jero
    Acked-by: Ian McDonald

    Gerrit Renker
     

05 Jul, 2011

3 commits

  • CCID-2's cwnd increases like TCP during slow-start, which has implications for
    * the local Sequence Window value (should be > cwnd),
    * the Ack Ratio value.
    Hence an exponential growth, if it does not reflect the actual network
    conditions, can quickly lead to instability.

    This patch adds congestion-window validation (RFC2861) to CCID-2:
    * cwnd is constrained if the sender is application limited;
    * cwnd is reduced after a long idle period, as suggested in the '90 paper
    by Van Jacobson, in RFC 2581 (sec. 4.1);
    * cwnd is never reduced below the RFC 3390 initial window.

    As marked in the comments, the code is actually almost a direct copy of the
    TCP congestion-window-validation algorithms. By continuing this work, it may
    in future be possible to use the TCP code (not possible at the moment).

    The mechanism can be turned off using a module parameter. Sampling of the
    currently-used window (moving-maximum) is however done constantly; this is
    used to determine the expected window, which can be exploited to regulate
    DCCP's Sequence Window value.

    This patch also sets slow-start-after-idle (RFC 4341, 5.1), i.e. it behaves like
    TCP when net.ipv4.tcp_slow_start_after_idle = 1.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This replaces a switch statement with a test, using the equivalent
    function dccp_data_packet(skb). It also doubles the range of the field
    `rx_num_data_pkts' by changing the type from `int' to `u32', avoiding
    signed/unsigned comparison with the u16 field `dccps_r_ack_ratio'.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This moves CCID-2's initial window function into the header file, since several
    parts throughout the CCID-2 code need to call it (CCID-2 still uses RFC 3390).

    Signed-off-by: Gerrit Renker
    Acked-by: Leandro Melo de Sales

    Gerrit Renker
     

03 Feb, 2011

1 commit


15 Nov, 2010

1 commit

  • This patch replaces an almost identical replication of code: large parts
    of dccp_parse_options() re-appeared as ccid2_ackvector() in ccid2.c.

    Apart from the duplication, this caused two more problems:
    1. CCIDs should not need to be concerned with parsing header options;
    2. one can not assume that Ack Vectors appear as a contiguous area within an
    skb, it is legal to insert other options and/or padding in between. The
    current code would throw an error and stop reading in such a case.

    Since Ack Vectors provide CCID-specific information, they are now processed
    by the CCID directly, separating this functionality from the main DCCP code.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

11 Nov, 2010

1 commit

  • This patch brings the Ack Vector interface up to date. Its main purpose is
    to lay the basis for the subsequent patches of this set, which will use the
    new data structure fields and routines.

    There are no real algorithmic changes, rather an adaptation:

    (1) Replaced the static Ack Vector size (2) with a #define so that it can
    be adapted (with low loss / Ack Ratio, a value of 1 works, so 2 seems
    to be sufficient for the moment) and added a solution so that computing
    the ECN nonce will continue to work - even with larger Ack Vectors.

    (2) Replaced the #defines for Ack Vector states with a complete enum.

    (3) Replaced #defines to compute Ack Vector length and state with general
    purpose routines (inlines), and updated code to use these.

    (4) Added a `tail' field (conversion to circular buffer in subsequent patch).

    (5) Updated the (outdated) documentation for Ack Vector struct.

    (6) All sequence number containers now trimmed to 48 bits.

    (7) Removal of unused bits:
    * removed dccpav_ack_nonce from struct dccp_ackvec, since this is already
    redundantly stored in the `dccpavr_ack_nonce' (of Ack Vector record);
    * removed Elapsed Time for Ack Vectors (it was nowhere used);
    * replaced semantics of dccpavr_sent_len with dccpavr_ack_runlen, since
    the code needs to be able to remember the old run length;
    * reduced the de-/allocation routines (redundant / duplicate tests).

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

29 Oct, 2010

2 commits

  • This updates CCID-2 to use the CCID dequeuing mechanism, converting from
    previous continuous-polling to a now event-driven mechanism.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This patch reorganises the return value convention of the CCID TX sending
    function, to permit more flexible schemes, as required by subsequent patches.

    Currently the convention is
    * values < 0 mean error,
    * a value == 0 means "send now", and
    * a value x > 0 means "send in x milliseconds".

    The patch provides symbolic constants and a function to interpret return values.

    In addition, it caps the maximum positive return value to 0xFFFF milliseconds,
    corresponding to 65.535 seconds. This is possible since in CCID-3/4 the
    maximum possible inter-packet gap is fixed at t_mbi = 64 sec.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     

12 Oct, 2010

1 commit

  • This removes the argument `more' from ccid_hc_tx_packet_sent, since it was
    nowhere used in the entire code.

    (Btw, this argument was not even used in the original KAME code where the
    function initially came from; compare the variable moreToSend in the
    freebsd61-dccp-kame-28.08.2006.patch kept by Emmanuel Lochin.)

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

24 Sep, 2010

1 commit


21 Sep, 2010

4 commits

  • The `options_received' struct is redundant, since it re-duplicates the existing
    `p' and `x_recv' fields. This patch removes the sub-struct and migrates the
    format conversion operations to ccid3_hc_tx_parse_options().

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This adds a function to take care of the following, separate cases occurring in
    the computation of the Loss Rate p:

    * 1/(2^32-1) is mapped into 0% as per RFC 4342, 8.5;
    * 1/0 is mapped into 100%, the maximum;
    * to avoid that p = 1/x is rounded down to 0 when x is very large, since this
    means accidentally re-entering slow-start indicated by p == 0, the minimum
    resolution value of p is now returned instead;
    * a bug in ccid3_hc_rx_getsockopt is fixed: 1/0 was mapped into ~0U.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This patch is thanks to an investigation by Leandro Sales de Melo and his
    colleagues. They worked out two state diagrams which highlight the fact that
    the xxx_TERM states in CCID-3/4 are in fact not necessary.

    And this can be confirmed by in turn looking at the code: the xxx_TERM states
    are only ever set in ccid3_hc_{rx,tx}_exit(): when CCID-3 sets the state
    to xxx_TERM, it is at a time where no more processing should be going on,
    hence it is not necessary to introduce a dedicated exit state - this is already
    implied by unloading the CCID.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This
    1. adds packet type information to ccid_hc_{rx,tx}_parse_options(). This is
    necessary, since table 3 in RFC 4340, 5.8 leaves it to the CCIDs to state
    which options may (not) appear on what packet type.

    2. adds such a check for CCID-3's {Loss Event, Receive} Rate as specified in
    RFC 4340 8.3 ("Receive Rate options MUST NOT be sent on DCCP-Data packets")
    and 8.5 ("Loss Event Rate options MUST NOT be sent on DCCP-Data packets").

    3. removes an unused argument `idx' from ccid_hc_{rx,tx}_parse_options(). This
    is also no longer necessary, since the CCID-specific option-parsing routines
    are passed every single parameter of the type-length-value option encoding.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

15 Sep, 2010

3 commits

  • This simplifies and consolidates the TX option-parsing code:

    1. The Loss Intervals option is not currently used, so dead code related to
    this option is removed. I am aware of no plans to support the option, but
    if someone wants to implement it (e.g. for inter-op tests), it is better
    to start afresh than having to also update currently unused code.

    2. The Loss Event and Receive Rate options have a lot of code in common (both
    are 32 bit, both have same length etc.), so this is consolidated.

    3. The test against GSR is not necessary, because
    - on first loading CCID3, ccid_new() zeroes out all fields in the socket;
    - ccid3_hc_tx_packet_recv() treats 0 and ~0U equivalently, due to

    pinv = opt_recv->ccid3or_loss_event_rate;
    if (pinv == ~0U || pinv == 0)
    hctx->p = 0;

    - as a result, the sequence number field is removed from opt_recv.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This removes the RTT-sampling function tfrc_tx_hist_rtt(), since

    1. it suffered from complex passing of return values (the return value both
    indicated successful lookup while the value doubled as RTT sample);

    2. when for some odd reason the sample value equalled 0, this triggered a bug
    warning about "bogus Ack", due to the ambiguity of the return value;

    3. on a passive host which has not sent anything the TX history is empty and
    thus will lead to unwanted "bogus Ack" warnings such as
    ccid3_hc_tx_packet_recv: server(e7b7d518): DATAACK with bogus ACK-28197148
    ccid3_hc_tx_packet_recv: server(e7b7d518): DATAACK with bogus ACK-26641606.

    The fix is to replace the implicit encoding by performing the steps manually.

    Furthermore, the "bogus Ack" warning has been removed, since it can actually be
    triggered due to several reasons (network reordering, old packet, (3) above),
    hence it is not very useful.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     
  • This fixes a subtle bug in the calculation of the inter-packet gap and shows
    that t_delta, as it is currently used, is not needed.

    The algorithm from RFC 5348, 8.3 below continually computes a send time t_nom,
    which is initialised with the current time t_now; t_gran = 1E6 / HZ specifies
    the scheduling granularity, s the packet size, and X the sending rate:

    t_distance = t_nom - t_now; // in microseconds
    t_delta = min(t_ipi, t_gran) / 2; // `delta' parameter in microseconds

    if (t_distance >= t_delta) {
    reschedule after (t_distance / 1000) milliseconds;
    } else {
    t_ipi = s / X; // inter-packet interval in usec
    t_nom += t_ipi; // compute the next send time
    send packet now;
    }

    Problem:
    --------
    Rescheduling requires a conversion into milliseconds (sk_reset_timer()). The
    highest jiffy resolution with HZ=1000 is 1 millisecond, so using a higher
    granularity does not make much sense here.

    As a consequence, values of t_distance < 1000 are truncated to 0. This issue
    has so far been resolved by using instead

    if (t_distance >= t_delta + 1000)
    reschedule after (t_distance / 1000) milliseconds;

    This is unnecessarily large, a lower bound is t_delta' = max(t_delta, 1000).
    And it implies a further simplification:

    a) when HZ >= 500, then t_delta = t_delta')
    reschedule after (t_distance / 1000) milliseconds;

    where t_delta' = 10^6/(2*HZ) if HZ < 500, and t_delta' = 1000 otherwise.

    Signed-off-by: Gerrit Renker

    Gerrit Renker
     

31 Aug, 2010

5 commits

  • This makes RTAX_RTO_MIN also available to CCID-3, replacing the compile-time
    RTO lower bound with a per-route tunable value.

    The original Kconfig option solved the problem that a very low RTT (in the
    order of HZ) can trigger too frequent and unnecessary reductions of the
    sending rate.

    This tunable does not affect the initial RTO value of 2 seconds specified in
    RFC 5348, section 4.2 and Appendix B. But like the hardcoded Kconfig value,
    it allows to adapt to network conditions.

    The same effect as the original Kconfig option of 100ms is now achieved by

    > ip route replace to unicast 192.168.0.0/24 rto_min 100j dev eth0

    (assuming HZ=1000).

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • Using a fixed RTO_MIN of 0.2 seconds was found to cause problems for CCID-2
    over 802.11g: at least once per session there was a spurious timeout. It
    helped to then increase the the value of RTO_MIN over this link.

    Since the problem is the same as in TCP, this patch makes the solution from
    commit "05bb1fad1cde025a864a90cfeb98dcbefe78a44a"
    "[TCP]: Allow minimum RTO to be configurable via routing metrics."
    available to DCCP.

    This avoids reinventing the wheel, so that e.g. the following works in the
    expected way now also for CCID-2:

    > ip route change 10.0.0.2 rto_min 800 dev ath0

    Luckily this useful rto_min function was recently moved to net/tcp.h,
    which simplifies sharing code originating from TCP.

    Documentation also updated (plus minor whitespace fixes).

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This patch consolidates initial-window code common to TCP and CCID-2:
    * TCP uses RFC 3390 in a packet-oriented manner (tcp_input.c) and
    * CCID-2 uses RFC 3390 in packet-oriented manner (RFC 4341).

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This removes the wrappers around the sk timer functions, since not much is
    gained from using them: the BUG_ON in start_rto_timer will never trigger
    since that function is called only if:

    * the RTO timer expires (rto_expire, and then timer_pending() is false);
    * in tx_packet_sent only if !timer_pending() (BUG_ON is redundant here);
    * previously in new_ack, after stopping the timer (timer_pending() false).

    Removing the wrappers also clears the way for eventually replacing the
    RTO timer with the icsk-retransmission-timer, as it is already part of the
    DCCP socket.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • Since CCID-2 is de facto a mini implementation of TCP, it makes sense to share
    as much code as possible.

    Hence this patch aligns CCID-2 timestamping with TCP timestamping.
    This also halves the space consumption (on 64-bit systems).

    The necessary include file is already included by way of
    net/dccp.h. Redundant includes have been removed.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     

24 Aug, 2010

4 commits

  • The current CCID-2 RTT estimator code is in parts broken and lags behind the
    suggestions in RFC2988 of using scaled variants for SRTT/RTTVAR.

    That code is replaced by the present patch, which reuses the Linux TCP RTT
    estimator code.

    Further details:
    ----------------
    1. The minimum RTO of previously one second has been replaced with TCP's, since
    RFC4341, sec. 5 says that the minimum of 1 sec. (suggested in RFC2988, 2.4)
    is not necessary. Instead, the TCP_RTO_MIN is used, which agrees with DCCP's
    concept of a default RTT (RFC 4340, 3.4).
    2. The maximum RTO has been set to DCCP_RTO_MAX (64 sec), which agrees with
    RFC2988, (2.5).
    3. De-inlined the function ccid2_new_ack().
    4. Added a FIXME: the RTT is sampled several times per Ack Vector, which will
    give the wrong estimate. It should be replaced with one sample per Ack.
    However, at the moment this can not be resolved easily, since
    - it depends on TX history code (which also needs some work),
    - the cleanest solution is not to use the `sent' time at all (saves 4 bytes
    per entry) and use DCCP timestamps / elapsed time to estimated the RTT,
    which however is non-trivial to get right (but needs to be done).

    Reasons for reusing the Linux TCP estimator algorithm:
    ------------------------------------------------------
    Some time was spent to find a better alternative, using basic RFC2988 as a first
    step. Further analysis and experimentation showed that the Linux TCP RTO
    estimator is superior to a basic RFC2988 implementation. A summary is on
    http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/ccid2/rto_estimator/

    In addition, this estimator fared well in a recent empirical evaluation:

    Rewaskar, Sushant, Jasleen Kaur and F. Donelson Smith.
    A Performance Study of Loss Detection/Recovery in Real-world TCP
    Implementations. Proceedings of 15th IEEE International
    Conference on Network Protocols (ICNP-07), 2007.

    Thus there is significant benefit in reusing the existing TCP code.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This removes the dec_pipe function and improves the way the RTO timer is rearmed
    when a new acknowledgment comes in.

    Details and justification for removal:
    --------------------------------------
    1) The BUG_ON in dec_pipe is never triggered: pipe is only decremented for TX
    history entries between tail and head, for which it had previously been
    incremented in tx_packet_sent; and it is not decremented twice for the same
    entry, since it is
    - either decremented when a corresponding Ack Vector cell in state 0 or 1
    was received (and then ccid2s_acked==1),
    - or it is decremented when ccid2s_acked==0, as part of the loss detection
    in tx_packet_recv (and hence it can not have been decremented earlier).

    2) Restarting the RTO timer happens for every single entry in each Ack Vector
    parsed by tx_packet_recv (according to RFC 4340, 11.4 this can happen up to
    16192 times per Ack Vector).

    3) The RTO timer should not be restarted when all outstanding data has been
    acknowledged. This is currently done similar to (2), in dec_pipe, when
    pipe has reached 0.

    The patch onsolidates the code which rearms the RTO timer, combining the
    segments from new_ack and dec_pipe. As a result, the code becomes clearer
    (compare with tcp_rearm_rto()).

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • This removes the ccid2_hc_tx_check_sanity function: it is redundant.

    Details:

    The tx_check_sanity function performs three tests:
    1) it checks that the circular TX list is sorted
    - in ascending order of sequence number (ccid2s_seq)
    - and time (ccid2s_sent),
    - in the direction from `tail' (hctx_seqt) to `head' (hctx_seqh);
    2) it ensures that the entire list has the length seqbufc * CCID2_SEQBUF_LEN;
    3) it ensures that pipe equals the number of packets that were not
    marked `acked' (ccid2s_acked) between `tail' and `head'.

    The following argues that each of these tests is redundant, this can be verified
    by going through the code.

    (1) is not necessary, since both time and GSS increase from one packet to the
    next, so that subsequent insertions in tx_packet_sent (which advance the `head'
    pointer) will be in ascending order of time and sequence number.

    In (2), the length of the list is always equal to seqbufc times CCID2_SEQBUF_LEN
    (set to 1024) unless allocation caused an earlier failure, because:
    * at initialisation (tx_init), there is one chunk of size 1024 and seqbufc=1;
    * subsequent calls to tx_alloc_seq take place whenever head->next == tail in
    tx_packet_sent; then a new chunk of size 1024 is inserted between head and
    tail, and seqbufc is incremented by one.

    To show that (3) is redundant requires looking at two cases.

    The `pipe' variable of the TX socket is incremented only in tx_packet_sent, and
    decremented in tx_packet_recv. When head == tail (TX history empty) then pipe
    should be 0, which is the case directly after initialisation and after a
    retransmission timeout has occurred (ccid2_hc_tx_rto_expire).

    The first case involves parsing Ack Vectors for packets recorded in the live
    portion of the buffer, between tail and head. For each packet marked by the
    receiver as received (state 0) or ECN-marked (state 1), pipe is decremented by
    one, so for all such packets the BUG_ON in tx_check_sanity will not trigger.

    The second case is the loss detection in the second half of tx_packet_recv,
    below the comment "Check for NUMDUPACK".

    The first while-loop here ensures that the sequence number of `seqp' is either
    above or equal to `high_ack', or otherwise equal to the highest sequence number
    sent so far (of the entry head->prev, as head points to the next unsent entry).
    The next while-loop ("while (1)") counts the number of acked packets starting
    from that position of seqp, going backwards in the direction from head->prev to
    tail. If NUMDUPACK=3 such packets were counted within this loop, `seqp' points
    to the last acknowledged packet of these, and the "if (done == NUMDUPACK)" block
    is entered next.
    The while-loop contained within that block in turn traverses the list backwards,
    from head to tail; the position of `seqp' is saved in the variable `last_acked'.
    For each packet not marked as `acked', a congestion event is triggered within
    the loop, and pipe is decremented. The loop terminates when `seqp' has reached
    `tail', whereupon tail is set to the position previously stored in `last_acked'.
    Thus, between `last_acked' and the previous position of `tail',
    - pipe has been decremented earlier if the packet was marked as state 0 or 1;
    - pipe was decremented if the packet was not marked as acked.
    That is, pipe has been decremented by the number of packets between `last_acked'
    and the previous position of `tail'. As a consequence, pipe now again reflects
    the number of packets which have not (yet) been acked between the new position
    of tail (at `last_acked') and head->prev, or 0 if head==tail. The result is that
    the BUG_ON condition in check_sanity will also not be triggered, hence the test
    (3) is also redundant.

    Signed-off-by: Gerrit Renker
    Signed-off-by: David S. Miller

    Gerrit Renker
     
  • The CCIDs are activated as last of the features, at the end of the handshake,
    were the LISTEN state of the master socket is inherited into the server
    state of the child socket. Thus, the only states visible to CCIDs now are
    OPEN/PARTOPEN, and the closing states.

    This allows to remove tests which were previously necessary to protect
    against referencing a socket in the listening state (in CCID-3), but which
    now have become redundant.

    As a further byproduct of enabling the CCIDs only after the connection has been
    fully established, several typecast-initialisations of ccid3_hc_{rx,tx}_sock
    can now be eliminated:
    * the CCID is loaded, so it is not necessary to test if it is NULL,
    * if it is possible to load a CCID and leave the private area NULL, then this
    is a bug, which should crash loudly - and earlier,
    * the test for state==OPEN || state==PARTOPEN now reduces only to the closing
    phase (e.g. when the node has received an unexpected Reset).

    Signed-off-by: Gerrit Renker
    Acked-by: Ian McDonald
    Signed-off-by: David S. Miller

    Gerrit Renker