1/* 2 * INET An implementation of the TCP/IP protocol suite for the LINUX 3 * operating system. INET is implemented using the BSD Socket 4 * interface as the means of communication with the user level. 5 * 6 * M32R specific IP/TCP/UDP checksumming routines 7 * (Some code taken from MIPS architecture) 8 * 9 * This file is subject to the terms and conditions of the GNU General Public 10 * License. See the file "COPYING" in the main directory of this archive 11 * for more details. 12 * 13 * Copyright (C) 1994, 1995 Waldorf Electronics GmbH 14 * Copyright (C) 1998, 1999 Ralf Baechle 15 * Copyright (C) 2001-2005 Hiroyuki Kondo, Hirokazu Takata 16 * 17 */ 18 19#include <linux/module.h> 20#include <linux/types.h> 21#include <linux/string.h> 22 23#include <net/checksum.h> 24#include <asm/byteorder.h> 25#include <asm/uaccess.h> 26 27/* 28 * Copy while checksumming, otherwise like csum_partial 29 */ 30__wsum 31csum_partial_copy_nocheck (const void *src, void *dst, int len, __wsum sum) 32{ 33 sum = csum_partial(src, len, sum); 34 memcpy(dst, src, len); 35 36 return sum; 37} 38EXPORT_SYMBOL(csum_partial_copy_nocheck); 39 40/* 41 * Copy from userspace and compute checksum. If we catch an exception 42 * then zero the rest of the buffer. 43 */ 44__wsum 45csum_partial_copy_from_user (const void __user *src, void *dst, 46 int len, __wsum sum, int *err_ptr) 47{ 48 int missing; 49 50 missing = copy_from_user(dst, src, len); 51 if (missing) { 52 memset(dst + len - missing, 0, missing); 53 *err_ptr = -EFAULT; 54 } 55 56 return csum_partial(dst, len-missing, sum); 57} 58EXPORT_SYMBOL(csum_partial_copy_from_user); 59EXPORT_SYMBOL(csum_partial); 60