diff options
author | Vlad Yasevich <vladislav.yasevich@hp.com> | 2009-02-13 03:33:42 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-02-16 03:03:10 -0500 |
commit | 4458f04c02a46c679a90ef71f866a415c192deb4 (patch) | |
tree | b08aa476ab4c525ab3cb33cea6114cb262cb2941 /net/sctp | |
parent | 06e868066e3b5828383eb40ff4d1c0029100b0b5 (diff) |
sctp: Clean up sctp checksumming code
The sctp crc32c checksum is always generated in little endian.
So, we clean up the code to treat it as little endian and remove
all the __force casts.
Suggested by Herbert Xu.
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/input.c | 11 | ||||
-rw-r--r-- | net/sctp/output.c | 14 |
2 files changed, 12 insertions, 13 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 693fd0804810..d2e98803ffe3 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -83,14 +83,15 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb) | |||
83 | { | 83 | { |
84 | struct sk_buff *list = skb_shinfo(skb)->frag_list; | 84 | struct sk_buff *list = skb_shinfo(skb)->frag_list; |
85 | struct sctphdr *sh = sctp_hdr(skb); | 85 | struct sctphdr *sh = sctp_hdr(skb); |
86 | __be32 cmp = sh->checksum; | 86 | __le32 cmp = sh->checksum; |
87 | __be32 val = sctp_start_cksum((__u8 *)sh, skb_headlen(skb)); | 87 | __le32 val; |
88 | __u32 tmp = sctp_start_cksum((__u8 *)sh, skb_headlen(skb)); | ||
88 | 89 | ||
89 | for (; list; list = list->next) | 90 | for (; list; list = list->next) |
90 | val = sctp_update_cksum((__u8 *)list->data, skb_headlen(list), | 91 | tmp = sctp_update_cksum((__u8 *)list->data, skb_headlen(list), |
91 | val); | 92 | tmp); |
92 | 93 | ||
93 | val = sctp_end_cksum(val); | 94 | val = sctp_end_cksum(tmp); |
94 | 95 | ||
95 | if (val != cmp) { | 96 | if (val != cmp) { |
96 | /* CRC failure, dump it. */ | 97 | /* CRC failure, dump it. */ |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 2d65b7a7330b..07d58903a746 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -367,7 +367,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
367 | struct sctp_transport *tp = packet->transport; | 367 | struct sctp_transport *tp = packet->transport; |
368 | struct sctp_association *asoc = tp->asoc; | 368 | struct sctp_association *asoc = tp->asoc; |
369 | struct sctphdr *sh; | 369 | struct sctphdr *sh; |
370 | __be32 crc32 = cpu_to_be32(0); | ||
371 | struct sk_buff *nskb; | 370 | struct sk_buff *nskb; |
372 | struct sctp_chunk *chunk, *tmp; | 371 | struct sctp_chunk *chunk, *tmp; |
373 | struct sock *sk; | 372 | struct sock *sk; |
@@ -532,16 +531,15 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
532 | * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. | 531 | * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. |
533 | */ | 532 | */ |
534 | if (!sctp_checksum_disable && !(dst->dev->features & NETIF_F_NO_CSUM)) { | 533 | if (!sctp_checksum_disable && !(dst->dev->features & NETIF_F_NO_CSUM)) { |
535 | crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); | 534 | __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); |
536 | crc32 = sctp_end_cksum(crc32); | 535 | |
536 | /* 3) Put the resultant value into the checksum field in the | ||
537 | * common header, and leave the rest of the bits unchanged. | ||
538 | */ | ||
539 | sh->checksum = sctp_end_cksum(crc32); | ||
537 | } else | 540 | } else |
538 | nskb->ip_summed = CHECKSUM_UNNECESSARY; | 541 | nskb->ip_summed = CHECKSUM_UNNECESSARY; |
539 | 542 | ||
540 | /* 3) Put the resultant value into the checksum field in the | ||
541 | * common header, and leave the rest of the bits unchanged. | ||
542 | */ | ||
543 | sh->checksum = crc32; | ||
544 | |||
545 | /* IP layer ECN support | 543 | /* IP layer ECN support |
546 | * From RFC 2481 | 544 | * From RFC 2481 |
547 | * "The ECN-Capable Transport (ECT) bit would be set by the | 545 | * "The ECN-Capable Transport (ECT) bit would be set by the |