csum_partial_copy.c revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
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 22#include <net/checksum.h> 23#include <asm/byteorder.h> 24#include <asm/string.h> 25#include <asm/uaccess.h> 26 27/* 28 * Copy while checksumming, otherwise like csum_partial 29 */ 30unsigned int 31csum_partial_copy_nocheck (const unsigned char *src, unsigned char *dst, 32 int len, unsigned int sum) 33{ 34 sum = csum_partial(src, len, sum); 35 memcpy(dst, src, len); 36 37 return sum; 38} 39EXPORT_SYMBOL(csum_partial_copy_nocheck); 40 41/* 42 * Copy from userspace and compute checksum. If we catch an exception 43 * then zero the rest of the buffer. 44 */ 45unsigned int 46csum_partial_copy_from_user (const unsigned char __user *src, 47 unsigned char *dst, 48 int len, unsigned int sum, int *err_ptr) 49{ 50 int missing; 51 52 missing = copy_from_user(dst, src, len); 53 if (missing) { 54 memset(dst + len - missing, 0, missing); 55 *err_ptr = -EFAULT; 56 } 57 58 return csum_partial(dst, len-missing, sum); 59} 60EXPORT_SYMBOL(csum_partial_copy_from_user); 61