Blame view

kernel/linux-rt-4.4.41/arch/nios2/include/asm/checksum.h 2.09 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  /*
   * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
   * Copyright (C) 2004 Microtronix Datacom Ltd.
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License. See the file "COPYING" in the main directory of this archive
   * for more details.
   */
  
  #ifndef _ASM_NIOS_CHECKSUM_H
  #define _ASM_NIOS_CHECKSUM_H
  
  /* Take these from lib/checksum.c */
  extern __wsum csum_partial(const void *buff, int len, __wsum sum);
  extern __wsum csum_partial_copy(const void *src, void *dst, int len,
  				__wsum sum);
  extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
  					int len, __wsum sum, int *csum_err);
  #define csum_partial_copy_nocheck(src, dst, len, sum)	\
  	csum_partial_copy((src), (dst), (len), (sum))
  
  extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
  extern __sum16 ip_compute_csum(const void *buff, int len);
  
  /*
   * Fold a partial checksum
   */
  static inline __sum16 csum_fold(__wsum sum)
  {
  	__asm__ __volatile__(
  		"add	%0, %1, %0
  "
  		"cmpltu	r8, %0, %1
  "
  		"srli	%0, %0, 16
  "
  		"add	%0, %0, r8
  "
  		"nor	%0, %0, %0
  "
  		: "=r" (sum)
  		: "r" (sum << 16), "0" (sum)
  		: "r8");
  	return (__force __sum16) sum;
  }
  
  /*
   * computes the checksum of the TCP/UDP pseudo-header
   * returns a 16-bit checksum, already complemented
   */
  #define csum_tcpudp_nofold csum_tcpudp_nofold
  static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
  					unsigned short len,
  					unsigned short proto,
  					__wsum sum)
  {
  	__asm__ __volatile__(
  		"add	%0, %1, %0
  "
  		"cmpltu	r8, %0, %1
  "
  		"add	%0, %0, r8
  "	/* add carry */
  		"add	%0, %2, %0
  "
  		"cmpltu	r8, %0, %2
  "
  		"add	%0, %0, r8
  "	/* add carry */
  		"add	%0, %3, %0
  "
  		"cmpltu	r8, %0, %3
  "
  		"add	%0, %0, r8
  "	/* add carry */
  		: "=r" (sum), "=r" (saddr)
  		: "r" (daddr), "r" ((ntohs(len) << 16) + (proto * 256)),
  		  "0" (sum),
  		  "1" (saddr)
  		: "r8");
  
  	return sum;
  }
  
  static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
  					unsigned short len,
  					unsigned short proto, __wsum sum)
  {
  	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
  }
  
  #endif /* _ASM_NIOS_CHECKSUM_H */