1#ifndef _METAG_CHECKSUM_H
2#define _METAG_CHECKSUM_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16extern __wsum csum_partial(const void *buff, int len, __wsum sum);
17
18
19
20
21
22
23
24
25extern __wsum csum_partial_copy(const void *src, void *dst, int len,
26 __wsum sum);
27
28
29
30
31
32
33
34extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
35 int len, __wsum sum, int *csum_err);
36
37#define csum_partial_copy_nocheck(src, dst, len, sum) \
38 csum_partial_copy((src), (dst), (len), (sum))
39
40
41
42
43static inline __sum16 csum_fold(__wsum csum)
44{
45 u32 sum = (__force u32)csum;
46 sum = (sum & 0xffff) + (sum >> 16);
47 sum = (sum & 0xffff) + (sum >> 16);
48 return (__force __sum16)~sum;
49}
50
51
52
53
54
55extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
56
57
58
59
60
61static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
62 unsigned short len,
63 unsigned short proto,
64 __wsum sum)
65{
66 unsigned long len_proto = (proto + len) << 8;
67 asm ("ADDS %0, %0, %1\n"
68 "ADDCS %0, %0, #1\n"
69 "ADDS %0, %0, %2\n"
70 "ADDCS %0, %0, #1\n"
71 "ADDS %0, %0, %3\n"
72 "ADDCS %0, %0, #1\n"
73 : "=d" (sum)
74 : "d" (daddr), "d" (saddr), "d" (len_proto),
75 "0" (sum)
76 : "cc");
77 return sum;
78}
79
80static inline __sum16
81csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
82 unsigned short proto, __wsum sum)
83{
84 return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
85}
86
87
88
89
90
91extern __sum16 ip_compute_csum(const void *buff, int len);
92
93#endif
94