skcsum.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: skcsum.h
  4.  * Project: GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx)
  5.  * Version: $Revision: 1.9 $
  6.  * Date: $Date: 2001/02/06 11:21:39 $
  7.  * Purpose: Store/verify Internet checksum in send/receive packets.
  8.  *
  9.  ******************************************************************************/
  10. /******************************************************************************
  11.  *
  12.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  13.  *
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2 of the License, or
  17.  * (at your option) any later version.
  18.  *
  19.  * The information in this file is provided "AS IS" without warranty.
  20.  *
  21.  ******************************************************************************/
  22. /******************************************************************************
  23.  *
  24.  * History:
  25.  *
  26.  * $Log: skcsum.h,v $
  27.  * Revision 1.9  2001/02/06 11:21:39  rassmann
  28.  * Editorial changes.
  29.  *
  30.  * Revision 1.8  2001/02/06 11:15:36  rassmann
  31.  * Supporting two nets on dual-port adapters.
  32.  *
  33.  * Revision 1.7  2000/06/29 13:17:05  rassmann
  34.  * Corrected reception of a packet with UDP checksum == 0 (which means there
  35.  * is no UDP checksum).
  36.  *
  37.  * Revision 1.6  2000/02/28 12:33:44  cgoos
  38.  * Changed C++ style comments to C style.
  39.  *
  40.  * Revision 1.5  2000/02/21 12:10:05  cgoos
  41.  * Fixed license comment.
  42.  *
  43.  * Revision 1.4  2000/02/21 11:08:37  cgoos
  44.  * Merged changes back into common source.
  45.  *
  46.  * Revision 1.1  1999/07/26 14:47:49  mkarl
  47.  * changed from common source to windows specific source
  48.  * added return SKCS_STATUS_IP_CSUM_ERROR_UDP and
  49.  * SKCS_STATUS_IP_CSUM_ERROR_TCP to pass the NidsTester
  50.  * changes for Tx csum offload
  51.  *
  52.  * Revision 1.2  1998/09/04 12:16:34  mhaveman
  53.  * Checked in for Stephan to allow compilation.
  54.  * -Added definition SK_CSUM_EVENT_CLEAR_PROTO_STATS to clear statistic
  55.  * -Added prototype for SkCsEvent()
  56.  *
  57.  * Revision 1.1  1998/09/01 15:36:53  swolf
  58.  * initial revision
  59.  *
  60.  * 01-Sep-1998 sw Created.
  61.  *
  62.  ******************************************************************************/
  63. /******************************************************************************
  64.  *
  65.  * Description:
  66.  *
  67.  * Public header file for the "GEnesis" common module "CSUM".
  68.  *
  69.  * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon"
  70.  * and is the code name of this SysKonnect project.
  71.  *
  72.  * Compilation Options:
  73.  *
  74.  * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an
  75.  * empty module.
  76.  *
  77.  * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id
  78.  * definitions. In this case, all SKCS_PROTO_xxx definitions must be made
  79.  * external.
  80.  *
  81.  * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status
  82.  * definitions. In this case, all SKCS_STATUS_xxx definitions must be made
  83.  * external.
  84.  *
  85.  * Include File Hierarchy:
  86.  *
  87.  * "h/skcsum.h"
  88.  *  "h/sktypes.h"
  89.  *  "h/skqueue.h"
  90.  *
  91.  ******************************************************************************/
  92. #ifndef __INC_SKCSUM_H
  93. #define __INC_SKCSUM_H
  94. #include "h/sktypes.h"
  95. #include "h/skqueue.h"
  96. /* defines ********************************************************************/
  97. /*
  98.  * Define the default bit flags for 'SKCS_PACKET_INFO.ProtocolFlags'  if no user
  99.  * overwrite.
  100.  */
  101. #ifndef SKCS_OVERWRITE_PROTO /* User overwrite? */
  102. #define SKCS_PROTO_IP 0x1 /* IP (Internet Protocol version 4) */
  103. #define SKCS_PROTO_TCP 0x2 /* TCP (Transmission Control Protocol) */
  104. #define SKCS_PROTO_UDP 0x4 /* UDP (User Datagram Protocol) */
  105. /* Indices for protocol statistics. */
  106. #define SKCS_PROTO_STATS_IP 0
  107. #define SKCS_PROTO_STATS_UDP 1
  108. #define SKCS_PROTO_STATS_TCP 2
  109. #define SKCS_NUM_PROTOCOLS 3 /* Number of supported protocols. */
  110. #endif /* !SKCS_OVERWRITE_PROTO */
  111. /*
  112.  * Define the default SKCS_STATUS type and values if no user overwrite.
  113.  *
  114.  * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame.
  115.  * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error.
  116.  * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame.
  117.  * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame
  118.  * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok).
  119.  * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame).
  120.  * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok).
  121.  * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok).
  122.  * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok.
  123.  * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok.
  124.  * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. 
  125.  */
  126. #ifndef SKCS_OVERWRITE_STATUS /* User overwrite? */
  127. #define SKCS_STATUS int /* Define status type. */
  128. #define SKCS_STATUS_UNKNOWN_IP_VERSION 1
  129. #define SKCS_STATUS_IP_CSUM_ERROR 2
  130. #define SKCS_STATUS_IP_FRAGMENT 3
  131. #define SKCS_STATUS_IP_CSUM_OK 4
  132. #define SKCS_STATUS_TCP_CSUM_ERROR 5
  133. #define SKCS_STATUS_UDP_CSUM_ERROR 6
  134. #define SKCS_STATUS_TCP_CSUM_OK 7
  135. #define SKCS_STATUS_UDP_CSUM_OK 8
  136. /* needed for Microsoft */
  137. #define SKCS_STATUS_IP_CSUM_ERROR_UDP 9
  138. #define SKCS_STATUS_IP_CSUM_ERROR_TCP 10
  139. /* UDP checksum may be omitted */
  140. #define SKCS_STATUS_IP_CSUM_OK_NO_UDP 11
  141. #endif /* !SKCS_OVERWRITE_STATUS */
  142. /* Clear protocol statistics event. */
  143. #define SK_CSUM_EVENT_CLEAR_PROTO_STATS 1
  144. /*
  145.  * Add two values in one's complement.
  146.  *
  147.  * Note: One of the two input values may be "longer" than 16-bit, but then the
  148.  * resulting sum may be 17 bits long. In this case, add zero to the result using
  149.  * SKCS_OC_ADD() again.
  150.  *
  151.  * Result = Value1 + Value2
  152.  */
  153. #define SKCS_OC_ADD(Result, Value1, Value2) {
  154. unsigned long Sum;
  155. Sum = (unsigned long) (Value1) + (unsigned long) (Value2);
  156. /* Add-in any carry. */
  157. (Result) = (Sum & 0xffff) + (Sum >> 16);
  158. }
  159. /*
  160.  * Subtract two values in one's complement.
  161.  *
  162.  * Result = Value1 - Value2
  163.  */
  164. #define SKCS_OC_SUB(Result, Value1, Value2)
  165. SKCS_OC_ADD((Result), (Value1), ~(Value2) & 0xffff)
  166. /* typedefs *******************************************************************/
  167. /*
  168.  * SKCS_PROTO_STATS - The CSUM protocol statistics structure.
  169.  *
  170.  * There is one instance of this structure for each protocol supported.
  171.  */
  172. typedef struct s_CsProtocolStatistics {
  173. SK_U64 RxOkCts; /* Receive checksum ok. */
  174. SK_U64 RxUnableCts; /* Unable to verify receive checksum. */
  175. SK_U64 RxErrCts; /* Receive checksum error. */
  176. SK_U64 TxOkCts; /* Transmit checksum ok. */
  177. SK_U64 TxUnableCts; /* Unable to calculate checksum in hw. */
  178. } SKCS_PROTO_STATS;
  179. /*
  180.  * s_Csum - The CSUM module context structure.
  181.  */
  182. typedef struct s_Csum {
  183. /* Enabled receive SK_PROTO_XXX bit flags. */
  184. unsigned ReceiveFlags[SK_MAX_NETS];
  185. #ifdef TX_CSUM
  186. unsigned TransmitFlags[SK_MAX_NETS];
  187. #endif /* TX_CSUM */
  188. /* The protocol statistics structure; one per supported protocol. */
  189. SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS];
  190. } SK_CSUM;
  191. /*
  192.  * SKCS_PACKET_INFO - The packet information structure.
  193.  */
  194. typedef struct s_CsPacketInfo {
  195. /* Bit field specifiying the desired/found protocols. */
  196. unsigned ProtocolFlags;
  197. /* Length of complete IP header, including any option fields. */
  198. unsigned IpHeaderLength;
  199. /* IP header checksum. */
  200. unsigned IpHeaderChecksum;
  201. /* TCP/UDP pseudo header checksum. */
  202. unsigned PseudoHeaderChecksum;
  203. } SKCS_PACKET_INFO;
  204. /* function prototypes ********************************************************/
  205. #ifndef SkCsCalculateChecksum
  206. extern unsigned SkCsCalculateChecksum(
  207. void *pData,
  208. unsigned Length);
  209. #endif
  210. extern int SkCsEvent(
  211. SK_AC *pAc,
  212. SK_IOC Ioc,
  213. SK_U32 Event,
  214. SK_EVPARA Param);
  215. extern SKCS_STATUS SkCsGetReceiveInfo(
  216. SK_AC *pAc,
  217. void *pIpHeader,
  218. unsigned Checksum1,
  219. unsigned Checksum2,
  220. int NetNumber);
  221. extern void SkCsGetSendInfo(
  222. SK_AC *pAc,
  223. void *pIpHeader,
  224. SKCS_PACKET_INFO *pPacketInfo,
  225. int NetNumber);
  226. extern void SkCsSetReceiveFlags(
  227. SK_AC *pAc,
  228. unsigned ReceiveFlags,
  229. unsigned *pChecksum1Offset,
  230. unsigned *pChecksum2Offset,
  231. int NetNumber);
  232. #endif /* __INC_SKCSUM_H */