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

📄 skrlmt.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************** * * Name:	skrlmt.c * Project:	GEnesis, PCI Gigabit Ethernet Adapter * Version:	$Revision: 1.49 $ * Date:	$Date: 1999/11/22 13:38:02 $ * Purpose:	Manage links on SK-NET Adapters, esp. redundant ones. * ******************************************************************************//****************************************************************************** * *	(C)Copyright 1998,1999 SysKonnect, *	a business unit of Schneider & Koch & Co. Datensysteme 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: skrlmt.c,v $ *	Revision 1.49  1999/11/22 13:38:02  cgoos *	Changed license header to GPL. *	Added initialization to some variables to avoid compiler warnings. *	 *	Revision 1.48  1999/10/04 14:01:17  rassmann *	Corrected reaction to reception of BPDU frames. *	Added parameter descriptions to "For Readme" section skrlmt.txt. *	Clarified usage of lookahead result *pForRlmt. *	Requested driver to present RLMT packets as soon as poosible. *	 *	Revision 1.47  1999/07/20 12:53:36  rassmann *	Fixed documentation errors for lookahead macros. *	 *	Revision 1.46  1999/05/28 13:29:16  rassmann *	Replaced C++-style comment. *	 *	Revision 1.45  1999/05/28 13:28:08  rassmann *	Corrected syntax error (xxx). *	 *	Revision 1.44  1999/05/28 11:15:54  rassmann *	Changed behaviour to reflect Design Spec v1.2. *	Controlling Link LED(s). *	Introduced RLMT Packet Version field in RLMT Packet. *	Newstyle lookahead macros (checking meta-information before looking at *	  the packet). *	 *	Revision 1.43  1999/01/28 13:12:43  rassmann *	Corrected Lookahead (bug introduced in previous Rev.). *	 *	Revision 1.42  1999/01/28 12:50:41  rassmann *	Not using broadcast time stamps in CheckLinkState mode. *	 *	Revision 1.41  1999/01/27 14:13:02  rassmann *	Monitoring broadcast traffic. *	Switching more reliably and not too early if switch is *	 configured for spanning tree. *	 *	Revision 1.40  1999/01/22 13:17:30  rassmann *	Informing PNMI of NET_UP. *	Clearing RLMT multicast addresses before first setting them. *	Reporting segmentation earlier, setting a "quiet time" *	 after a report. *	 *	Revision 1.39  1998/12/10 15:29:53  rassmann *	Corrected SuspectStatus in SkRlmtBuildCheckChain(). *	Corrected CHECK_SEG mode. *	 *	Revision 1.38  1998/12/08 13:11:23  rassmann *	Stopping SegTimer at RlmtStop. *	 *	Revision 1.37  1998/12/07 16:51:42  rassmann *	Corrected comments. *	 *	Revision 1.36  1998/12/04 10:58:56  rassmann *	Setting next pointer to NULL when receiving. *	 *	Revision 1.35  1998/12/03 16:12:42  rassmann *	Ignoring/correcting illegal PrefPort values. *	 *	Revision 1.34  1998/12/01 11:45:35  rassmann *	Code cleanup. *	 *	Revision 1.33  1998/12/01 10:29:32  rassmann *	Starting standby ports before getting the net up. *	Checking if a port is started when the link comes up. *	 *	Revision 1.32  1998/11/30 16:19:50  rassmann *	New default for PortNoRx. *	 *	Revision 1.31  1998/11/27 19:17:13  rassmann *	Corrected handling of LINK_DOWN coming shortly after LINK_UP. *	 *	Revision 1.30  1998/11/24 12:37:31  rassmann *	Implemented segmentation check. *	 *	Revision 1.29  1998/11/18 13:04:32  rassmann *	Secured PortUpTimer event. *	Waiting longer before starting standby port(s). *	 *	Revision 1.28  1998/11/17 13:43:04  rassmann *	Handling (logical) tx failure. *	Sending packet on logical address after PORT_SWITCH. *	 *	Revision 1.27  1998/11/13 17:09:50  rassmann *	Secured some events against being called in wrong state. *	 *	Revision 1.26  1998/11/13 16:56:54  rassmann *	Added macro version of SkRlmtLookaheadPacket. *	 *	Revision 1.25  1998/11/06 18:06:04  rassmann *	Corrected timing when RLMT checks fail. *	Clearing tx counter earlier in periodical checks. *	 *	Revision 1.24  1998/11/05 10:37:27  rassmann *	Checking destination address in Lookahead. *	 *	Revision 1.23  1998/11/03 13:53:49  rassmann *	RLMT should switch now (at least in mode 3). *	 *	Revision 1.22  1998/10/29 14:34:49  rassmann *	Clearing SK_RLMT struct at startup. *	Initializing PortsUp during SK_RLMT_START. *	 *	Revision 1.21  1998/10/28 11:30:17  rassmann *	Default mode is now SK_RLMT_CHECK_LOC_LINK. *	 *	Revision 1.20  1998/10/26 16:02:03  rassmann *	Ignoring LINK_DOWN for links that are down. *	 *	Revision 1.19  1998/10/22 15:54:01  rassmann *	Corrected EtherLen. *	Starting Link Check when second port comes up. *	 *	Revision 1.18  1998/10/22 11:39:50  rassmann *	Corrected signed/unsigned mismatches. *	Corrected receive list handling and address recognition. *	 *	Revision 1.17  1998/10/19 17:01:20  rassmann *	More detailed checking of received packets. *	 *	Revision 1.16  1998/10/15 15:16:34  rassmann *	Finished Spanning Tree checking. *	Checked with lint. *	 *	Revision 1.15  1998/09/24 19:16:07  rassmann *	Code cleanup. *	Introduced Timer for PORT_DOWN due to no RX. *	 *	Revision 1.14  1998/09/18 20:27:14  rassmann *	Added address override. *	 *	Revision 1.13  1998/09/16 11:31:48  rassmann *	Including skdrv1st.h again. :( *	 *	Revision 1.12  1998/09/16 11:09:50  rassmann *	Syntax corrections. *	 *	Revision 1.11  1998/09/15 12:32:03  rassmann *	Syntax correction. *	 *	Revision 1.10  1998/09/15 11:28:49  rassmann *	Syntax corrections. *	 *	Revision 1.9  1998/09/14 17:07:37  rassmann *	Added code for port checking via LAN. *	Changed Mbuf definition. *	 *	Revision 1.8  1998/09/07 11:14:14  rassmann *	Syntax corrections. *	 *	Revision 1.7  1998/09/07 09:06:07  rassmann *	Syntax corrections. *	 *	Revision 1.6  1998/09/04 19:41:33  rassmann *	Syntax corrections. *	Started entering code for checking local links. *	 *	Revision 1.5  1998/09/04 12:14:27  rassmann *	Interface cleanup. *	 *	Revision 1.4  1998/09/02 16:55:28  rassmann *	Updated to reflect new DRV/HWAC/RLMT interface. *	 *	Revision 1.3  1998/08/27 14:29:03  rassmann *	Code cleanup. *	 *	Revision 1.2  1998/08/27 14:26:24  rassmann *	Updated interface. *	 *	Revision 1.1  1998/08/21 08:26:49  rassmann *	First public version. * ******************************************************************************//****************************************************************************** * * Description: * * This module contains code for Link ManagemenT (LMT) of SK-NET Adapters. * It is mainly intended for adapters with more than one link. * For such adapters, this module realizes Redundant Link ManagemenT (RLMT). * * Include File Hierarchy: * *	"skdrv1st.h" *	"skdrv2nd.h" * ******************************************************************************/#ifndef	lintstatic const char SysKonnectFileId[] =	"@(#) $Id: skrlmt.c,v 1.49 1999/11/22 13:38:02 cgoos Exp $ (C) SysKonnect.";#endif	/* !defined(lint) */#define __SKRLMT_C#ifdef __cplusplusxxxx	/* not supported yet - force error */extern "C" {#endif	/* cplusplus */#include "h/skdrv1st.h"#include "h/skdrv2nd.h"/* defines ********************************************************************/#ifndef SK_HWAC_LINK_LED#define SK_HWAC_LINK_LED(a,b,c,d)#endif	/* !defined(SK_HWAC_LINK_LED) */#ifndef DEBUG#define RLMT_STATIC	static#else	/* DEBUG */#define RLMT_STATIC#ifndef SK_LITTLE_ENDIAN/* First 32 bits */#define OFFS_LO32	1/* Second 32 bits */#define OFFS_HI32	0#else	/* SK_LITTLE_ENDIAN *//* First 32 bits */#define OFFS_LO32	0/* Second 32 bits */#define OFFS_HI32	1#endif	/* SK_LITTLE_ENDIAN */#endif	/* DEBUG *//* ----- Private timeout values ----- */#define SK_RLMT_MIN_TO_VAL		   125000	/* 1/8 sec. */#define SK_RLMT_DEF_TO_VAL		  1000000	/* 1 sec. */#define SK_RLMT_PORTDOWN_TIM_VAL	   900000	/* another 0.9 sec. */#define SK_RLMT_PORTSTART_TIM_VAL	   100000	/* 0.1 sec. */#define SK_RLMT_PORTUP_TIM_VAL		  2500000	/* 2.5 sec. */#define SK_RLMT_SEG_TO_VAL		900000000	/* 15 min. *//* * Amount that a time stamp must be later to be recognized as "substantially * later". This is about 1/128 sec. */#define SK_RLMT_BC_DELTA	((SK_TICKS_PER_SEC >> 7) + 1)/* ----- Private RLMT defaults ----- */#define SK_RLMT_DEF_PREF_PORT	0			/* "Lower" port. */#define SK_RLMT_DEF_MODE 	SK_RLMT_CHECK_LINK	/* Default RLMT Mode. *//* ----- Private RLMT checking states ----- */#define SK_RLMT_RCS_SEG		1	/* RLMT Check State: check seg. */#define SK_RLMT_RCS_START_SEG	2	/* RLMT Check State: start check seg. */#define SK_RLMT_RCS_SEND_SEG	4	/* RLMT Check State: send BPDU packet */#define SK_RLMT_RCS_REPORT_SEG	8	/* RLMT Check State: report seg. *//* ----- Private PORT checking states ----- */#define SK_RLMT_PCS_TX		1	/* Port Check State: check tx. */#define SK_RLMT_PCS_RX		2	/* Port Check State: check rx. *//* ----- Private PORT events ----- *//* Note: Update simulation when changing these. */#define SK_RLMT_PORTSTART_TIM	1100	/* Port start timeout. */#define SK_RLMT_PORTUP_TIM	1101	/* Port can now go up. */#define SK_RLMT_PORTDOWN_RX_TIM	1102	/* Port did not receive once ... */#define SK_RLMT_PORTDOWN	1103	/* Port went down. */#define SK_RLMT_PORTDOWN_TX_TIM	1104	/* Partner did not receive ... *//* ----- Private RLMT events ----- *//* Note: Update simulation when changing these. */#define SK_RLMT_TIM		2100	/* RLMT timeout. */#define SK_RLMT_SEG_TIM		2101	/* RLMT segmentation check timeout. */#define TO_SHORTEN(tim)	((tim) / 2)/* Error numbers and messages. */#define SKERR_RLMT_E001		(SK_ERRBASE_RLMT + 0)#define SKERR_RLMT_E001_MSG	"No Packet."#define SKERR_RLMT_E002		(SKERR_RLMT_E001 + 1)#define SKERR_RLMT_E002_MSG	"Short Packet."#define SKERR_RLMT_E003		(SKERR_RLMT_E002 + 1)#define SKERR_RLMT_E003_MSG	"Unknown RLMT event."#define SKERR_RLMT_E004		(SKERR_RLMT_E003 + 1)#define SKERR_RLMT_E004_MSG	"PortsUp incorrect."#define SKERR_RLMT_E005		(SKERR_RLMT_E004 + 1)#define SKERR_RLMT_E005_MSG	\ "Net seems to be segmented (different root bridges are reported on the ports)."#define SKERR_RLMT_E006		(SKERR_RLMT_E005 + 1)#define SKERR_RLMT_E006_MSG	"Duplicate MAC Address detected."#define SKERR_RLMT_E007		(SKERR_RLMT_E006 + 1)#define SKERR_RLMT_E007_MSG	"LinksUp incorrect."#define SKERR_RLMT_E008		(SKERR_RLMT_E007 + 1)#define SKERR_RLMT_E008_MSG	"Port not started but link came up."#define SKERR_RLMT_E009		(SKERR_RLMT_E008 + 1)#define SKERR_RLMT_E009_MSG	"Corrected illegal setting of Preferred Port."#define SKERR_RLMT_E010		(SKERR_RLMT_E009 + 1)#define SKERR_RLMT_E010_MSG	"Ignored illegal Preferred Port."/* LLC field values. */#define LLC_COMMAND_RESPONSE_BIT	1#define LLC_TEST_COMMAND		0xE3#define LLC_UI				0x03/* RLMT Packet fields. */#define	SK_RLMT_DSAP			0#define	SK_RLMT_SSAP			0#define SK_RLMT_CTRL			(LLC_TEST_COMMAND)#define SK_RLMT_INDICATOR0		0x53	/* S */#define SK_RLMT_INDICATOR1		0x4B	/* K */#define SK_RLMT_INDICATOR2		0x2D	/* - */#define SK_RLMT_INDICATOR3		0x52	/* R */#define SK_RLMT_INDICATOR4		0x4C	/* L */#define SK_RLMT_INDICATOR5		0x4D	/* M */#define SK_RLMT_INDICATOR6		0x54	/* T */#define SK_RLMT_PACKET_VERSION	0/* RLMT SPT Flag values. */#define	SK_RLMT_SPT_FLAG_CHANGE		0x01#define	SK_RLMT_SPT_FLAG_CHANGE_ACK	0x80/* RLMT SPT Packet fields. */#define	SK_RLMT_SPT_DSAP		0x42#define	SK_RLMT_SPT_SSAP		0x42#define SK_RLMT_SPT_CTRL		(LLC_UI)#define	SK_RLMT_SPT_PROTOCOL_ID0	0x00#define	SK_RLMT_SPT_PROTOCOL_ID1	0x00#define	SK_RLMT_SPT_PROTOCOL_VERSION_ID	0x00#define	SK_RLMT_SPT_BPDU_TYPE		0x00#define	SK_RLMT_SPT_FLAGS		0x00	/* ?? */#define	SK_RLMT_SPT_ROOT_ID0		0xFF	/* Lowest possible priority. */#define	SK_RLMT_SPT_ROOT_ID1		0xFF	/* Lowest possible priority. *//* Remaining 6 bytes will be the current port address. */#define	SK_RLMT_SPT_ROOT_PATH_COST0	0x00#define	SK_RLMT_SPT_ROOT_PATH_COST1	0x00#define	SK_RLMT_SPT_ROOT_PATH_COST2	0x00#define	SK_RLMT_SPT_ROOT_PATH_COST3	0x00#define	SK_RLMT_SPT_BRIDGE_ID0		0xFF	/* Lowest possible priority. */#define	SK_RLMT_SPT_BRIDGE_ID1		0xFF	/* Lowest possible priority. *//* Remaining 6 bytes will be the current port address. */#define	SK_RLMT_SPT_PORT_ID0		0xFF	/* Lowest possible priority. */#define	SK_RLMT_SPT_PORT_ID1		0xFF	/* Lowest possible priority. */#define	SK_RLMT_SPT_MSG_AGE0		0x00#define	SK_RLMT_SPT_MSG_AGE1		0x00#define	SK_RLMT_SPT_MAX_AGE0		0x00#define	SK_RLMT_SPT_MAX_AGE1		0xFF#define	SK_RLMT_SPT_HELLO_TIME0		0x00#define	SK_RLMT_SPT_HELLO_TIME1		0xFF#define	SK_RLMT_SPT_FWD_DELAY0		0x00#define	SK_RLMT_SPT_FWD_DELAY1		0x40/* Size defines. */#define SK_RLMT_MIN_PACKET_SIZE	34#define SK_RLMT_MAX_PACKET_SIZE	(SK_RLMT_MAX_TX_BUF_SIZE)#define SK_PACKET_DATA_LEN	(SK_RLMT_MAX_PACKET_SIZE - \				 SK_RLMT_MIN_PACKET_SIZE)/* ----- RLMT packet types ----- */#define SK_PACKET_ANNOUNCE	1	/* Port announcement. */#define SK_PACKET_ALIVE		2	/* Alive packet to port. */#define SK_PACKET_ADDR_CHANGED	3	/* Port address changed. */#define SK_PACKET_CHECK_TX	4	/* Check your tx line. */#ifdef SK_LITTLE_ENDIAN#define SK_U16_TO_NETWORK_ORDER(Val,Addr) { \	SK_U8	*_Addr = (SK_U8*)(Addr); \	SK_U16	_Val = (SK_U16)(Val); \	*_Addr++ = (SK_U8)(_Val >> 8); \	*_Addr = (SK_U8)(_Val & 0xFF); \}#endif	/* SK_LITTLE_ENDIAN */#ifdef SK_BIG_ENDIAN#define SK_U16_TO_NETWORK_ORDER(Val,Addr) (*(SK_U16*)(Addr) = (SK_U16)(Val))#endif	/* SK_BIG_ENDIAN */#define AUTONEG_FAILED	SK_FALSE#define AUTONEG_SUCCESS	SK_TRUE/* typedefs *******************************************************************//* RLMT packet.  Length: SK_RLMT_MAX_PACKET_SIZE (60) bytes. */typedef struct s_RlmtPacket {	SK_U8	DstAddr[SK_MAC_ADDR_LEN];	SK_U8	SrcAddr[SK_MAC_ADDR_LEN];	SK_U8	TypeLen[2];	SK_U8	DSap;	SK_U8	SSap;	SK_U8	Ctrl;	SK_U8	Indicator[7];	SK_U8	RlmtPacketType[2];	SK_U8	Align1[2];	SK_U8	Random[4];	/* Random value of requesting(!) station. */	SK_U8	RlmtPacketVersion[2];	/* RLMT Packet version */	SK_U8	Data[SK_PACKET_DATA_LEN];} SK_RLMT_PACKET;typedef struct s_SpTreeRlmtPacket {	SK_U8	DstAddr[SK_MAC_ADDR_LEN];	SK_U8	SrcAddr[SK_MAC_ADDR_LEN];	SK_U8	TypeLen[2];	SK_U8	DSap;	SK_U8	SSap;	SK_U8	Ctrl;	SK_U8	ProtocolId[2];	SK_U8	ProtocolVersionId;	SK_U8	BpduType;	SK_U8	Flags;	SK_U8	RootId[8];	SK_U8	RootPathCost[4];	SK_U8	BridgeId[8];	SK_U8	PortId[2];	SK_U8	MessageAge[2];	SK_U8	MaxAge[2];	SK_U8	HelloTime[2];	SK_U8	ForwardDelay[2];} SK_SPTREE_PACKET;/* global variables ***********************************************************/SK_MAC_ADDR	SkRlmtMcAddr = {{0x01,  0x00,  0x5A,  0x52,  0x4C,  0x4D}};SK_MAC_ADDR	BridgeMcAddr = {{0x01,  0x80,  0xC2,  0x00,  0x00,  0x00}};SK_MAC_ADDR	BcAddr = {{0xFF,  0xFF,  0xFF,  0xFF,  0xFF,  0xFF}};/* local variables ************************************************************//* None. *//* functions ******************************************************************/RLMT_STATIC void	SkRlmtCheckSwitch(	SK_AC	*pAC,	SK_IOC	IoC);RLMT_STATIC void	SkRlmtCheckSeg(	SK_AC	*pAC,	SK_IOC	IoC);/****************************************************************************** * *	SkRlmtInit - initialize data, set state to init * * Description: * *	SK_INIT_DATA *	============ * *	This routine initializes all RLMT-related variables to a known state. *	The initial state is SK_RLMT_RS_INIT. *	All ports are initialized to SK_RLMT_PS_INIT. * * *	SK_INIT_IO *	========== * *	Nothing. * * *	SK_INIT_RUN *	=========== * *	Determine the adapter's random value. *	Set the hw registers, the "logical adapter address", the *	RLMT multicast address, and eventually the BPDU multicast address. * * Context: *	init, pageable * * Returns: *	Nothing. */void	SkRlmtInit(SK_AC	*pAC,	/* adapter context */SK_IOC	IoC,	/* I/O context */int	Level)	/* initialization level */{	SK_U32		i, j;	SK_U64		Random;	SK_EVPARA	Para;	SK_DBG_MSG(		pAC,		SK_DBGMOD_RLMT,		SK_DBGCAT_INIT,		("RLMT Init level %d.\n", Level))	switch (Level) {	case SK_INIT_DATA:	/* Initialize data structures. */		SK_MEMSET((char *)&pAC->Rlmt, 0, sizeof(SK_RLMT));		for (i = 0; i < SK_MAX_MACS; i++) {			pAC->Rlmt.Port[i].PortState = SK_RLMT_PS_INIT;			pAC->Rlmt.Port[i].LinkDown = SK_TRUE;			pAC->Rlmt.Port[i].PortDown = SK_TRUE;			pAC->Rlmt.Port[i].PortStarted = SK_FALSE;

⌨️ 快捷键说明

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