| .. | .. |
|---|
| 12 | 12 | #include <linux/types.h> |
|---|
| 13 | 13 | #include <linux/string.h> |
|---|
| 14 | 14 | |
|---|
| 15 | | -#include <linux/uaccess.h> |
|---|
| 15 | +#include <net/checksum.h> |
|---|
| 16 | 16 | |
|---|
| 17 | 17 | /* |
|---|
| 18 | 18 | * XXX Fixme: those 2 inlines are meant for debugging and will go away |
|---|
| .. | .. |
|---|
| 96 | 96 | out: |
|---|
| 97 | 97 | return result; |
|---|
| 98 | 98 | } |
|---|
| 99 | | - |
|---|
| 100 | | -/* |
|---|
| 101 | | - * XXX Fixme |
|---|
| 102 | | - * |
|---|
| 103 | | - * This is very ugly but temporary. THIS NEEDS SERIOUS ENHANCEMENTS. |
|---|
| 104 | | - * But it's very tricky to get right even in C. |
|---|
| 105 | | - */ |
|---|
| 106 | | -extern unsigned long do_csum(const unsigned char *, long); |
|---|
| 107 | | - |
|---|
| 108 | | -__wsum |
|---|
| 109 | | -csum_partial_copy_from_user(const void __user *src, void *dst, |
|---|
| 110 | | - int len, __wsum psum, int *errp) |
|---|
| 111 | | -{ |
|---|
| 112 | | - unsigned long result; |
|---|
| 113 | | - |
|---|
| 114 | | - /* XXX Fixme |
|---|
| 115 | | - * for now we separate the copy from checksum for obvious |
|---|
| 116 | | - * alignment difficulties. Look at the Alpha code and you'll be |
|---|
| 117 | | - * scared. |
|---|
| 118 | | - */ |
|---|
| 119 | | - |
|---|
| 120 | | - if (__copy_from_user(dst, src, len) != 0 && errp) |
|---|
| 121 | | - *errp = -EFAULT; |
|---|
| 122 | | - |
|---|
| 123 | | - result = do_csum(dst, len); |
|---|
| 124 | | - |
|---|
| 125 | | - /* add in old sum, and carry.. */ |
|---|
| 126 | | - result += (__force u32)psum; |
|---|
| 127 | | - /* 32+c bits -> 32 bits */ |
|---|
| 128 | | - result = (result & 0xffffffff) + (result >> 32); |
|---|
| 129 | | - return (__force __wsum)result; |
|---|
| 130 | | -} |
|---|
| 131 | | - |
|---|
| 132 | | -EXPORT_SYMBOL(csum_partial_copy_from_user); |
|---|
| 133 | | - |
|---|
| 134 | | -__wsum |
|---|
| 135 | | -csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) |
|---|
| 136 | | -{ |
|---|
| 137 | | - return csum_partial_copy_from_user((__force const void __user *)src, |
|---|
| 138 | | - dst, len, sum, NULL); |
|---|
| 139 | | -} |
|---|
| 140 | | - |
|---|
| 141 | | -EXPORT_SYMBOL(csum_partial_copy_nocheck); |
|---|