Commit 336d3262df71fcd2661180bb35d5ea41b4cbca58

Authored by Harvey Harrison
Committed by David S. Miller
1 parent 4e54064e0a

sctp: remove unnecessary byteshifting, calculate directly in big-endian

Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 4 changed files with 20 additions and 15 deletions Side-by-side Diff

include/net/sctp/checksum.h
... ... @@ -46,9 +46,14 @@
46 46 #include <net/sctp/sctp.h>
47 47 #include <linux/crc32c.h>
48 48  
49   -static inline __u32 sctp_start_cksum(__u8 *buffer, __u16 length)
  49 +static inline __be32 sctp_crc32c(__be32 crc, u8 *buffer, u16 length)
50 50 {
51   - __u32 crc = ~(__u32) 0;
  51 + return (__force __be32)crc32c((__force u32)crc, buffer, length);
  52 +}
  53 +
  54 +static inline __be32 sctp_start_cksum(__u8 *buffer, __u16 length)
  55 +{
  56 + __be32 crc = ~cpu_to_be32(0);
52 57 __u8 zero[sizeof(__u32)] = {0};
53 58  
54 59 /* Optimize this routine to be SCTP specific, knowing how
55 60  
56 61  
57 62  
58 63  
59 64  
60 65  
... ... @@ -56,24 +61,24 @@
56 61 */
57 62  
58 63 /* Calculate CRC up to the checksum. */
59   - crc = crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32));
  64 + crc = sctp_crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32));
60 65  
61 66 /* Skip checksum field of the header. */
62   - crc = crc32c(crc, zero, sizeof(__u32));
  67 + crc = sctp_crc32c(crc, zero, sizeof(__u32));
63 68  
64 69 /* Calculate the rest of the CRC. */
65   - crc = crc32c(crc, &buffer[sizeof(struct sctphdr)],
  70 + crc = sctp_crc32c(crc, &buffer[sizeof(struct sctphdr)],
66 71 length - sizeof(struct sctphdr));
67 72 return crc;
68 73 }
69 74  
70   -static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
  75 +static inline __be32 sctp_update_cksum(__u8 *buffer, __u16 length, __be32 crc32)
71 76 {
72   - return crc32c(crc32, buffer, length);
  77 + return sctp_crc32c(crc32, buffer, length);
73 78 }
74 79  
75   -static inline __u32 sctp_end_cksum(__u32 crc32)
  80 +static inline __be32 sctp_end_cksum(__be32 crc32)
76 81 {
77   - return ntohl(~crc32);
  82 + return ~crc32;
78 83 }
net/ipv4/netfilter/nf_nat_proto_sctp.c
... ... @@ -36,7 +36,7 @@
36 36 sctp_sctphdr_t *hdr;
37 37 unsigned int hdroff = iphdroff + iph->ihl*4;
38 38 __be32 oldip, newip;
39   - u32 crc32;
  39 + __be32 crc32;
40 40  
41 41 if (!skb_make_writable(skb, hdroff + sizeof(*hdr)))
42 42 return false;
... ... @@ -61,7 +61,7 @@
61 61 crc32 = sctp_update_cksum((u8 *)skb->data, skb_headlen(skb),
62 62 crc32);
63 63 crc32 = sctp_end_cksum(crc32);
64   - hdr->checksum = htonl(crc32);
  64 + hdr->checksum = crc32;
65 65  
66 66 return true;
67 67 }
... ... @@ -83,8 +83,8 @@
83 83 {
84 84 struct sk_buff *list = skb_shinfo(skb)->frag_list;
85 85 struct sctphdr *sh = sctp_hdr(skb);
86   - __u32 cmp = ntohl(sh->checksum);
87   - __u32 val = sctp_start_cksum((__u8 *)sh, skb_headlen(skb));
  86 + __be32 cmp = sh->checksum;
  87 + __be32 val = sctp_start_cksum((__u8 *)sh, skb_headlen(skb));
88 88  
89 89 for (; list; list = list->next)
90 90 val = sctp_update_cksum((__u8 *)list->data, skb_headlen(list),
... ... @@ -365,7 +365,7 @@
365 365 struct sctp_transport *tp = packet->transport;
366 366 struct sctp_association *asoc = tp->asoc;
367 367 struct sctphdr *sh;
368   - __u32 crc32 = 0;
  368 + __be32 crc32 = __constant_cpu_to_be32(0);
369 369 struct sk_buff *nskb;
370 370 struct sctp_chunk *chunk, *tmp;
371 371 struct sock *sk;
... ... @@ -538,7 +538,7 @@
538 538 /* 3) Put the resultant value into the checksum field in the
539 539 * common header, and leave the rest of the bits unchanged.
540 540 */
541   - sh->checksum = htonl(crc32);
  541 + sh->checksum = crc32;
542 542  
543 543 /* IP layer ECN support
544 544 * From RFC 2481