diff options
Diffstat (limited to 'drivers/net/sk98lin/h/skcsum.h')
| -rw-r--r-- | drivers/net/sk98lin/h/skcsum.h | 261 | 
1 files changed, 261 insertions, 0 deletions
| diff --git a/drivers/net/sk98lin/h/skcsum.h b/drivers/net/sk98lin/h/skcsum.h new file mode 100644 index 000000000..2acae329e --- /dev/null +++ b/drivers/net/sk98lin/h/skcsum.h @@ -0,0 +1,261 @@ +/****************************************************************************** + * + * Name:	skcsum.h + * Project:	GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx) + * Version:	$Revision: 1.9 $ + * Date:	$Date: 2001/02/06 11:21:39 $ + * Purpose:	Store/verify Internet checksum in send/receive packets. + * + ******************************************************************************/ + +/****************************************************************************** + * + *	(C)Copyright 1998-2001 SysKonnect GmbH. + * + *	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. + * + *	The information in this file is provided "AS IS" without warranty. + * + ******************************************************************************/ + +/****************************************************************************** + * + * History: + * + *	$Log: skcsum.h,v $ + *	Revision 1.9  2001/02/06 11:21:39  rassmann + *	Editorial changes. + * + *	Revision 1.8  2001/02/06 11:15:36  rassmann + *	Supporting two nets on dual-port adapters. + * + *	Revision 1.7  2000/06/29 13:17:05  rassmann + *	Corrected reception of a packet with UDP checksum == 0 (which means there + *	is no UDP checksum). + * + *	Revision 1.6  2000/02/28 12:33:44  cgoos + *	Changed C++ style comments to C style. + * + *	Revision 1.5  2000/02/21 12:10:05  cgoos + *	Fixed license comment. + * + *	Revision 1.4  2000/02/21 11:08:37  cgoos + *	Merged changes back into common source. + * + *	Revision 1.1  1999/07/26 14:47:49  mkarl + *	changed from common source to windows specific source + *	added return SKCS_STATUS_IP_CSUM_ERROR_UDP and + *	SKCS_STATUS_IP_CSUM_ERROR_TCP to pass the NidsTester + *	changes for Tx csum offload + * + *	Revision 1.2  1998/09/04 12:16:34  mhaveman + *	Checked in for Stephan to allow compilation. + *	-Added definition SK_CSUM_EVENT_CLEAR_PROTO_STATS to clear statistic + *	-Added prototype for SkCsEvent() + * + *	Revision 1.1  1998/09/01 15:36:53  swolf + *	initial revision + * + *	01-Sep-1998 sw	Created. + * + ******************************************************************************/ + +/****************************************************************************** + * + * Description: + * + * Public header file for the "GEnesis" common module "CSUM". + * + * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon" + * and is the code name of this SysKonnect project. + * + * Compilation Options: + * + *	SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an + *	empty module. + * + *	SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id + *	definitions. In this case, all SKCS_PROTO_xxx definitions must be made + *	external. + * + *	SKCS_OVERWRITE_STATUS - Define to overwrite the default return status + *	definitions. In this case, all SKCS_STATUS_xxx definitions must be made + *	external. + * + * Include File Hierarchy: + * + *	"h/skcsum.h" + *	 "h/sktypes.h" + *	 "h/skqueue.h" + * + ******************************************************************************/ + +#ifndef __INC_SKCSUM_H +#define __INC_SKCSUM_H + +#include "h/sktypes.h" +#include "h/skqueue.h" + +/* defines ********************************************************************/ + +/* + * Define the default bit flags for 'SKCS_PACKET_INFO.ProtocolFlags'  if no user + * overwrite. + */ +#ifndef SKCS_OVERWRITE_PROTO	/* User overwrite? */ +#define SKCS_PROTO_IP	0x1	/* IP (Internet Protocol version 4) */ +#define SKCS_PROTO_TCP	0x2	/* TCP (Transmission Control Protocol) */ +#define SKCS_PROTO_UDP	0x4	/* UDP (User Datagram Protocol) */ + +/* Indices for protocol statistics. */ +#define SKCS_PROTO_STATS_IP	0 +#define SKCS_PROTO_STATS_UDP	1 +#define SKCS_PROTO_STATS_TCP	2 +#define SKCS_NUM_PROTOCOLS	3	/* Number of supported protocols. */ +#endif	/* !SKCS_OVERWRITE_PROTO */ + +/* + * Define the default SKCS_STATUS type and values if no user overwrite. + * + *	SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame. + *	SKCS_STATUS_IP_CSUM_ERROR - IP checksum error. + *	SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame. + *	SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame + *	SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok). + *	SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame). + *	SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok). + *	SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok). + *	SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok. + *	SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok. + *	SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. + */ +#ifndef SKCS_OVERWRITE_STATUS	/* User overwrite? */ +#define SKCS_STATUS	int	/* Define status type. */ + +#define SKCS_STATUS_UNKNOWN_IP_VERSION	1 +#define SKCS_STATUS_IP_CSUM_ERROR		2 +#define SKCS_STATUS_IP_FRAGMENT			3 +#define SKCS_STATUS_IP_CSUM_OK			4 +#define SKCS_STATUS_TCP_CSUM_ERROR		5 +#define SKCS_STATUS_UDP_CSUM_ERROR		6 +#define SKCS_STATUS_TCP_CSUM_OK			7 +#define SKCS_STATUS_UDP_CSUM_OK			8 +/* needed for Microsoft */ +#define SKCS_STATUS_IP_CSUM_ERROR_UDP	9 +#define SKCS_STATUS_IP_CSUM_ERROR_TCP	10 +/* UDP checksum may be omitted */ +#define SKCS_STATUS_IP_CSUM_OK_NO_UDP	11 +#endif	/* !SKCS_OVERWRITE_STATUS */ + +/* Clear protocol statistics event. */ +#define SK_CSUM_EVENT_CLEAR_PROTO_STATS	1 + +/* + * Add two values in one's complement. + * + * Note: One of the two input values may be "longer" than 16-bit, but then the + * resulting sum may be 17 bits long. In this case, add zero to the result using + * SKCS_OC_ADD() again. + * + *	Result = Value1 + Value2 + */ +#define SKCS_OC_ADD(Result, Value1, Value2) {				\ +	unsigned long Sum;						\ +									\ +	Sum = (unsigned long) (Value1) + (unsigned long) (Value2);	\ +	/* Add-in any carry. */						\ +	(Result) = (Sum & 0xffff) + (Sum >> 16);			\ +} + +/* + * Subtract two values in one's complement. + * + *	Result = Value1 - Value2 + */ +#define SKCS_OC_SUB(Result, Value1, Value2)	\ +	SKCS_OC_ADD((Result), (Value1), ~(Value2) & 0xffff) + +/* typedefs *******************************************************************/ + +/* + * SKCS_PROTO_STATS - The CSUM protocol statistics structure. + * + * There is one instance of this structure for each protocol supported. + */ +typedef struct s_CsProtocolStatistics { +	SK_U64 RxOkCts;		/* Receive checksum ok. */ +	SK_U64 RxUnableCts;	/* Unable to verify receive checksum. */ +	SK_U64 RxErrCts;	/* Receive checksum error. */ +	SK_U64 TxOkCts;		/* Transmit checksum ok. */ +	SK_U64 TxUnableCts;	/* Unable to calculate checksum in hw. */ +} SKCS_PROTO_STATS; + +/* + * s_Csum - The CSUM module context structure. + */ +typedef struct s_Csum { +	/* Enabled receive SK_PROTO_XXX bit flags. */ +	unsigned ReceiveFlags[SK_MAX_NETS]; +#ifdef TX_CSUM +	unsigned TransmitFlags[SK_MAX_NETS]; +#endif /* TX_CSUM */ + +	/* The protocol statistics structure; one per supported protocol. */ +	SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; +} SK_CSUM; + +/* + * SKCS_PACKET_INFO - The packet information structure. + */ +typedef struct s_CsPacketInfo { +	/* Bit field specifiying the desired/found protocols. */ +	unsigned ProtocolFlags; + +	/* Length of complete IP header, including any option fields. */ +	unsigned IpHeaderLength; + +	/* IP header checksum. */ +	unsigned IpHeaderChecksum; + +	/* TCP/UDP pseudo header checksum. */ +	unsigned PseudoHeaderChecksum; +} SKCS_PACKET_INFO; + +/* function prototypes ********************************************************/ + +#ifndef SkCsCalculateChecksum +extern unsigned SkCsCalculateChecksum( +	void		*pData, +	unsigned	Length); +#endif + +extern int SkCsEvent( +	SK_AC		*pAc, +	SK_IOC		Ioc, +	SK_U32		Event, +	SK_EVPARA	Param); + +extern SKCS_STATUS SkCsGetReceiveInfo( +	SK_AC		*pAc, +	void		*pIpHeader, +	unsigned	Checksum1, +	unsigned	Checksum2, +	int			NetNumber); + +extern void SkCsGetSendInfo( +	SK_AC				*pAc, +	void				*pIpHeader, +	SKCS_PACKET_INFO	*pPacketInfo, +	int					NetNumber); + +extern void SkCsSetReceiveFlags( +	SK_AC		*pAc, +	unsigned	ReceiveFlags, +	unsigned	*pChecksum1Offset, +	unsigned	*pChecksum2Offset, +	int			NetNumber); + +#endif	/* __INC_SKCSUM_H */ |