Release 4.12 include/net/checksum.h
/*
* 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.
*
* Checksumming functions for IP, TCP, UDP and so on
*
* Authors: Jorge Cwik, <jorge@laser.satlink.net>
* Arnt Gulbrandsen, <agulbra@nvg.unit.no>
* Borrows very liberally from tcp.c and ip.c, see those
* files for more names.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _CHECKSUM_H
#define _CHECKSUM_H
#include <linux/errno.h>
#include <asm/types.h>
#include <asm/byteorder.h>
#include <linux/uaccess.h>
#include <asm/checksum.h>
#ifndef _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
static inline
__wsum csum_and_copy_from_user (const void __user *src, void *dst,
int len, __wsum sum, int *err_ptr)
{
if (access_ok(VERIFY_READ, src, len))
return csum_partial_copy_from_user(src, dst, len, sum, err_ptr);
if (len)
*err_ptr = -EFAULT;
return sum;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 59 | 90.77% | 2 | 40.00% |
Al Viro | 5 | 7.69% | 2 | 40.00% |
Jesper Juhl | 1 | 1.54% | 1 | 20.00% |
Total | 65 | 100.00% | 5 | 100.00% |
#endif
#ifndef HAVE_CSUM_COPY_USER
static __inline__ __wsum csum_and_copy_to_user
(const void *src, void __user *dst, int len, __wsum sum, int *err_ptr)
{
sum = csum_partial(src, len, sum);
if (access_ok(VERIFY_WRITE, dst, len)) {
if (copy_to_user(dst, src, len) == 0)
return sum;
}
if (len)
*err_ptr = -EFAULT;
return (__force __wsum)-1; /* invalid checksum */
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 77 | 89.53% | 1 | 33.33% |
Al Viro | 9 | 10.47% | 2 | 66.67% |
Total | 86 | 100.00% | 3 | 100.00% |
#endif
#ifndef HAVE_ARCH_CSUM_ADD
static inline __wsum csum_add(__wsum csum, __wsum addend)
{
u32 res = (__force u32)csum;
res += (__force u32)addend;
return (__force __wsum)(res + (res < (__force u32)addend));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Al Viro | 28 | 57.14% | 1 | 33.33% |
Linus Torvalds (pre-git) | 21 | 42.86% | 2 | 66.67% |
Total | 49 | 100.00% | 3 | 100.00% |
#endif
static inline __wsum csum_sub(__wsum csum, __wsum addend)
{
return csum_add(csum, ~addend);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 19 | 86.36% | 1 | 50.00% |
Al Viro | 3 | 13.64% | 1 | 50.00% |
Total | 22 | 100.00% | 2 | 100.00% |
static inline __sum16 csum16_add(__sum16 csum, __be16 addend)
{
u16 res = (__force u16)csum;
res += (__force u16)addend;
return (__force __sum16)(res + (res < (__force u16)addend));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Eric Dumazet | 49 | 100.00% | 1 | 100.00% |
Total | 49 | 100.00% | 1 | 100.00% |
static inline __sum16 csum16_sub(__sum16 csum, __be16 addend)
{
return csum16_add(csum, ~addend);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Eric Dumazet | 22 | 100.00% | 1 | 100.00% |
Total | 22 | 100.00% | 1 | 100.00% |
static inline __wsum
csum_block_add(__wsum csum, __wsum csum2, int offset)
{
u32 sum = (__force u32)csum2;
/* rotate sum to align it with a 16b boundary */
if (offset & 1)
sum = ror32(sum, 8);
return csum_add(csum, (__force __wsum)sum);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 29 | 54.72% | 1 | 33.33% |
Al Viro | 19 | 35.85% | 1 | 33.33% |
Alexander Duyck | 5 | 9.43% | 1 | 33.33% |
Total | 53 | 100.00% | 3 | 100.00% |
static inline __wsum
csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len)
{
return csum_block_add(csum, csum2, offset);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Daniel Borkmann | 26 | 89.66% | 1 | 33.33% |
Linus Torvalds (pre-git) | 2 | 6.90% | 1 | 33.33% |
Al Viro | 1 | 3.45% | 1 | 33.33% |
Total | 29 | 100.00% | 3 | 100.00% |
static inline __wsum
csum_block_sub(__wsum csum, __wsum csum2, int offset)
{
return csum_block_add(csum, ~csum2, offset);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 17 | 62.96% | 1 | 25.00% |
Alexander Duyck | 5 | 18.52% | 1 | 25.00% |
Daniel Borkmann | 3 | 11.11% | 1 | 25.00% |
Al Viro | 2 | 7.41% | 1 | 25.00% |
Total | 27 | 100.00% | 4 | 100.00% |
static inline __wsum csum_unfold(__sum16 n)
{
return (__force __wsum)n;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Al Viro | 17 | 100.00% | 1 | 100.00% |
Total | 17 | 100.00% | 1 | 100.00% |
static inline __wsum csum_partial_ext(const void *buff, int len, __wsum sum)
{
return csum_partial(buff, len, sum);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Daniel Borkmann | 28 | 100.00% | 1 | 100.00% |
Total | 28 | 100.00% | 1 | 100.00% |
#define CSUM_MANGLED_0 ((__force __sum16)0xffff)
static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
{
*sum = csum_fold(csum_add(diff, ~csum_unfold(*sum)));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Daniel Borkmann | 32 | 100.00% | 1 | 100.00% |
Total | 32 | 100.00% | 1 | 100.00% |
static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to)
{
__wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from);
*sum = csum_fold(csum_add(tmp, (__force __wsum)to));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Patrick McHardy | 27 | 50.94% | 1 | 33.33% |
Eric Dumazet | 20 | 37.74% | 1 | 33.33% |
Christophe Leroy | 6 | 11.32% | 1 | 33.33% |
Total | 53 | 100.00% | 3 | 100.00% |
/* Implements RFC 1624 (Incremental Internet Checksum)
* 3. Discussion states :
* HC' = ~(~HC + ~m + m')
* m : old value of a 16bit field
* m' : new value of a 16bit field
*/
static inline void csum_replace2(__sum16 *sum, __be16 old, __be16 new)
{
*sum = ~csum16_add(csum16_sub(~(*sum), old), new);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Patrick McHardy | 21 | 56.76% | 1 | 50.00% |
Eric Dumazet | 16 | 43.24% | 1 | 50.00% |
Total | 37 | 100.00% | 2 | 100.00% |
struct sk_buff;
void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
__be32 from, __be32 to, bool pseudohdr);
void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
const __be32 *from, const __be32 *to,
bool pseudohdr);
void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
__wsum diff, bool pseudohdr);
static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
__be16 from, __be16 to,
bool pseudohdr)
{
inet_proto_csum_replace4(sum, skb, (__force __be32)from,
(__force __be32)to, pseudohdr);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Patrick McHardy | 45 | 97.83% | 1 | 50.00% |
Tom Herbert | 1 | 2.17% | 1 | 50.00% |
Total | 46 | 100.00% | 2 | 100.00% |
static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
int start, int offset)
{
__sum16 *psum = (__sum16 *)(ptr + offset);
__wsum delta;
/* Subtract out checksum up to start */
csum = csum_sub(csum, csum_partial(ptr, start, 0));
/* Set derived checksum in packet */
delta = csum_sub((__force __wsum)csum_fold(csum),
(__force __wsum)*psum);
*psum = csum_fold(csum);
return delta;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Tom Herbert | 87 | 100.00% | 2 | 100.00% |
Total | 87 | 100.00% | 2 | 100.00% |
static inline void remcsum_unadjust(__sum16 *psum, __wsum delta)
{
*psum = csum_fold(csum_sub(delta, (__force __wsum)*psum));
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Tom Herbert | 28 | 87.50% | 1 | 50.00% |
Lance Richardson | 4 | 12.50% | 1 | 50.00% |
Total | 32 | 100.00% | 2 | 100.00% |
#endif
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 252 | 29.72% | 8 | 25.81% |
Patrick McHardy | 142 | 16.75% | 2 | 6.45% |
Tom Herbert | 142 | 16.75% | 6 | 19.35% |
Eric Dumazet | 108 | 12.74% | 2 | 6.45% |
Daniel Borkmann | 89 | 10.50% | 3 | 9.68% |
Al Viro | 88 | 10.38% | 3 | 9.68% |
Alexander Duyck | 10 | 1.18% | 1 | 3.23% |
Christophe Leroy | 6 | 0.71% | 1 | 3.23% |
Lance Richardson | 4 | 0.47% | 1 | 3.23% |
Arnaldo Carvalho de Melo | 3 | 0.35% | 1 | 3.23% |
David S. Miller | 2 | 0.24% | 1 | 3.23% |
Linus Torvalds | 1 | 0.12% | 1 | 3.23% |
Jesper Juhl | 1 | 0.12% | 1 | 3.23% |
Total | 848 | 100.00% | 31 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.