All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 11/31] [DCCP]: Make dccp_delta_seqno return signed numbers
@ 2007-03-20 23:06 Gerrit Renker
  0 siblings, 0 replies; only message in thread
From: Gerrit Renker @ 2007-03-20 23:06 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

Problem:
--------
 Using dccp_delta_seqno(a, b) produces unusable results when -- by accident
 or coincidence -- sequence number b precedes a.  If e.g. a and b are merely
 reordered and have a distance 1, their delta_seqno is 2^48-1, which would
 indicate a loss of 2^48-2 packets.

Fix:
----
 The fix is by using signed 48-bit arithmetic for dccp_delta_seqno, so that
 dccp_delta_seqno(a, b) returns:
  * > 0 if a is `before' b                OR
  *   0 if a == b                         OR
  * < 0 and > -2^47 if b is `before' a    OR
  * -2^47           if neither a `before' b  nor  b `before' a

 This implements http://www.mail-archive.com/dccp@vger.kernel.org/msg01153.html

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 net/dccp/dccp.h |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 82c618f..e6c95e9 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -113,9 +113,12 @@ static inline void dccp_inc_seqno(u64 *seqno)
 	*seqno = ADD48(*seqno, 1);
 }
 
-static inline u64 dccp_delta_seqno(u64 seqno1, u64 seqno2)
+/* signed mod-2^48 distance: pos. if seqno1 < seqno2, neg. if seqno1 > seqno2 */
+static inline s64 dccp_delta_seqno(const u64 seqno1, const u64 seqno2)
 {
-	return ((seqno2 << 16) - (seqno1 << 16)) >> 16;
+	u64 delta = SUB48(seqno2, seqno1);
+
+	return TO_SIGNED48(delta);
 }
 
 /* is seq1 < seq2 ? */
-- 
1.5.0.3


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2007-03-20 23:07 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-03-20 23:06 [PATCH 11/31] [DCCP]: Make dccp_delta_seqno return signed numbers Gerrit Renker

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.