aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2007-03-20 11:26:51 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-26 01:26:42 -0400
commit6b811d43f6cc9eccdfc011a99f8571df2abc46d1 (patch)
tree58e7f27415faf9ad6761bab6e51a7003139190f9
parent8b5be26831b973d8013e8b4c9860d9694310cdc6 (diff)
[DCCP]: 48-bit sequence number arithmetic
This patch * organizes the sequence arithmetic functions into one corner of dccp.h * performs a small modification of dccp_set_seqno to make it more widely reusable (now it is safe to use any number, since it performs modulo-2^48 assignment) * adds functions and generic macros for 48-bit sequence arithmetic: --48 bit complement --modulo-48 addition and modulo-48 subtraction --dccp_inc_seqno now a special case of add48 Constants renamed following a suggestion by Arnaldo. 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> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/dccp/ackvec.c2
-rw-r--r--net/dccp/dccp.h47
2 files changed, 28 insertions, 21 deletions
diff --git a/net/dccp/ackvec.c b/net/dccp/ackvec.c
index a086c6312d3b..01030f346177 100644
--- a/net/dccp/ackvec.c
+++ b/net/dccp/ackvec.c
@@ -157,7 +157,7 @@ struct dccp_ackvec *dccp_ackvec_alloc(const gfp_t priority)
157 157
158 if (av != NULL) { 158 if (av != NULL) {
159 av->dccpav_buf_head = DCCP_MAX_ACKVEC_LEN - 1; 159 av->dccpav_buf_head = DCCP_MAX_ACKVEC_LEN - 1;
160 av->dccpav_buf_ackno = DCCP_MAX_SEQNO + 1; 160 av->dccpav_buf_ackno = UINT48_MAX + 1;
161 av->dccpav_buf_nonce = av->dccpav_buf_nonce = 0; 161 av->dccpav_buf_nonce = av->dccpav_buf_nonce = 0;
162 av->dccpav_time.tv_sec = 0; 162 av->dccpav_time.tv_sec = 0;
163 av->dccpav_time.tv_usec = 0; 163 av->dccpav_time.tv_usec = 0;
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index e33a9edb4036..a2c20a265b25 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -92,6 +92,32 @@ extern int sysctl_dccp_feat_send_ack_vector;
92extern int sysctl_dccp_feat_send_ndp_count; 92extern int sysctl_dccp_feat_send_ndp_count;
93extern int sysctl_dccp_tx_qlen; 93extern int sysctl_dccp_tx_qlen;
94 94
95/*
96 * 48-bit sequence number arithmetic (signed and unsigned)
97 */
98#define INT48_MIN 0x800000000000LL /* 2^47 */
99#define UINT48_MAX 0xFFFFFFFFFFFFLL /* 2^48 - 1 */
100#define COMPLEMENT48(x) (0x1000000000000LL - (x)) /* 2^48 - x */
101#define TO_SIGNED48(x) (((x) < INT48_MIN)? (x) : -COMPLEMENT48( (x)))
102#define TO_UNSIGNED48(x) (((x) >= 0)? (x) : COMPLEMENT48(-(x)))
103#define ADD48(a, b) (((a) + (b)) & UINT48_MAX)
104#define SUB48(a, b) ADD48((a), COMPLEMENT48(b))
105
106static inline void dccp_set_seqno(u64 *seqno, u64 value)
107{
108 *seqno = value & UINT48_MAX;
109}
110
111static inline void dccp_inc_seqno(u64 *seqno)
112{
113 *seqno = ADD48(*seqno, 1);
114}
115
116static inline u64 dccp_delta_seqno(u64 seqno1, u64 seqno2)
117{
118 return ((seqno2 << 16) - (seqno1 << 16)) >> 16;
119}
120
95/* is seq1 < seq2 ? */ 121/* is seq1 < seq2 ? */
96static inline int before48(const u64 seq1, const u64 seq2) 122static inline int before48(const u64 seq1, const u64 seq2)
97{ 123{
@@ -313,26 +339,7 @@ static inline int dccp_packet_without_ack(const struct sk_buff *skb)
313 return type == DCCP_PKT_DATA || type == DCCP_PKT_REQUEST; 339 return type == DCCP_PKT_DATA || type == DCCP_PKT_REQUEST;
314} 340}
315 341
316#define DCCP_MAX_SEQNO ((((u64)1) << 48) - 1) 342#define DCCP_PKT_WITHOUT_ACK_SEQ (UINT48_MAX << 2)
317#define DCCP_PKT_WITHOUT_ACK_SEQ (DCCP_MAX_SEQNO << 2)
318
319static inline void dccp_set_seqno(u64 *seqno, u64 value)
320{
321 if (value > DCCP_MAX_SEQNO)
322 value -= DCCP_MAX_SEQNO + 1;
323 *seqno = value;
324}
325
326static inline u64 dccp_delta_seqno(u64 seqno1, u64 seqno2)
327{
328 return ((seqno2 << 16) - (seqno1 << 16)) >> 16;
329}
330
331static inline void dccp_inc_seqno(u64 *seqno)
332{
333 if (++*seqno > DCCP_MAX_SEQNO)
334 *seqno = 0;
335}
336 343
337static inline void dccp_hdr_set_seq(struct dccp_hdr *dh, const u64 gss) 344static inline void dccp_hdr_set_seq(struct dccp_hdr *dh, const u64 gss)
338{ 345{