2005-04-16 15:20:36 -07:00
/*
* INET An implementation of the TCP / IP protocol suite for the LINUX
* operating system . INET is implemented using the BSD Socket
* interface as the means of communication with the user level .
*
* M32R specific IP / TCP / UDP checksumming routines
* ( Some code taken from MIPS architecture )
*
* 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 .
*
* Copyright ( C ) 1994 , 1995 Waldorf Electronics GmbH
* Copyright ( C ) 1998 , 1999 Ralf Baechle
* Copyright ( C ) 2001 - 2005 Hiroyuki Kondo , Hirokazu Takata
*
*/
# include <linux/module.h>
# include <linux/types.h>
2005-10-30 15:03:48 -08:00
# include <linux/string.h>
2005-04-16 15:20:36 -07:00
# include <net/checksum.h>
# include <asm/byteorder.h>
# include <asm/uaccess.h>
/*
* Copy while checksumming , otherwise like csum_partial
*/
2006-11-14 21:16:55 -08:00
__wsum
csum_partial_copy_nocheck ( const void * src , void * dst , int len , __wsum sum )
2005-04-16 15:20:36 -07:00
{
sum = csum_partial ( src , len , sum ) ;
memcpy ( dst , src , len ) ;
return sum ;
}
EXPORT_SYMBOL ( csum_partial_copy_nocheck ) ;
/*
* Copy from userspace and compute checksum . If we catch an exception
* then zero the rest of the buffer .
*/
2006-11-14 21:16:55 -08:00
__wsum
csum_partial_copy_from_user ( const void __user * src , void * dst ,
int len , __wsum sum , int * err_ptr )
2005-04-16 15:20:36 -07:00
{
int missing ;
missing = copy_from_user ( dst , src , len ) ;
if ( missing ) {
memset ( dst + len - missing , 0 , missing ) ;
* err_ptr = - EFAULT ;
}
return csum_partial ( dst , len - missing , sum ) ;
}
EXPORT_SYMBOL ( csum_partial_copy_from_user ) ;
2005-08-23 22:47:57 +01:00
EXPORT_SYMBOL ( csum_partial ) ;