|  | /****************************************************************************** | 
|  | * | 
|  | * 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 */ |