1. 15 Sep, 2010 3 commits
    • Gerrit Renker's avatar
      dccp ccid-3: Simplify and consolidate tx_parse_options · 37efb03f
      Gerrit Renker authored
      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: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
      37efb03f
    • Gerrit Renker's avatar
      dccp ccid-3: remove buggy RTT-sampling history lookup · d2c72630
      Gerrit Renker authored
      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: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
      d2c72630
    • Gerrit Renker's avatar
      dccp ccid-3: A lower bound for the inter-packet scheduling algorithm · 20cbd3e1
      Gerrit Renker authored
      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_gran/2 = 10^6/(2*HZ) <= 1000, so that
          t_delta' = MAX(1000, t_delta) = 1000 (constant value);
      
       b) when HZ < 500, then t_delta = 1/2*MIN(rtt, t_ipi, t_gran) <= t_gran/2,
          so that 1000 <= t_delta' <= t_gran/2.
      
      The maximum error of using a constant t_delta in (b) is less than half a jiffy.
      
      Fix:
      ----
      The patch replaces t_delta with a constant, whose value depends on CONFIG_HZ,
      changing the above algorithm to:
      
        if (t_distance >= 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: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
      20cbd3e1
  2. 14 Sep, 2010 11 commits
  3. 12 Sep, 2010 1 commit
  4. 10 Sep, 2010 25 commits