[DCCP]: sparse endianness annotations
Andrea Bittau [Tue, 21 Mar 2006 03:23:32 +0000 (19:23 -0800)]
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>

include/linux/dccp.h
net/dccp/ccids/ccid3.c
net/dccp/dccp.h
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/options.c
net/dccp/proto.c

index bdd756c..496dbad 100644 (file)
@@ -18,7 +18,7 @@
  * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x
  */
 struct dccp_hdr {
-       __u16   dccph_sport,
+       __be16  dccph_sport,
                dccph_dport;
        __u8    dccph_doff;
 #if defined(__LITTLE_ENDIAN_BITFIELD)
@@ -32,18 +32,18 @@ struct dccp_hdr {
 #endif
        __u16   dccph_checksum;
 #if defined(__LITTLE_ENDIAN_BITFIELD)
-       __u32   dccph_x:1,
+       __u8    dccph_x:1,
                dccph_type:4,
-               dccph_reserved:3,
-               dccph_seq:24;
+               dccph_reserved:3;
 #elif defined(__BIG_ENDIAN_BITFIELD)
-       __u32   dccph_reserved:3,
+       __u8    dccph_reserved:3,
                dccph_type:4,
-               dccph_x:1,
-               dccph_seq:24;
+               dccph_x:1;
 #else
 #error  "Adjust your <asm/byteorder.h> defines"
 #endif
+       __u8    dccph_seq2;
+       __be16  dccph_seq;
 };
 
 /**
@@ -52,7 +52,7 @@ struct dccp_hdr {
  * @dccph_seq_low - low 24 bits of a 48 bit seq packet
  */
 struct dccp_hdr_ext {
-       __u32   dccph_seq_low;
+       __be32  dccph_seq_low;
 };
 
 /**
@@ -62,7 +62,7 @@ struct dccp_hdr_ext {
  * @dccph_req_options - list of options (must be a multiple of 32 bits
  */
 struct dccp_hdr_request {
-       __u32   dccph_req_service;
+       __be32  dccph_req_service;
 };
 /**
  * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets
@@ -71,9 +71,9 @@ struct dccp_hdr_request {
  * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
  */
 struct dccp_hdr_ack_bits {
-       __u32   dccph_reserved1:8,
-               dccph_ack_nr_high:24;
-       __u32   dccph_ack_nr_low;
+       __be16  dccph_reserved1;
+       __be16  dccph_ack_nr_high;
+       __be32  dccph_ack_nr_low;
 };
 /**
  * struct dccp_hdr_response - Conection initiation response header
@@ -85,7 +85,7 @@ struct dccp_hdr_ack_bits {
  */
 struct dccp_hdr_response {
        struct dccp_hdr_ack_bits        dccph_resp_ack;
-       __u32                           dccph_resp_service;
+       __be32                          dccph_resp_service;
 };
 
 /**
@@ -269,16 +269,12 @@ static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
 static inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
 {
        const struct dccp_hdr *dh = dccp_hdr(skb);
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-       __u64 seq_nr = ntohl(dh->dccph_seq << 8);
-#elif defined(__BIG_ENDIAN_BITFIELD)
-       __u64 seq_nr = ntohl(dh->dccph_seq);
-#else
-#error  "Adjust your <asm/byteorder.h> defines"
-#endif
+       __u64 seq_nr =  ntohs(dh->dccph_seq);
 
        if (dh->dccph_x != 0)
                seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low);
+       else
+               seq_nr += (u32)dh->dccph_seq2 << 16;
 
        return seq_nr;
 }
@@ -296,13 +292,7 @@ static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *
 static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb)
 {
        const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb);
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-       return (((u64)ntohl(dhack->dccph_ack_nr_high << 8)) << 32) + ntohl(dhack->dccph_ack_nr_low);
-#elif defined(__BIG_ENDIAN_BITFIELD)
-       return (((u64)ntohl(dhack->dccph_ack_nr_high)) << 32) + ntohl(dhack->dccph_ack_nr_low);
-#else
-#error  "Adjust your <asm/byteorder.h> defines"
-#endif
+       return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low);
 }
 
 static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb)
@@ -387,7 +377,7 @@ struct dccp_request_sock {
        struct inet_request_sock dreq_inet_rsk;
        __u64                    dreq_iss;
        __u64                    dreq_isr;
-       __u32                    dreq_service;
+       __be32                   dreq_service;
 };
 
 static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req)
@@ -415,13 +405,13 @@ enum dccp_role {
 
 struct dccp_service_list {
        __u32   dccpsl_nr;
-       __u32   dccpsl_list[0];
+       __be32  dccpsl_list[0];
 };
 
 #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
 
 static inline int dccp_list_has_service(const struct dccp_service_list *sl,
-                                       const u32 service)
+                                       const __be32 service)
 {
        if (likely(sl != NULL)) {
                u32 i = sl->dccpsl_nr;
@@ -467,7 +457,7 @@ struct dccp_sock {
        __u64                           dccps_gss;
        __u64                           dccps_gsr;
        __u64                           dccps_gar;
-       __u32                           dccps_service;
+       __be32                          dccps_service;
        struct dccp_service_list        *dccps_service_list;
        struct timeval                  dccps_timestamp_time;
        __u32                           dccps_timestamp_echo;
index 0587f52..8620163 100644 (file)
@@ -615,7 +615,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
                                       __FUNCTION__, dccp_role(sk), sk);
                        rc = -EINVAL;
                } else {
-                       opt_recv->ccid3or_loss_event_rate = ntohl(*(u32 *)value);
+                       opt_recv->ccid3or_loss_event_rate = ntohl(*(__be32 *)value);
                        ccid3_pr_debug("%s, sk=%p, LOSS_EVENT_RATE=%u\n",
                                       dccp_role(sk), sk,
                                       opt_recv->ccid3or_loss_event_rate);
@@ -636,7 +636,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
                                       __FUNCTION__, dccp_role(sk), sk);
                        rc = -EINVAL;
                } else {
-                       opt_recv->ccid3or_receive_rate = ntohl(*(u32 *)value);
+                       opt_recv->ccid3or_receive_rate = ntohl(*(__be32 *)value);
                        ccid3_pr_debug("%s, sk=%p, RECEIVE_RATE=%u\n",
                                       dccp_role(sk), sk,
                                       opt_recv->ccid3or_receive_rate);
@@ -777,7 +777,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk)
 static void ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
 {
        const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
-       u32 x_recv, pinv;
+       __be32 x_recv, pinv;
 
        BUG_ON(hcrx == NULL);
 
index 93f26dd..1764adb 100644 (file)
@@ -262,7 +262,7 @@ extern int     dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
                                   int addr_len);
 
 extern int        dccp_v4_checksum(const struct sk_buff *skb,
-                                   const u32 saddr, const u32 daddr);
+                                   const __be32 saddr, const __be32 daddr);
 
 extern int        dccp_v4_send_reset(struct sock *sk,
                                      enum dccp_reset_codes code);
@@ -270,7 +270,7 @@ extern void    dccp_send_close(struct sock *sk, const int active);
 extern int        dccp_invalid_packet(struct sk_buff *skb);
 
 static inline int dccp_bad_service_code(const struct sock *sk,
-                                       const __u32 service)
+                                       const __be32 service)
 {
        const struct dccp_sock *dp = dccp_sk(sk);
 
@@ -334,27 +334,16 @@ static inline void dccp_hdr_set_seq(struct dccp_hdr *dh, const u64 gss)
 {
        struct dccp_hdr_ext *dhx = (struct dccp_hdr_ext *)((void *)dh +
                                                           sizeof(*dh));
-
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-       dh->dccph_seq      = htonl((gss >> 32)) >> 8;
-#elif defined(__BIG_ENDIAN_BITFIELD)
-       dh->dccph_seq      = htonl((gss >> 32));
-#else
-#error  "Adjust your <asm/byteorder.h> defines"
-#endif
+       dh->dccph_seq2 = 0;
+       dh->dccph_seq = htons((gss >> 32) & 0xfffff);
        dhx->dccph_seq_low = htonl(gss & 0xffffffff);
 }
 
 static inline void dccp_hdr_set_ack(struct dccp_hdr_ack_bits *dhack,
                                    const u64 gsr)
 {
-#if defined(__LITTLE_ENDIAN_BITFIELD)
-       dhack->dccph_ack_nr_high = htonl((gsr >> 32)) >> 8;
-#elif defined(__BIG_ENDIAN_BITFIELD)
-       dhack->dccph_ack_nr_high = htonl((gsr >> 32));
-#else
-#error  "Adjust your <asm/byteorder.h> defines"
-#endif
+       dhack->dccph_reserved1 = 0;
+       dhack->dccph_ack_nr_high = htons(gsr >> 32);
        dhack->dccph_ack_nr_low  = htonl(gsr & 0xffffffff);
 }
 
index aa7708f..be5ce57 100644 (file)
@@ -498,9 +498,9 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        struct dccp_sock dp;
        struct request_sock *req;
        struct dccp_request_sock *dreq;
-       const __u32 saddr = skb->nh.iph->saddr;
-       const __u32 daddr = skb->nh.iph->daddr;
-       const __u32 service = dccp_hdr_request(skb)->dccph_req_service;
+       const __be32 saddr = skb->nh.iph->saddr;
+       const __be32 daddr = skb->nh.iph->daddr;
+       const __be32 service = dccp_hdr_request(skb)->dccph_req_service;
        struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
        __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY;
 
@@ -662,8 +662,8 @@ static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
        return sk;
 }
 
-int dccp_v4_checksum(const struct sk_buff *skb, const u32 saddr,
-                    const u32 daddr)
+int dccp_v4_checksum(const struct sk_buff *skb, const __be32 saddr,
+                    const __be32 daddr)
 {
        const struct dccp_hdr* dh = dccp_hdr(skb);
        int checksum_len;
@@ -683,7 +683,7 @@ int dccp_v4_checksum(const struct sk_buff *skb, const u32 saddr,
 }
 
 static int dccp_v4_verify_checksum(struct sk_buff *skb,
-                                  const u32 saddr, const u32 daddr)
+                                  const __be32 saddr, const __be32 daddr)
 {
        struct dccp_hdr *dh = dccp_hdr(skb);
        int checksum_len;
index 80c4d04..ad5a1c6 100644 (file)
@@ -264,7 +264,7 @@ failure:
 }
 
 static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
-                       int type, int code, int offset, __u32 info)
+                       int type, int code, int offset, __be32 info)
 {
        struct ipv6hdr *hdr = (struct ipv6hdr *)skb->data;
        const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
@@ -678,7 +678,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        struct dccp_request_sock *dreq;
        struct inet6_request_sock *ireq6;
        struct ipv6_pinfo *np = inet6_sk(sk);
-       const __u32 service = dccp_hdr_request(skb)->dccph_req_service;
+       const __be32 service = dccp_hdr_request(skb)->dccph_req_service;
        struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
        __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY;
 
index 7f99306..7d73b33 100644 (file)
@@ -155,7 +155,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                        if (len != 4)
                                goto out_invalid_option;
 
-                       opt_recv->dccpor_timestamp = ntohl(*(u32 *)value);
+                       opt_recv->dccpor_timestamp = ntohl(*(__be32 *)value);
 
                        dp->dccps_timestamp_echo = opt_recv->dccpor_timestamp;
                        dccp_timestamp(sk, &dp->dccps_timestamp_time);
@@ -169,7 +169,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                        if (len != 4 && len != 6 && len != 8)
                                goto out_invalid_option;
 
-                       opt_recv->dccpor_timestamp_echo = ntohl(*(u32 *)value);
+                       opt_recv->dccpor_timestamp_echo = ntohl(*(__be32 *)value);
 
                        dccp_pr_debug("%sTIMESTAMP_ECHO=%u, len=%d, ackno=%llu, ",
                                      debug_prefix,
@@ -183,9 +183,9 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                                break;
 
                        if (len == 6)
-                               elapsed_time = ntohs(*(u16 *)(value + 4));
+                               elapsed_time = ntohs(*(__be16 *)(value + 4));
                        else
-                               elapsed_time = ntohl(*(u32 *)(value + 4));
+                               elapsed_time = ntohl(*(__be32 *)(value + 4));
 
                        /* Give precedence to the biggest ELAPSED_TIME */
                        if (elapsed_time > opt_recv->dccpor_elapsed_time)
@@ -199,9 +199,9 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                                continue;
 
                        if (len == 2)
-                               elapsed_time = ntohs(*(u16 *)value);
+                               elapsed_time = ntohs(*(__be16 *)value);
                        else
-                               elapsed_time = ntohl(*(u32 *)value);
+                               elapsed_time = ntohl(*(__be32 *)value);
 
                        if (elapsed_time > opt_recv->dccpor_elapsed_time)
                                opt_recv->dccpor_elapsed_time = elapsed_time;
@@ -358,10 +358,10 @@ void dccp_insert_option_elapsed_time(struct sock *sk,
        *to++ = len;
 
        if (elapsed_time_len == 2) {
-               const u16 var16 = htons((u16)elapsed_time);
+               const __be16 var16 = htons((u16)elapsed_time);
                memcpy(to, &var16, 2);
        } else {
-               const u32 var32 = htonl(elapsed_time);
+               const __be32 var32 = htonl(elapsed_time);
                memcpy(to, &var32, 4);
        }
 
@@ -392,14 +392,13 @@ EXPORT_SYMBOL_GPL(dccp_timestamp);
 void dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
 {
        struct timeval tv;
-       u32 now;
+       __be32 now;
 
        dccp_timestamp(sk, &tv);
-       now = timeval_usecs(&tv) / 10;
+       now = htonl(timeval_usecs(&tv) / 10);
        /* yes this will overflow but that is the point as we want a
         * 10 usec 32 bit timer which mean it wraps every 11.9 hours */
 
-       now = htonl(now);
        dccp_insert_option(sk, skb, DCCPO_TIMESTAMP, &now, sizeof(now));
 }
 
@@ -414,7 +413,7 @@ static void dccp_insert_option_timestamp_echo(struct sock *sk,
                                        "CLIENT TX opt: " : "server TX opt: ";
 #endif
        struct timeval now;
-       u32 tstamp_echo;
+       __be32 tstamp_echo;
        u32 elapsed_time;
        int len, elapsed_time_len;
        unsigned char *to;
@@ -441,10 +440,10 @@ static void dccp_insert_option_timestamp_echo(struct sock *sk,
        to += 4;
 
        if (elapsed_time_len == 2) {
-               const u16 var16 = htons((u16)elapsed_time);
+               const __be16 var16 = htons((u16)elapsed_time);
                memcpy(to, &var16, 2);
        } else if (elapsed_time_len == 4) {
-               const u32 var32 = htonl(elapsed_time);
+               const __be32 var32 = htonl(elapsed_time);
                memcpy(to, &var32, 4);
        }
 
index 1a8cf8e..53735ee 100644 (file)
@@ -221,7 +221,7 @@ int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 
 EXPORT_SYMBOL_GPL(dccp_ioctl);
 
-static int dccp_setsockopt_service(struct sock *sk, const u32 service,
+static int dccp_setsockopt_service(struct sock *sk, const __be32 service,
                                   char __user *optval, int optlen)
 {
        struct dccp_sock *dp = dccp_sk(sk);
@@ -349,7 +349,7 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
 EXPORT_SYMBOL_GPL(dccp_setsockopt);
 
 static int dccp_getsockopt_service(struct sock *sk, int len,
-                                  u32 __user *optval,
+                                  __be32 __user *optval,
                                   int __user *optlen)
 {
        const struct dccp_sock *dp = dccp_sk(sk);
@@ -404,7 +404,7 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
                break;
        case DCCP_SOCKOPT_SERVICE:
                return dccp_getsockopt_service(sk, len,
-                                              (u32 __user *)optval, optlen);
+                                              (__be32 __user *)optval, optlen);
        case 128 ... 191:
                return ccid_hc_rx_getsockopt(dp->dccps_hc_rx_ccid, sk, optname,
                                             len, (u32 __user *)optval, optlen);