Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32252996 authored by Al Viro's avatar Al Viro Committed by David S. Miller
Browse files

[NET]: IA64 checksum annotations and cleanups.



* sanitize prototypes, annotate
* ntohs -> shift in checksum calculations
* kill access_ok() in csum_partial_copy_from_user
* collapse do_csum_partial_copy_from_user

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent db521083
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -33,32 +33,32 @@ from64to16 (unsigned long x)
 * computes the checksum of the TCP/UDP pseudo-header
 * returns a 16-bit checksum, already complemented.
 */
unsigned short int
csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len,
		   unsigned short proto, unsigned int sum)
__sum16
csum_tcpudp_magic (__be32 saddr, __be32 daddr, unsigned short len,
		   unsigned short proto, __wsum sum)
{
	return ~from64to16(saddr + daddr + sum + ((unsigned long) ntohs(len) << 16) +
			   ((unsigned long) proto << 8));
	return (__force __sum16)~from64to16(
		(__force u64)saddr + (__force u64)daddr +
		(__force u64)sum + ((len + proto) << 8));
}

EXPORT_SYMBOL(csum_tcpudp_magic);

unsigned int
csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len,
		    unsigned short proto, unsigned int sum)
__wsum
csum_tcpudp_nofold (__be32 saddr, __be32 daddr, unsigned short len,
		    unsigned short proto, __wsum sum)
{
	unsigned long result;

	result = (saddr + daddr + sum +
		  ((unsigned long) ntohs(len) << 16) +
		  ((unsigned long) proto << 8));
	result = (__force u64)saddr + (__force u64)daddr +
		 (__force u64)sum + ((len + proto) << 8);

	/* Fold down to 32-bits so we don't lose in the typedef-less network stack.  */
	/* 64 to 33 */
	result = (result & 0xffffffff) + (result >> 32);
	/* 33 to 32 */
	result = (result & 0xffffffff) + (result >> 32);
	return result;
	return (__force __wsum)result;
}

extern unsigned long do_csum (const unsigned char *, long);
@@ -75,16 +75,15 @@ extern unsigned long do_csum (const unsigned char *, long);
 *
 * it's best to have buff aligned on a 32-bit boundary
 */
unsigned int
csum_partial (const unsigned char * buff, int len, unsigned int sum)
__wsum csum_partial(const void *buff, int len, __wsum sum)
{
	unsigned long result = do_csum(buff, len);
	u64 result = do_csum(buff, len);

	/* add in old sum, and carry.. */
	result += sum;
	result += (__force u32)sum;
	/* 32+c bits -> 32 bits */
	result = (result & 0xffffffff) + (result >> 32);
	return result;
	return (__force __wsum)result;
}

EXPORT_SYMBOL(csum_partial);
@@ -93,10 +92,9 @@ EXPORT_SYMBOL(csum_partial);
 * this routine is used for miscellaneous IP-like checksums, mainly
 * in icmp.c
 */
unsigned short
ip_compute_csum (unsigned char * buff, int len)
__sum16 ip_compute_csum (const void *buff, int len)
{
	return ~do_csum(buff,len);
	return (__force __sum16)~do_csum(buff,len);
}

EXPORT_SYMBOL(ip_compute_csum);
+9 −22
Original line number Diff line number Diff line
@@ -104,9 +104,9 @@ unsigned long do_csum_c(const unsigned char * buff, int len, unsigned int psum)
 */
extern unsigned long do_csum(const unsigned char *, long);

static unsigned int
do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst,
				int len, unsigned int psum, int *errp)
__wsum
csum_partial_copy_from_user(const void __user *src, void *dst,
				int len, __wsum psum, int *errp)
{
	unsigned long result;

@@ -122,30 +122,17 @@ do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *
	result = do_csum(dst, len);

	/* add in old sum, and carry.. */
	result += psum;
	result += (__force u32)psum;
	/* 32+c bits -> 32 bits */
	result = (result & 0xffffffff) + (result >> 32);
	return result;
}

unsigned int
csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst,
			     int len, unsigned int sum, int *errp)
{
	if (!access_ok(VERIFY_READ, src, len)) {
		*errp = -EFAULT;
		memset(dst, 0, len);
		return sum;
	}

	return do_csum_partial_copy_from_user(src, dst, len, sum, errp);
	return (__force __wsum)result;
}

unsigned int
csum_partial_copy_nocheck(const unsigned char __user *src, unsigned char *dst,
			  int len, unsigned int sum)
__wsum
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
{
	return do_csum_partial_copy_from_user(src, dst, len, sum, NULL);
	return csum_partial_copy_from_user((__force const void __user *)src,
					   dst, len, sum, NULL);
}

EXPORT_SYMBOL(csum_partial_copy_nocheck);
+14 −17
Original line number Diff line number Diff line
@@ -10,23 +10,21 @@
 * This is a version of ip_compute_csum() optimized for IP headers,
 * which always checksum on 4 octet boundaries.
 */
extern unsigned short ip_fast_csum (unsigned char * iph, unsigned int ihl);
extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);

/*
 * Computes the checksum of the TCP/UDP pseudo-header returns a 16-bit
 * checksum, already complemented
 */
extern unsigned short int csum_tcpudp_magic (unsigned long saddr,
					     unsigned long daddr,
extern __sum16 csum_tcpudp_magic (__be32 saddr, __be32 daddr,
					     unsigned short len,
					     unsigned short proto,
					     unsigned int sum);
					     __wsum sum);

extern unsigned int csum_tcpudp_nofold (unsigned long saddr,
					unsigned long daddr,
extern __wsum csum_tcpudp_nofold (__be32 saddr, __be32 daddr,
					unsigned short len,
					unsigned short proto,
					unsigned int sum);
					__wsum sum);

/*
 * Computes the checksum of a memory block at buff, length len,
@@ -40,8 +38,7 @@ extern unsigned int csum_tcpudp_nofold (unsigned long saddr,
 *
 * it's best to have buff aligned on a 32-bit boundary
 */
extern unsigned int csum_partial (const unsigned char * buff, int len,
				  unsigned int sum);
extern __wsum csum_partial(const void *buff, int len, __wsum sum);

/*
 * Same as csum_partial, but copies from src while it checksums.
@@ -49,28 +46,28 @@ extern unsigned int csum_partial (const unsigned char * buff, int len,
 * Here it is even more important to align src and dst on a 32-bit (or
 * even better 64-bit) boundary.
 */
extern unsigned int csum_partial_copy_from_user (const char *src, char *dst,
						 int len, unsigned int sum,
extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
						 int len, __wsum sum,
						 int *errp);

extern unsigned int csum_partial_copy_nocheck (const char *src, char *dst,
					       int len, unsigned int sum);
extern __wsum csum_partial_copy_nocheck(const void *src, void *dst,
					       int len, __wsum sum);

/*
 * This routine is used for miscellaneous IP-like checksums, mainly in
 * icmp.c
 */
extern unsigned short ip_compute_csum (unsigned char *buff, int len);
extern __sum16 ip_compute_csum(const void *buff, int len);

/*
 * Fold a partial checksum without adding pseudo headers.
 */
static inline unsigned short
csum_fold (unsigned int sum)
static inline __sum16 csum_fold(__wsum csum)
{
	u32 sum = (__force u32)csum;
	sum = (sum & 0xffff) + (sum >> 16);
	sum = (sum & 0xffff) + (sum >> 16);
	return ~sum;
	return (__force __sum16)~sum;
}

#endif /* _ASM_IA64_CHECKSUM_H */