linux/arch/m32r/lib/csum_partial_copy.c
<<
>>
Prefs
   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