~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/asm-ppc64/checksum.h

Version: ~ [ linux-5.13-rc5 ] ~ [ linux-5.12.9 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.42 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.124 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.193 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.235 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.271 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.271 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _PPC64_CHECKSUM_H
  2 #define _PPC64_CHECKSUM_H
  3 
  4 /*
  5  * This program is free software; you can redistribute it and/or
  6  * modify it under the terms of the GNU General Public License
  7  * as published by the Free Software Foundation; either version
  8  * 2 of the License, or (at your option) any later version.
  9  */
 10 
 11 /*
 12  * This is a version of ip_compute_csum() optimized for IP headers,
 13  * which always checksum on 4 octet boundaries.  ihl is the number
 14  * of 32-bit words and is always >= 5.
 15  */
 16 extern unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl);
 17 
 18 /*
 19  * computes the checksum of the TCP/UDP pseudo-header
 20  * returns a 16-bit checksum, already complemented
 21  */
 22 extern unsigned short csum_tcpudp_magic(unsigned long saddr,
 23                                         unsigned long daddr,
 24                                         unsigned short len,
 25                                         unsigned short proto,
 26                                         unsigned int sum);
 27 
 28 /*
 29  * computes the checksum of a memory block at buff, length len,
 30  * and adds in "sum" (32-bit)
 31  *
 32  * returns a 32-bit number suitable for feeding into itself
 33  * or csum_tcpudp_magic
 34  *
 35  * this function must be called with even lengths, except
 36  * for the last fragment, which may be odd
 37  *
 38  * it's best to have buff aligned on a 32-bit boundary
 39  */
 40 extern unsigned int csum_partial(const unsigned char * buff, int len,
 41                                  unsigned int sum);
 42 
 43 /*
 44  * the same as csum_partial, but copies from src to dst while it
 45  * checksums
 46  */
 47 extern unsigned int csum_partial_copy_generic(const char *src, char *dst,
 48                                               int len, unsigned int sum,
 49                                               int *src_err, int *dst_err);
 50 /*
 51  * the same as csum_partial, but copies from src to dst while it
 52  * checksums.
 53  */
 54 
 55 unsigned int csum_partial_copy_nocheck(const char *src, 
 56                                        char *dst, 
 57                                        int len, 
 58                                        unsigned int sum);
 59 
 60 /*
 61  * turns a 32-bit partial checksum (e.g. from csum_partial) into a
 62  * 1's complement 16-bit checksum.
 63  */
 64 static inline unsigned int csum_fold(unsigned int sum)
 65 {
 66         unsigned int tmp;
 67 
 68         /* swap the two 16-bit halves of sum */
 69         __asm__("rlwinm %0,%1,16,0,31" : "=r" (tmp) : "r" (sum));
 70         /* if there is a carry from adding the two 16-bit halves,
 71            it will carry from the lower half into the upper half,
 72            giving us the correct sum in the upper half. */
 73         sum = ~(sum + tmp) >> 16;
 74         return sum;
 75 }
 76 
 77 /*
 78  * this routine is used for miscellaneous IP-like checksums, mainly
 79  * in icmp.c
 80  */
 81 static inline unsigned short ip_compute_csum(unsigned char * buff, int len)
 82 {
 83         return csum_fold(csum_partial(buff, len, 0));
 84 }
 85 
 86 #define csum_partial_copy_from_user(src, dst, len, sum, errp)   \
 87         csum_partial_copy_generic((src), (dst), (len), (sum), (errp), 0)
 88 
 89 #define csum_partial_copy_nocheck(src, dst, len, sum)   \
 90         csum_partial_copy_generic((src), (dst), (len), (sum), 0, 0)
 91 
 92 static inline u32 csum_tcpudp_nofold(u32 saddr,
 93                                      u32 daddr,
 94                                      unsigned short len,
 95                                      unsigned short proto,
 96                                      unsigned int sum)
 97 {
 98         unsigned long s = sum;
 99 
100         s += saddr;
101         s += daddr;
102         s += (proto << 16) + len;
103         s += (s >> 32);
104         return (u32) s;
105 }
106 
107 #endif
108 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp