cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

checksum.h (1827B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/* SCTP kernel reference Implementation
      3 * Copyright (c) 1999-2001 Motorola, Inc.
      4 * Copyright (c) 2001-2003 International Business Machines, Corp.
      5 *
      6 * This file is part of the SCTP kernel reference Implementation
      7 *
      8 * SCTP Checksum functions
      9 *
     10 * Please send any bug reports or fixes you make to the
     11 * email address(es):
     12 *    lksctp developers <linux-sctp@vger.kernel.org>
     13 *
     14 * Written or modified by:
     15 *    Dinakaran Joseph
     16 *    Jon Grimm <jgrimm@us.ibm.com>
     17 *    Sridhar Samudrala <sri@us.ibm.com>
     18 *
     19 * Rewritten to use libcrc32c by:
     20 *    Vlad Yasevich <vladislav.yasevich@hp.com>
     21 */
     22
     23#ifndef __sctp_checksum_h__
     24#define __sctp_checksum_h__
     25
     26#include <linux/types.h>
     27#include <net/sctp/sctp.h>
     28#include <linux/crc32c.h>
     29#include <linux/crc32.h>
     30
     31static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum)
     32{
     33	/* This uses the crypto implementation of crc32c, which is either
     34	 * implemented w/ hardware support or resolves to __crc32c_le().
     35	 */
     36	return (__force __wsum)crc32c((__force __u32)sum, buff, len);
     37}
     38
     39static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
     40				       int offset, int len)
     41{
     42	return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
     43						   (__force __u32)csum2, len);
     44}
     45
     46static const struct skb_checksum_ops sctp_csum_ops = {
     47	.update  = sctp_csum_update,
     48	.combine = sctp_csum_combine,
     49};
     50
     51static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
     52					unsigned int offset)
     53{
     54	struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);
     55	__le32 old = sh->checksum;
     56	__wsum new;
     57
     58	sh->checksum = 0;
     59	new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0,
     60			      &sctp_csum_ops);
     61	sh->checksum = old;
     62
     63	return cpu_to_le32((__force __u32)new);
     64}
     65
     66#endif /* __sctp_checksum_h__ */