Commit d196c9a5 authored by Ivo Calado's avatar Ivo Calado Committed by Gerrit Renker

dccp: generalise data-loss condition

This patch generalises the task of determining data loss from RFC 4340, 7.7.1.

Let S_A, S_B be sequence numbers such that S_B is "after" S_A, and let
N_B be the NDP count of packet S_B. Then, using modulo-2^48 arithmetic,
 D = S_B - S_A - 1  is an upper bound of the number of lost data packets,
 D - N_B            is an approximation of the number of lost data packets
                    (there are cases where this is not exact).

The patch implements this as
 dccp_loss_count(S_A, S_B, N_B) := max(S_B - S_A - 1 - N_B, 0)
Signed-off-by: default avatarIvo Calado <ivocalado@embedded.ufcg.edu.br>
Signed-off-by: default avatarErivaldo Xavier <desadoc@gmail.com>
Signed-off-by: default avatarLeandro Sales <leandroal@gmail.com>
Signed-off-by: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
parent baf9e782
...@@ -153,18 +153,27 @@ static inline u64 max48(const u64 seq1, const u64 seq2) ...@@ -153,18 +153,27 @@ static inline u64 max48(const u64 seq1, const u64 seq2)
} }
/** /**
* dccp_loss_free - Evaluates condition for data loss from RFC 4340, 7.7.1 * dccp_loss_count - Approximate the number of lost data packets in a burst loss
* @s1: start sequence number * @s1: last known sequence number before the loss ('hole')
* @s2: end sequence number * @s2: first sequence number seen after the 'hole'
* @ndp: NDP count on packet with sequence number @s2 * @ndp: NDP count on packet with sequence number @s2
* Returns true if the sequence range s1...s2 has no data loss.
*/ */
static inline bool dccp_loss_free(const u64 s1, const u64 s2, const u64 ndp) static inline u64 dccp_loss_count(const u64 s1, const u64 s2, const u64 ndp)
{ {
s64 delta = dccp_delta_seqno(s1, s2); s64 delta = dccp_delta_seqno(s1, s2);
WARN_ON(delta < 0); WARN_ON(delta < 0);
return (u64)delta <= ndp + 1; delta -= ndp + 1;
return delta > 0 ? delta : 0;
}
/**
* dccp_loss_free - Evaluate condition for data loss from RFC 4340, 7.7.1
*/
static inline bool dccp_loss_free(const u64 s1, const u64 s2, const u64 ndp)
{
return dccp_loss_count(s1, s2, ndp) == 0;
} }
enum { enum {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment