Commit 336d3262df71fcd2661180bb35d5ea41b4cbca58
Committed by
David S. Miller
1 parent
4e54064e0a
Exists in
master
and in
7 other branches
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 | } |
net/sctp/input.c
... | ... | @@ -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), |
net/sctp/output.c
... | ... | @@ -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 |