|
@@ -92,6 +92,32 @@ extern int sysctl_dccp_feat_send_ack_vector;
|
|
|
extern int sysctl_dccp_feat_send_ndp_count;
|
|
|
extern int sysctl_dccp_tx_qlen;
|
|
|
|
|
|
+/*
|
|
|
+ * 48-bit sequence number arithmetic (signed and unsigned)
|
|
|
+ */
|
|
|
+#define INT48_MIN 0x800000000000LL /* 2^47 */
|
|
|
+#define UINT48_MAX 0xFFFFFFFFFFFFLL /* 2^48 - 1 */
|
|
|
+#define COMPLEMENT48(x) (0x1000000000000LL - (x)) /* 2^48 - x */
|
|
|
+#define TO_SIGNED48(x) (((x) < INT48_MIN)? (x) : -COMPLEMENT48( (x)))
|
|
|
+#define TO_UNSIGNED48(x) (((x) >= 0)? (x) : COMPLEMENT48(-(x)))
|
|
|
+#define ADD48(a, b) (((a) + (b)) & UINT48_MAX)
|
|
|
+#define SUB48(a, b) ADD48((a), COMPLEMENT48(b))
|
|
|
+
|
|
|
+static inline void dccp_set_seqno(u64 *seqno, u64 value)
|
|
|
+{
|
|
|
+ *seqno = value & UINT48_MAX;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void dccp_inc_seqno(u64 *seqno)
|
|
|
+{
|
|
|
+ *seqno = ADD48(*seqno, 1);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u64 dccp_delta_seqno(u64 seqno1, u64 seqno2)
|
|
|
+{
|
|
|
+ return ((seqno2 << 16) - (seqno1 << 16)) >> 16;
|
|
|
+}
|
|
|
+
|
|
|
/* is seq1 < seq2 ? */
|
|
|
static inline int before48(const u64 seq1, const u64 seq2)
|
|
|
{
|
|
@@ -313,26 +339,7 @@ static inline int dccp_packet_without_ack(const struct sk_buff *skb)
|
|
|
return type == DCCP_PKT_DATA || type == DCCP_PKT_REQUEST;
|
|
|
}
|
|
|
|
|
|
-#define DCCP_MAX_SEQNO ((((u64)1) << 48) - 1)
|
|
|
-#define DCCP_PKT_WITHOUT_ACK_SEQ (DCCP_MAX_SEQNO << 2)
|
|
|
-
|
|
|
-static inline void dccp_set_seqno(u64 *seqno, u64 value)
|
|
|
-{
|
|
|
- if (value > DCCP_MAX_SEQNO)
|
|
|
- value -= DCCP_MAX_SEQNO + 1;
|
|
|
- *seqno = value;
|
|
|
-}
|
|
|
-
|
|
|
-static inline u64 dccp_delta_seqno(u64 seqno1, u64 seqno2)
|
|
|
-{
|
|
|
- return ((seqno2 << 16) - (seqno1 << 16)) >> 16;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void dccp_inc_seqno(u64 *seqno)
|
|
|
-{
|
|
|
- if (++*seqno > DCCP_MAX_SEQNO)
|
|
|
- *seqno = 0;
|
|
|
-}
|
|
|
+#define DCCP_PKT_WITHOUT_ACK_SEQ (UINT48_MAX << 2)
|
|
|
|
|
|
static inline void dccp_hdr_set_seq(struct dccp_hdr *dh, const u64 gss)
|
|
|
{
|