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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: skaddr.h
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.24 $
  6.  * Date: $Date: 2001/01/22 13:41:34 $
  7.  * Purpose: Header file for Address Management (MC, UC, Prom).
  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: skaddr.h,v $
  27.  * Revision 1.24  2001/01/22 13:41:34  rassmann
  28.  * Supporting two nets on dual-port adapters.
  29.  *
  30.  * Revision 1.23  2000/08/10 11:27:50  rassmann
  31.  * Editorial changes.
  32.  * Preserving 32-bit alignment in structs for the adapter context.
  33.  *
  34.  * Revision 1.22  2000/08/07 11:10:40  rassmann
  35.  * Editorial changes.
  36.  *
  37.  * Revision 1.21  2000/05/04 09:39:59  rassmann
  38.  * Editorial changes.
  39.  * Corrected multicast address hashing.
  40.  *
  41.  * Revision 1.20  1999/11/22 13:46:14  cgoos
  42.  * Changed license header to GPL.
  43.  * Allowing overwrite for SK_ADDR_EQUAL.
  44.  *
  45.  * Revision 1.19  1999/05/28 10:56:07  rassmann
  46.  * Editorial changes.
  47.  *
  48.  * Revision 1.18  1999/04/06 17:22:04  rassmann
  49.  * Added private "ActivePort".
  50.  *
  51.  * Revision 1.17  1999/01/14 16:18:19  rassmann
  52.  * Corrected multicast initialization.
  53.  *
  54.  * Revision 1.16  1999/01/04 10:30:36  rassmann
  55.  * SkAddrOverride only possible after SK_INIT_IO phase.
  56.  *
  57.  * Revision 1.15  1998/12/29 13:13:11  rassmann
  58.  * An address override is now preserved in the SK_INIT_IO phase.
  59.  * All functions return an int now.
  60.  * Extended parameter checking.
  61.  *
  62.  * Revision 1.14  1998/11/24 12:39:45  rassmann
  63.  * Reserved multicast entry for BPDU address.
  64.  * 13 multicast entries left for protocol.
  65.  *
  66.  * Revision 1.13  1998/11/13 17:24:32  rassmann
  67.  * Changed return value of SkAddrOverride to int.
  68.  *
  69.  * Revision 1.12  1998/11/13 16:56:19  rassmann
  70.  * Added macro SK_ADDR_COMPARE.
  71.  * Changed return type of SkAddrOverride to SK_BOOL.
  72.  *
  73.  * Revision 1.11  1998/10/28 18:16:35  rassmann
  74.  * Avoiding I/Os before SK_INIT_RUN level.
  75.  * Aligning InexactFilter.
  76.  *
  77.  * Revision 1.10  1998/10/22 11:39:10  rassmann
  78.  * Corrected signed/unsigned mismatches.
  79.  *
  80.  * Revision 1.9  1998/10/15 15:15:49  rassmann
  81.  * Changed Flags Parameters from SK_U8 to int.
  82.  * Checked with lint.
  83.  *
  84.  * Revision 1.8  1998/09/24 19:15:12  rassmann
  85.  * Code cleanup.
  86.  *
  87.  * Revision 1.7  1998/09/18 20:22:13  rassmann
  88.  * Added HW access.
  89.  *
  90.  * Revision 1.6  1998/09/04 19:40:20  rassmann
  91.  * Interface enhancements.
  92.  *
  93.  * Revision 1.5  1998/09/04 12:40:57  rassmann
  94.  * Interface cleanup.
  95.  *
  96.  * Revision 1.4  1998/09/04 12:14:13  rassmann
  97.  * Interface cleanup.
  98.  *
  99.  * Revision 1.3  1998/09/02 16:56:40  rassmann
  100.  * Updated interface.
  101.  *
  102.  * Revision 1.2  1998/08/27 14:26:09  rassmann
  103.  * Updated interface.
  104.  *
  105.  * Revision 1.1  1998/08/21 08:31:08  rassmann
  106.  * First public version.
  107.  *
  108.  ******************************************************************************/
  109. /******************************************************************************
  110.  *
  111.  * Description:
  112.  *
  113.  * This module is intended to manage multicast addresses and promiscuous mode
  114.  * on GEnesis adapters.
  115.  *
  116.  * Include File Hierarchy:
  117.  *
  118.  * "skdrv1st.h"
  119.  * ...
  120.  * "sktypes.h"
  121.  * "skqueue.h"
  122.  * "skaddr.h"
  123.  * ...
  124.  * "skdrv2nd.h"
  125.  *
  126.  ******************************************************************************/
  127. #ifndef __INC_SKADDR_H
  128. #define __INC_SKADDR_H
  129. #ifdef __cplusplus
  130. #error C++ is not yet supported.
  131. extern "C" {
  132. #endif /* cplusplus */
  133. /* defines ********************************************************************/
  134. #define SK_MAC_ADDR_LEN 6 /* Length of MAC address. */
  135. #define SK_MAX_ADDRS 14 /* #Addrs for exact match. */
  136. /* ----- Common return values ----- */
  137. #define SK_ADDR_SUCCESS 0 /* Function returned successfully. */
  138. #define SK_ADDR_ILLEGAL_PORT 100 /* Port number too high. */
  139. #define SK_ADDR_TOO_EARLY 101 /* Function called too early. */
  140. /* ----- Clear/Add flag bits ----- */
  141. #define SK_ADDR_PERMANENT 1 /* RLMT Address */
  142. /* ----- Additional Clear flag bits ----- */
  143. #define SK_MC_SW_ONLY 2 /* Do not update HW when clearing. */
  144. /* ----- Override flag bits ----- */
  145. #define SK_ADDR_LOGICAL_ADDRESS 0
  146. #define SK_ADDR_VIRTUAL_ADDRESS (SK_ADDR_LOGICAL_ADDRESS) /* old */
  147. #define SK_ADDR_PHYSICAL_ADDRESS 1
  148. #define SK_ADDR_CLEAR_LOGICAL 2
  149. #define SK_ADDR_SET_LOGICAL 4
  150. /* ----- Override return values ----- */
  151. #define SK_ADDR_OVERRIDE_SUCCESS (SK_ADDR_SUCCESS)
  152. #define SK_ADDR_DUPLICATE_ADDRESS 1
  153. #define SK_ADDR_MULTICAST_ADDRESS 2
  154. /* ----- Partitioning of excact match table ----- */
  155. #define SK_ADDR_EXACT_MATCHES 16 /* #Exact match entries. */
  156. #define SK_ADDR_FIRST_MATCH_RLMT 1
  157. #define SK_ADDR_LAST_MATCH_RLMT 2
  158. #define SK_ADDR_FIRST_MATCH_DRV 3
  159. #define SK_ADDR_LAST_MATCH_DRV (SK_ADDR_EXACT_MATCHES - 1)
  160. /* ----- SkAddrMcAdd/SkAddrMcUpdate return values ----- */
  161. #define SK_MC_FILTERING_EXACT 0 /* Exact filtering. */
  162. #define SK_MC_FILTERING_INEXACT 1 /* Inexact filtering. */
  163. /* ----- Additional SkAddrMcAdd return values ----- */
  164. #define SK_MC_ILLEGAL_ADDRESS 2 /* Illegal address. */
  165. #define SK_MC_ILLEGAL_PORT 3 /* Illegal port (not the active one). */
  166. #define SK_MC_RLMT_OVERFLOW 4 /* Too many RLMT mc addresses. */
  167. /* Promiscuous mode bits ----- */
  168. #define SK_PROM_MODE_NONE 0 /* Normal receive. */
  169. #define SK_PROM_MODE_LLC 1 /* Receive all LLC frames. */
  170. #define SK_PROM_MODE_ALL_MC 2 /* Receive all multicast frames. */
  171. /* #define SK_PROM_MODE_NON_LLC 4 */ /* Receive all non-LLC frames. */
  172. /* Macros */
  173. #ifndef SK_ADDR_EQUAL
  174. /*
  175.  * "&" instead of "&&" allows better optimization on IA-64.
  176.  * The replacement is safe here, as all bytes exist.
  177.  */
  178. #ifndef SK_ADDR_DWORD_COMPARE
  179. #define SK_ADDR_EQUAL(A1,A2) ( 
  180. (((SK_U8 *)(A1))[5] == ((SK_U8 *)(A2))[5]) & 
  181. (((SK_U8 *)(A1))[4] == ((SK_U8 *)(A2))[4]) & 
  182. (((SK_U8 *)(A1))[3] == ((SK_U8 *)(A2))[3]) & 
  183. (((SK_U8 *)(A1))[2] == ((SK_U8 *)(A2))[2]) & 
  184. (((SK_U8 *)(A1))[1] == ((SK_U8 *)(A2))[1]) & 
  185. (((SK_U8 *)(A1))[0] == ((SK_U8 *)(A2))[0]))
  186. #else /* SK_ADDR_DWORD_COMPARE */
  187. #define SK_ADDR_EQUAL(A1,A2) ( 
  188. (*(SK_U32 *)&(((SK_U8 *)(A1))[2]) == *(SK_U32 *)&(((SK_U8 *)(A2))[2])) & 
  189. (*(SK_U32 *)&(((SK_U8 *)(A1))[0]) == *(SK_U32 *)&(((SK_U8 *)(A2))[0])))
  190. #endif /* SK_ADDR_DWORD_COMPARE */
  191. #endif /* SK_ADDR_EQUAL */
  192. /* typedefs *******************************************************************/
  193. typedef struct s_MacAddr {
  194. SK_U8 a[SK_MAC_ADDR_LEN];
  195. } SK_MAC_ADDR;
  196. /* SK_FILTER is used to ensure alignment of the filter. */
  197. typedef union s_InexactFilter {
  198. SK_U8 Bytes[8];
  199. SK_U64 Val; /* Dummy entry for alignment only. */
  200. } SK_FILTER64;
  201. typedef struct s_AddrNet SK_ADDR_NET;
  202. typedef struct s_AddrPort {
  203. /* ----- Public part (read-only) ----- */
  204. SK_MAC_ADDR CurrentMacAddress; /* Current physical MAC Address. */
  205. SK_MAC_ADDR PermanentMacAddress; /* Permanent physical MAC Address. */
  206. int PromMode; /* Promiscuous Mode. */
  207. /* ----- Private part ----- */
  208. SK_MAC_ADDR PreviousMacAddress; /* Prev. phys. MAC Address. */
  209. SK_BOOL CurrentMacAddressSet; /* CurrentMacAddress is set. */
  210. SK_U8 Align01;
  211. SK_U32 FirstExactMatchRlmt;
  212. SK_U32 NextExactMatchRlmt;
  213. SK_U32 FirstExactMatchDrv;
  214. SK_U32 NextExactMatchDrv;
  215. SK_MAC_ADDR Exact[SK_ADDR_EXACT_MATCHES];
  216. SK_FILTER64 InexactFilter; /* For 64-bit hash register. */
  217. } SK_ADDR_PORT;
  218. struct s_AddrNet {
  219. /* ----- Public part (read-only) ----- */
  220. SK_MAC_ADDR CurrentMacAddress; /* Logical MAC Address. */
  221. SK_MAC_ADDR PermanentMacAddress; /* Logical MAC Address. */
  222. /* ----- Private part ----- */
  223. SK_U32 ActivePort; /* View of module ADDR. */
  224. SK_BOOL CurrentMacAddressSet; /* CurrentMacAddress is set. */
  225. SK_U8 Align01;
  226. SK_U16 Align02;
  227. };
  228. typedef struct s_Addr {
  229. /* ----- Public part (read-only) ----- */
  230. SK_ADDR_NET Net[SK_MAX_NETS];
  231. SK_ADDR_PORT Port[SK_MAX_MACS];
  232. /* ----- Private part ----- */
  233. } SK_ADDR;
  234. /* function prototypes ********************************************************/
  235. #ifndef SK_KR_PROTO
  236. /* Functions provided by SkAddr */
  237. /* ANSI/C++ compliant function prototypes */
  238. extern int SkAddrInit(
  239. SK_AC *pAC,
  240. SK_IOC IoC,
  241. int Level);
  242. extern int SkAddrMcClear(
  243. SK_AC *pAC,
  244. SK_IOC IoC,
  245. SK_U32 PortNumber,
  246. int Flags);
  247. extern int SkAddrMcAdd(
  248. SK_AC *pAC,
  249. SK_IOC IoC,
  250. SK_U32 PortNumber,
  251. SK_MAC_ADDR *pMc,
  252. int Flags);
  253. extern int SkAddrMcUpdate(
  254. SK_AC *pAC,
  255. SK_IOC IoC,
  256. SK_U32 PortNumber);
  257. extern int SkAddrOverride(
  258. SK_AC *pAC,
  259. SK_IOC IoC,
  260. SK_U32 PortNumber,
  261. SK_MAC_ADDR *pNewAddr,
  262. int Flags);
  263. extern int SkAddrPromiscuousChange(
  264. SK_AC *pAC,
  265. SK_IOC IoC,
  266. SK_U32 PortNumber,
  267. int NewPromMode);
  268. extern int SkAddrSwap(
  269. SK_AC *pAC,
  270. SK_IOC IoC,
  271. SK_U32 FromPortNumber,
  272. SK_U32 ToPortNumber);
  273. #else /* defined(SK_KR_PROTO)) */
  274. /* Non-ANSI/C++ compliant function prototypes */
  275. #error KR-style prototypes are not yet provided.
  276. #endif /* defined(SK_KR_PROTO)) */
  277. #ifdef __cplusplus
  278. }
  279. #endif /* __cplusplus */
  280. #endif /* __INC_SKADDR_H */