0
  *   ˆl–Ü4ý( ©³( 	Å€fàB¦-ÿÂƒÂk_†I|¥�+ÁÅ      /* SPDX-License-Identifier: GPL-2.0-or-later */
/* SCTP kernel reference Implementation
 * Copyright (c) 1999-2001 Motorola, Inc.
 * Copyright (c) 2001-2003 International Business Machines, Corp.
 *
 * This file is part of the SCTP kernel reference Implementation
 *
 * SCTP Checksum functions
 *
 * Please send any bug reports or fixes you make to the
 * email address(es):
 *    lksctp developers <linux-sctp@vger.kernel.org>
 *
 * Written or modified by:
 *    Dinakaran Joseph
 *    Jon Grimm <jgrimm@us.ibm.com>
 *    Sridhar Samudrala <sri@us.ibm.com>
 *
 * Rewritten to use libcrc32c by:
 *    Vlad Yasevich <vladislav.yasevich@hp.com>
 */

#ifndef __sctp_checksum_h__
#define __sctp_checksum_h__

#include <linux/types.h>
#include <linux/sctp.h>
#include <linux/crc32c.h>
#include <linux/crc32.h>

static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum)
{
	/* This uses the crypto implementation of crc32c, which is either
	 * implemented w/ hardware support or resolves to __crc32c_le().
	 */
	return (__force __wsum)crc32c((__force __u32)sum, buff, len);
}

static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
				       int offset, int len)
{
	return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
						   (__force __u32)csum2, len);
}

static const struct skb_checksum_ops sctp_csum_ops = {
	.update  = sctp_csum_update,
	.combine = sctp_csum_combine,
};

static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
					unsigned int offset)
{
	struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);
	__le32 old = sh->checksum;
	__wsum new;

	sh->checksum = 0;
	new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0,
			      &sctp_csum_ops);
	sh->checksum = old;

	return cpu_to_le32((__force __u32)new);
}

#endif /* __sctp_checksum_h__ */
  1   ˆl–ßi~”êh¥8 Eq‘\eÅ1hßÄ„dO8_ŒuÐb&=Ly[Ï¿ÃÇ ?÷     ý7zXZ  i"Þ6 !   t/å£áß€]  0qk4Öº}ÑÛWµyB„…÷Í‘*P*0¡n�j={N?±Å¼{¡°ì­O‘¯±H7{y¤¡‡ìjn^Ý¦Õ-W“Ò÷$ÍóÝ@—ÝÏª·Î,.�ÏpöŸÃYümfË—ÉB÷ÑòÀ2_ßqi†ŠÉ™xø£B†ÅØˆ.Í’4*„‘ê¹÷ÃF-
9u„zã­Øôo'O—´W(®Î1wý&Ù-ìª6
O
òBeÂçGc”Á!£.ã	cYëªÌ�³0àåÝ¯é¶ÑŽ‰2vÇÉÕáçW±�­pô®<ðfÏ«;›Þ®n˜`(	NŸvÇÃÐ°¥VàÔ]ÇNpÁ§ìû¦w-	»e)jó¾’n‘ûØkæ·áSQ*—¼zÍžý�âØí¬…s@<Ø-ÐÁÙåeƒY='Gßú}^†¨sý9{…šÍ—~N~ÁO ïâ-©?ƒ×D‰K¿(×UK>¡Oƒ«D‹Â„ðSWbWx˜0ãÝÝñ4MÑsX}7˜$§D¥‚þ�út\¥&r©œ šY˜%Ê>1ñð03nKN[kòKÜJ¸m­'9ôáh©²až¶ÂÞÌk0¹„]8©’-ý%`:�6¬üÑï�'÷:;ÉñœVÊŽ'–Ÿw—ßüýÈ®:ÅÔ~xùxUÿ+Ñh”4,ð\ÃÔ¢iÞÝ^X4°•!¸ÖV{¥ë¿ÃÛÛƒÓÕC$ú§BY,}�øŸå§æ4½7D×;¦&4áDvMÜ×'SÓPÀ4*¨†j±jŠÖô�¼>7ÚºSYúœ#uz|ï®ÅvÖÄáå,[óbûònøVÃq{Lsv¨Æ%có<£EÖy«LIx:®7âÈÿ`E16½PÏ¾nAþ¿)>{´¼þV% ä¬g÷k…ñ@OzH—5ÿ±x©,ª˜Éz¹ÄWeOg°­6ó±N×O´¡.¨ð¬%ÊGtÒH‘c]�Ì÷Ú}?G�y‘fYÿƒ'þM[˜E„!×y›¤ëgæmŽ„œZEÕØ§c~±ÄÈ‹šK4’N©b�8¿C»&µêPŠ34â¡ÉŸ2È–h°Ê4w²Ö�…jEgáÎR…3	UÙ¹ú8–¦4R5“g†�˜e°öõò"r`”�Óƒˆ=sÁøw¨/­&BÏ{…XP	#é¿×�ÕÔÏwgv¨
„	{ÿg³¦_��Š5-/äø>ŠÜ]ÛÅû>›ë,¦Ôw		®ïv	”¾ów^Î1×uƒÚG(wk…í›ëÞùc3‡ß»Î½ä%­¯.„É9lÉ³üj uÌndÌŸ€A	ÿ‡”æ#ûhi¶mÏ<ép¥kæÙ9«ý€ÏòvÄ§8²#öŽ%H�«6¶ØXñ»{‰íìre~ô�éûó;Á§+2"®Ü‘'ûêòÁ“{²a%‘$àê5gµ¬b(�RÃG]Éê�K$šsîñÊ\Ÿ|îµüÞœÖÌdú"ï—­Ô‘ª á—ACtùtLÌ^
ÍÒ¸�¿µkK|/5bÑãôhçªd6�TêN<Þ² o´ò£ùT–ê	8þJä°GÖ^áû¤Á_{ÒâŒ’½ÞsîÉ–g·½î‘¢ùXœgŒh†"xîÜZ‚÷pàk�èš\r6¡@báÅWƒó(BW Šp›PSÍ¬ø9ŸH�â�4^‘ãÛS¹Úªû„îppôzj¢¡\ínpXx¥Ì`qÙ›åÁ¯� øs7�æÇ·?™®[7#zñ&
ð–rs	—ß$¿ã#±�ú,E9pAr¿®êþñš¼ú-tqÞRÀªB‘}�N<Åu^‚Fq“àoÚ�_þ<Î+ÝŽú6éˆŸÎëJ½ó§=�ßXTWVˆæw«­§A{�ˆcAóDGé¿@e°Üv÷½Ù½Ãì`håÍQØÑ·Ãÿm	ÐçG1„%´ŽICÖšl\µqÞä²û@Æ‰ßë÷&àQÓ;YÉ×}F r3Žç‘Ðyn¡®:š5ñx¬÷Gc…[ºÅÜ@¼|2Þ‚›1S±Ó¡»upvwÅ)—ccÏ�ç†°êˆà|b²gk['<hèðS3ª„S"7ÝÙT¿g³­’útÒ�tEÉ5“5Ê4ºËóQ(àÓ1ŸkÄ3„ÇFý‘¯œà-y²|¯k~úw7ÔIó�¨“ä¬Áëèr`:—²’•�0Ày°N«Ö(èYƒÜR‰eÀÌÊŒ.Ç20
§¿íEcºó2t—]Ù#Û$
�Gô(ÿîø£�çî:}S3ÇzÓ9y«µfƒÄumg²lþîC”æW�»§5sïŠùÊVº©�ÞAìÑz>\ëX2ŸÔOìÊBZè•N/!Ôî”®'+gÀbUHËã¨>t@}E£?tÁT ;Öò#j;ì”Mž¤GÜI3¤S¸ýˆ;•Ó<�}é]‘ç (‡Ú4�3?Þá�¨¯h�ž}«×&†sE[úÈZ;ûÊÑóC|SýÉ@: ÍøQÑ(¡®OÜÆüL[ÑÛš>»k-PÒý-ãP~»0?—¨¡y©Øâ n¨¶ð@ÌÙ<™û/";G[c¬Kî'æ‘ò÷.(¿ æÈùÏ¦HsAåhÜÿf¬—ýLÇÃã­cö,”µ6¸ñ^íÄî@ašÑ [îˆ�²x(”÷­¬µ�wX¼Ê¹~Ð_�G"½YnŠŠ·¨ïä+/i÷êóŽKÕœ1ž05bµýd¾Ü Ø²•¤2@ôç†<É!|