⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skaddr.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************** * * Name:	skaddr.c * Project:	GEnesis, PCI Gigabit Ethernet Adapter * Version:	$Revision: 1.40 $ * Date:	$Date: 2001/02/14 14:04:59 $ * Purpose:	Manage Addresses (Multicast and Unicast) and Promiscuous Mode. * ******************************************************************************//****************************************************************************** * *	(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: skaddr.c,v $ *	Revision 1.40  2001/02/14 14:04:59  rassmann *	Editorial changes. *	 *	Revision 1.39  2001/01/30 10:30:04  rassmann *	Editorial changes. *	 *	Revision 1.38  2001/01/25 16:26:52  rassmann *	Ensured that logical address overrides are done on net's active port. *	 *	Revision 1.37  2001/01/22 13:41:34  rassmann *	Supporting two nets on dual-port adapters. *	 *	Revision 1.36  2000/08/07 11:10:39  rassmann *	Editorial changes. *	 *	Revision 1.35  2000/05/04 09:38:41  rassmann *	Editorial changes. *	Corrected multicast address hashing. *	 *	Revision 1.34  1999/11/22 13:23:44  cgoos *	Changed license header to GPL. *	 *	Revision 1.33  1999/05/28 10:56:06  rassmann *	Editorial changes. *	 *	Revision 1.32  1999/03/31 10:59:20  rassmann *	Returning Success instead of DupAddr if address shall be overridden *	with same value. *	 *	Revision 1.31  1999/01/14 16:18:17  rassmann *	Corrected multicast initialization. *	 *	Revision 1.30  1999/01/04 10:30:35  rassmann *	SkAddrOverride only possible after SK_INIT_IO phase. *	 *	Revision 1.29  1998/12/29 13:13:10  rassmann *	An address override is now preserved in the SK_INIT_IO phase. *	All functions return an int now. *	Extended parameter checking. *	 *	Revision 1.28  1998/12/01 11:45:53  rassmann *	Code cleanup. *	 *	Revision 1.27  1998/12/01 09:22:49  rassmann *	SkAddrMcAdd and SkAddrMcUpdate returned SK_MC_FILTERING_INEXACT *	too often. *	 *	Revision 1.26  1998/11/24 12:39:44  rassmann *	Reserved multicast entry for BPDU address. *	13 multicast entries left for protocol. *	 *	Revision 1.25  1998/11/17 16:54:23  rassmann *	Using exact match for up to 14 multicast addresses. *	Still receiving all multicasts if more addresses are added. *	 *	Revision 1.24  1998/11/13 17:24:31  rassmann *	Changed return value of SkAddrOverride to int. *	 *	Revision 1.23  1998/11/13 16:56:18  rassmann *	Added macro SK_ADDR_COMPARE. *	Changed return type of SkAddrOverride to SK_BOOL. *	 *	Revision 1.22  1998/11/04 17:06:17  rassmann *	Corrected McUpdate and PromiscuousChange functions. *	 *	Revision 1.21  1998/10/29 14:34:04  rassmann *	Clearing SK_ADDR struct at startup. *	 *	Revision 1.20  1998/10/28 18:16:34  rassmann *	Avoiding I/Os before SK_INIT_RUN level. *	Aligning InexactFilter. *	 *	Revision 1.19  1998/10/28 11:29:28  rassmann *	Programming physical address in SkAddrMcUpdate. *	Corrected programming of exact match entries. *	 *	Revision 1.18  1998/10/28 10:34:48  rassmann *	Corrected reading of physical addresses. *	 *	Revision 1.17  1998/10/28 10:26:13  rassmann *	Getting ports' current MAC addresses from EPROM now. *	Added debug output. *	 *	Revision 1.16  1998/10/27 16:20:12  rassmann *	Reading MAC address byte by byte. *	 *	Revision 1.15  1998/10/22 11:39:09  rassmann *	Corrected signed/unsigned mismatches. *	 *	Revision 1.14  1998/10/19 17:12:35  rassmann *	Syntax corrections. *	 *	Revision 1.13  1998/10/19 17:02:19  rassmann *	Now reading permanent MAC addresses from CRF. *	 *	Revision 1.12  1998/10/15 15:15:48  rassmann *	Changed Flags Parameters from SK_U8 to int. *	Checked with lint. *	 *	Revision 1.11  1998/09/24 19:15:12  rassmann *	Code cleanup. *	 *	Revision 1.10  1998/09/18 20:18:54  rassmann *	Added HW access. *	Implemented swapping. *	 *	Revision 1.9  1998/09/16 11:32:00  rassmann *	Including skdrv1st.h again. :( *	 *	Revision 1.8  1998/09/16 11:09:34  rassmann *	Syntax corrections. *	 *	Revision 1.7  1998/09/14 17:06:34  rassmann *	Minor changes. *	 *	Revision 1.6  1998/09/07 08:45:41  rassmann *	Syntax corrections. *	 *	Revision 1.5  1998/09/04 19:40:19  rassmann *	Interface enhancements. *	 *	Revision 1.4  1998/09/04 12:14:12  rassmann *	Interface cleanup. *	 *	Revision 1.3  1998/09/02 16:56:40  rassmann *	Updated interface. *	 *	Revision 1.2  1998/08/27 14:26:09  rassmann *	Updated interface. *	 *	Revision 1.1  1998/08/21 08:30:22  rassmann *	First public version. * ******************************************************************************//****************************************************************************** * * Description: * * This module is intended to manage multicast addresses, address override, * and promiscuous mode on GEnesis adapters. * * Address Layout: *	port address:		physical MAC address *	1st exact match:	logical MAC address *	2nd exact match:	RLMT multicast *	exact match 3-13:	OS-specific multicasts * * Include File Hierarchy: * *	"skdrv1st.h" *	"skdrv2nd.h" * ******************************************************************************/#ifndef	lintstatic const char SysKonnectFileId[] =	"@(#) $Id: skaddr.c,v 1.40 2001/02/14 14:04:59 rassmann Exp $ (C) SysKonnect.";#endif	/* !defined(lint) */#define __SKADDR_C#ifdef __cplusplus#error C++ is not yet supported.extern "C" {#endif	/* cplusplus */#include "h/skdrv1st.h"#include "h/skdrv2nd.h"/* defines ********************************************************************/#define CRC32_POLY	0xEDB88320UL	/* CRC32-Poly - XMAC: Little Endian */#define HASH_BITS	6				/* #bits in hash */#define	SK_MC_BIT	0x01/* Error numbers and messages. */#define SKERR_ADDR_E001		(SK_ERRBASE_ADDR + 0)#define SKERR_ADDR_E001MSG	"Bad Flags."#define SKERR_ADDR_E002		(SKERR_ADDR_E001 + 1)#define SKERR_ADDR_E002MSG	"New Error."/* typedefs *******************************************************************//* None. *//* global variables ***********************************************************//* 64-bit hash values with all bits set. */SK_U16	OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};/* local variables ************************************************************/#ifdef DEBUGstatic int	Next0[SK_MAX_MACS] = {0, 0};#endif	/* DEBUG *//* functions ******************************************************************//****************************************************************************** * *	SkAddrInit - initialize data, set state to init * * Description: * *	SK_INIT_DATA *	============ * *	This routine clears the multicast tables and resets promiscuous mode. *	Some entries are reserved for the "logical MAC address", the *	SK-RLMT multicast address, and the BPDU multicast address. * * *	SK_INIT_IO *	========== * *	All permanent MAC addresses are read from EPROM. *	If the current MAC addresses are not already set in software, *	they are set to the values of the permanent addresses. *	The current addresses are written to the corresponding XMAC. * * *	SK_INIT_RUN *	=========== * *	Nothing. * * Context: *	init, pageable * * Returns: *	SK_ADDR_SUCCESS */int	SkAddrInit(SK_AC	*pAC,	/* the adapter context */SK_IOC	IoC,	/* I/O context */int		Level)	/* initialization level */{	int				j;	SK_U32			i;	SK_U8			*InAddr;	SK_U16			*OutAddr;	SK_ADDR_PORT	*pAPort;	switch (Level) {	case SK_INIT_DATA:		SK_MEMSET((char *)&pAC->Addr, 0, sizeof(SK_ADDR));		for (i = 0; i < SK_MAX_MACS; i++) {			pAPort = &pAC->Addr.Port[i];			pAPort->PromMode = SK_PROM_MODE_NONE;			pAPort->FirstExactMatchRlmt	= SK_ADDR_FIRST_MATCH_RLMT;			pAPort->FirstExactMatchDrv	= SK_ADDR_FIRST_MATCH_DRV;			pAPort->NextExactMatchRlmt	= SK_ADDR_FIRST_MATCH_RLMT;			pAPort->NextExactMatchDrv	= SK_ADDR_FIRST_MATCH_DRV;#if 0			/* Don't do this here ... */			/* Reset Promiscuous mode. */			(void)SkAddrPromiscuousChange(				pAC,				IoC,				i,				SK_PROM_MODE_NONE);#endif	/* 0 */		}		#ifdef DEBUG		for (i = 0; i < SK_MAX_MACS; i++) {			if (pAC->Addr.Port[i].NextExactMatchRlmt <				SK_ADDR_FIRST_MATCH_RLMT) {				Next0[i] |= 4;			}		}#endif	/* DEBUG */		/* pAC->Addr.InitDone = SK_INIT_DATA; */		break;	case SK_INIT_IO:		for (i = 0; i < SK_MAX_NETS; i++) {			pAC->Addr.Net[i].ActivePort = pAC->Rlmt.Net[i].ActivePort;		}		#ifdef DEBUG		for (i = 0; i < SK_MAX_MACS; i++) {			if (pAC->Addr.Port[i].NextExactMatchRlmt <				SK_ADDR_FIRST_MATCH_RLMT) {				Next0[i] |= 8;			}		}#endif	/* DEBUG */		/* Read permanent logical MAC address from Control Register File. */		for (j = 0; j < SK_MAC_ADDR_LEN; j++) {			InAddr = (SK_U8 *)&pAC->Addr.Net[0].PermanentMacAddress.a[j];			SK_IN8(IoC, B2_MAC_1 + j, InAddr);		}		if (!pAC->Addr.Net[0].CurrentMacAddressSet) {			/* Set the current logical MAC address to the permanent one. */			pAC->Addr.Net[0].CurrentMacAddress =				pAC->Addr.Net[0].PermanentMacAddress;			pAC->Addr.Net[0].CurrentMacAddressSet = SK_TRUE;		}		/* Set the current logical MAC address. */		pAC->Addr.Port[pAC->Addr.Net[0].ActivePort].Exact[0] =			pAC->Addr.Net[0].CurrentMacAddress;#if SK_MAX_NETS > 1		/* Set logical MAC address for net 2 to (log | 3). */		if (!pAC->Addr.Net[1].CurrentMacAddressSet) {			pAC->Addr.Net[1].PermanentMacAddress =				pAC->Addr.Net[0].PermanentMacAddress;			pAC->Addr.Net[1].PermanentMacAddress.a[5] |= 3;			/* Set the current logical MAC address to the permanent one. */			pAC->Addr.Net[1].CurrentMacAddress =				pAC->Addr.Net[1].PermanentMacAddress;			pAC->Addr.Net[1].CurrentMacAddressSet = SK_TRUE;		}#endif	/* SK_MAX_NETS > 1 */#ifdef xDEBUG		SK_DBG_MSG(			pAC,			SK_DBGMOD_ADDR,			SK_DBGCAT_INIT,			("Permanent MAC Address: %02X %02X %02X %02X %02X %02X\n",				pAC->Addr.PermanentMacAddress.a[0],				pAC->Addr.PermanentMacAddress.a[1],				pAC->Addr.PermanentMacAddress.a[2],				pAC->Addr.PermanentMacAddress.a[3],				pAC->Addr.PermanentMacAddress.a[4],				pAC->Addr.PermanentMacAddress.a[5]))		SK_DBG_MSG(			pAC,			SK_DBGMOD_ADDR,			SK_DBGCAT_INIT,			("Logical MAC Address: %02X %02X %02X %02X %02X %02X\n",				pAC->Addr.CurrentMacAddress.a[0],				pAC->Addr.CurrentMacAddress.a[1],				pAC->Addr.CurrentMacAddress.a[2],				pAC->Addr.CurrentMacAddress.a[3],				pAC->Addr.CurrentMacAddress.a[4],				pAC->Addr.CurrentMacAddress.a[5]))#endif	/* DEBUG */#if 0		/* Don't do this here ... */		(void)SkAddrMcUpdate(pAC, IoC, pAC->Addr.ActivePort);#endif	/* 0 */		for (i = 0; i < (SK_U32)pAC->GIni.GIMacsFound; i++) {			pAPort = &pAC->Addr.Port[i];			/* Read permanent port addresses from Control Register File. */			for (j = 0; j < SK_MAC_ADDR_LEN; j++) {				InAddr = (SK_U8 *)&pAPort->PermanentMacAddress.a[j];				SK_IN8(IoC, B2_MAC_2 + 8 * i + j, InAddr);			}			if (!pAPort->CurrentMacAddressSet) {				/*				 * Set the current and previous physical MAC address				 * of this port to its permanent MAC address.				 */				pAPort->CurrentMacAddress = pAPort->PermanentMacAddress;				pAPort->PreviousMacAddress = pAPort->PermanentMacAddress;				pAPort->CurrentMacAddressSet = SK_TRUE;			}			/* Set port's current MAC addresses. */			OutAddr = (SK_U16 *)&pAPort->CurrentMacAddress.a[0];			XM_OUTADDR(IoC, i, XM_SA, OutAddr);#ifdef xDEBUG			SK_DBG_MSG(				pAC,				SK_DBGMOD_ADDR,				SK_DBGCAT_INIT,				("Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",					pAPort->PermanentMacAddress.a[0],					pAPort->PermanentMacAddress.a[1],					pAPort->PermanentMacAddress.a[2],					pAPort->PermanentMacAddress.a[3],					pAPort->PermanentMacAddress.a[4],					pAPort->PermanentMacAddress.a[5]))			SK_DBG_MSG(

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -