diff options
author | Andrea Bittau <a.bittau@cs.ucl.ac.uk> | 2006-03-20 22:23:32 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-20 22:23:32 -0500 |
commit | 60fe62e789076ae7c13f7ffb35fec4b24802530d (patch) | |
tree | cc8d507a4276c3d5a2bcb72746660d485bc2e045 /include/linux | |
parent | a193a4abdd1f742a57f3f70b6a83c3e536876e97 (diff) |
[DCCP]: sparse endianness annotations
This also fixes the layout of dccp_hdr short sequence numbers, problem
was not fatal now as we only support long (48 bits) sequence numbers.
Signed-off-by: Andrea Bittau <a.bittau@cs.ucl.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/dccp.h | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/include/linux/dccp.h b/include/linux/dccp.h index bdd756cc60b1..496dbad8e896 100644 --- a/include/linux/dccp.h +++ b/include/linux/dccp.h | |||
@@ -18,7 +18,7 @@ | |||
18 | * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x | 18 | * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x |
19 | */ | 19 | */ |
20 | struct dccp_hdr { | 20 | struct dccp_hdr { |
21 | __u16 dccph_sport, | 21 | __be16 dccph_sport, |
22 | dccph_dport; | 22 | dccph_dport; |
23 | __u8 dccph_doff; | 23 | __u8 dccph_doff; |
24 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 24 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
@@ -32,18 +32,18 @@ struct dccp_hdr { | |||
32 | #endif | 32 | #endif |
33 | __u16 dccph_checksum; | 33 | __u16 dccph_checksum; |
34 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 34 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
35 | __u32 dccph_x:1, | 35 | __u8 dccph_x:1, |
36 | dccph_type:4, | 36 | dccph_type:4, |
37 | dccph_reserved:3, | 37 | dccph_reserved:3; |
38 | dccph_seq:24; | ||
39 | #elif defined(__BIG_ENDIAN_BITFIELD) | 38 | #elif defined(__BIG_ENDIAN_BITFIELD) |
40 | __u32 dccph_reserved:3, | 39 | __u8 dccph_reserved:3, |
41 | dccph_type:4, | 40 | dccph_type:4, |
42 | dccph_x:1, | 41 | dccph_x:1; |
43 | dccph_seq:24; | ||
44 | #else | 42 | #else |
45 | #error "Adjust your <asm/byteorder.h> defines" | 43 | #error "Adjust your <asm/byteorder.h> defines" |
46 | #endif | 44 | #endif |
45 | __u8 dccph_seq2; | ||
46 | __be16 dccph_seq; | ||
47 | }; | 47 | }; |
48 | 48 | ||
49 | /** | 49 | /** |
@@ -52,7 +52,7 @@ struct dccp_hdr { | |||
52 | * @dccph_seq_low - low 24 bits of a 48 bit seq packet | 52 | * @dccph_seq_low - low 24 bits of a 48 bit seq packet |
53 | */ | 53 | */ |
54 | struct dccp_hdr_ext { | 54 | struct dccp_hdr_ext { |
55 | __u32 dccph_seq_low; | 55 | __be32 dccph_seq_low; |
56 | }; | 56 | }; |
57 | 57 | ||
58 | /** | 58 | /** |
@@ -62,7 +62,7 @@ struct dccp_hdr_ext { | |||
62 | * @dccph_req_options - list of options (must be a multiple of 32 bits | 62 | * @dccph_req_options - list of options (must be a multiple of 32 bits |
63 | */ | 63 | */ |
64 | struct dccp_hdr_request { | 64 | struct dccp_hdr_request { |
65 | __u32 dccph_req_service; | 65 | __be32 dccph_req_service; |
66 | }; | 66 | }; |
67 | /** | 67 | /** |
68 | * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets | 68 | * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets |
@@ -71,9 +71,9 @@ struct dccp_hdr_request { | |||
71 | * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR | 71 | * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR |
72 | */ | 72 | */ |
73 | struct dccp_hdr_ack_bits { | 73 | struct dccp_hdr_ack_bits { |
74 | __u32 dccph_reserved1:8, | 74 | __be16 dccph_reserved1; |
75 | dccph_ack_nr_high:24; | 75 | __be16 dccph_ack_nr_high; |
76 | __u32 dccph_ack_nr_low; | 76 | __be32 dccph_ack_nr_low; |
77 | }; | 77 | }; |
78 | /** | 78 | /** |
79 | * struct dccp_hdr_response - Conection initiation response header | 79 | * struct dccp_hdr_response - Conection initiation response header |
@@ -85,7 +85,7 @@ struct dccp_hdr_ack_bits { | |||
85 | */ | 85 | */ |
86 | struct dccp_hdr_response { | 86 | struct dccp_hdr_response { |
87 | struct dccp_hdr_ack_bits dccph_resp_ack; | 87 | struct dccp_hdr_ack_bits dccph_resp_ack; |
88 | __u32 dccph_resp_service; | 88 | __be32 dccph_resp_service; |
89 | }; | 89 | }; |
90 | 90 | ||
91 | /** | 91 | /** |
@@ -269,16 +269,12 @@ static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb) | |||
269 | static inline __u64 dccp_hdr_seq(const struct sk_buff *skb) | 269 | static inline __u64 dccp_hdr_seq(const struct sk_buff *skb) |
270 | { | 270 | { |
271 | const struct dccp_hdr *dh = dccp_hdr(skb); | 271 | const struct dccp_hdr *dh = dccp_hdr(skb); |
272 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 272 | __u64 seq_nr = ntohs(dh->dccph_seq); |
273 | __u64 seq_nr = ntohl(dh->dccph_seq << 8); | ||
274 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
275 | __u64 seq_nr = ntohl(dh->dccph_seq); | ||
276 | #else | ||
277 | #error "Adjust your <asm/byteorder.h> defines" | ||
278 | #endif | ||
279 | 273 | ||
280 | if (dh->dccph_x != 0) | 274 | if (dh->dccph_x != 0) |
281 | seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low); | 275 | seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low); |
276 | else | ||
277 | seq_nr += (u32)dh->dccph_seq2 << 16; | ||
282 | 278 | ||
283 | return seq_nr; | 279 | return seq_nr; |
284 | } | 280 | } |
@@ -296,13 +292,7 @@ static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff * | |||
296 | static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb) | 292 | static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb) |
297 | { | 293 | { |
298 | const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb); | 294 | const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb); |
299 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 295 | return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low); |
300 | return (((u64)ntohl(dhack->dccph_ack_nr_high << 8)) << 32) + ntohl(dhack->dccph_ack_nr_low); | ||
301 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
302 | return (((u64)ntohl(dhack->dccph_ack_nr_high)) << 32) + ntohl(dhack->dccph_ack_nr_low); | ||
303 | #else | ||
304 | #error "Adjust your <asm/byteorder.h> defines" | ||
305 | #endif | ||
306 | } | 296 | } |
307 | 297 | ||
308 | static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb) | 298 | static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb) |
@@ -387,7 +377,7 @@ struct dccp_request_sock { | |||
387 | struct inet_request_sock dreq_inet_rsk; | 377 | struct inet_request_sock dreq_inet_rsk; |
388 | __u64 dreq_iss; | 378 | __u64 dreq_iss; |
389 | __u64 dreq_isr; | 379 | __u64 dreq_isr; |
390 | __u32 dreq_service; | 380 | __be32 dreq_service; |
391 | }; | 381 | }; |
392 | 382 | ||
393 | static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req) | 383 | static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req) |
@@ -415,13 +405,13 @@ enum dccp_role { | |||
415 | 405 | ||
416 | struct dccp_service_list { | 406 | struct dccp_service_list { |
417 | __u32 dccpsl_nr; | 407 | __u32 dccpsl_nr; |
418 | __u32 dccpsl_list[0]; | 408 | __be32 dccpsl_list[0]; |
419 | }; | 409 | }; |
420 | 410 | ||
421 | #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1) | 411 | #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1) |
422 | 412 | ||
423 | static inline int dccp_list_has_service(const struct dccp_service_list *sl, | 413 | static inline int dccp_list_has_service(const struct dccp_service_list *sl, |
424 | const u32 service) | 414 | const __be32 service) |
425 | { | 415 | { |
426 | if (likely(sl != NULL)) { | 416 | if (likely(sl != NULL)) { |
427 | u32 i = sl->dccpsl_nr; | 417 | u32 i = sl->dccpsl_nr; |
@@ -467,7 +457,7 @@ struct dccp_sock { | |||
467 | __u64 dccps_gss; | 457 | __u64 dccps_gss; |
468 | __u64 dccps_gsr; | 458 | __u64 dccps_gsr; |
469 | __u64 dccps_gar; | 459 | __u64 dccps_gar; |
470 | __u32 dccps_service; | 460 | __be32 dccps_service; |
471 | struct dccp_service_list *dccps_service_list; | 461 | struct dccp_service_list *dccps_service_list; |
472 | struct timeval dccps_timestamp_time; | 462 | struct timeval dccps_timestamp_time; |
473 | __u32 dccps_timestamp_echo; | 463 | __u32 dccps_timestamp_echo; |