| /****************************************************************************** |
| * |
| * Name: skrlmt.h |
| * Project: GEnesis, PCI Gigabit Ethernet Adapter |
| * Version: $Revision: 1.37 $ |
| * Date: $Date: 2003/04/15 09:43:43 $ |
| * Purpose: Header file for Redundant Link ManagemenT. |
| * |
| ******************************************************************************/ |
| |
| /****************************************************************************** |
| * |
| * (C)Copyright 1998-2002 SysKonnect GmbH. |
| * (C)Copyright 2002-2003 Marvell. |
| * |
| * 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. |
| * |
| ******************************************************************************/ |
| |
| /****************************************************************************** |
| * |
| * Description: |
| * |
| * This is the header file for Redundant Link ManagemenT. |
| * |
| * Include File Hierarchy: |
| * |
| * "skdrv1st.h" |
| * ... |
| * "sktypes.h" |
| * "skqueue.h" |
| * "skaddr.h" |
| * "skrlmt.h" |
| * ... |
| * "skdrv2nd.h" |
| * |
| ******************************************************************************/ |
| |
| #ifndef __INC_SKRLMT_H |
| #define __INC_SKRLMT_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif /* cplusplus */ |
| |
| /* defines ********************************************************************/ |
| |
| #define SK_RLMT_NET_DOWN_TEMP 1 /* NET_DOWN due to last port down. */ |
| #define SK_RLMT_NET_DOWN_FINAL 2 /* NET_DOWN due to RLMT_STOP. */ |
| |
| /* ----- Default queue sizes - must be multiples of 8 KB ----- */ |
| |
| /* Less than 8 KB free in RX queue => pause frames. */ |
| #define SK_RLMT_STANDBY_QRXSIZE 128 /* Size of rx standby queue in KB. */ |
| #define SK_RLMT_STANDBY_QXASIZE 32 /* Size of async standby queue in KB. */ |
| #define SK_RLMT_STANDBY_QXSSIZE 0 /* Size of sync standby queue in KB. */ |
| |
| #define SK_RLMT_MAX_TX_BUF_SIZE 60 /* Maximum RLMT transmit size. */ |
| |
| /* ----- PORT states ----- */ |
| |
| #define SK_RLMT_PS_INIT 0 /* Port state: Init. */ |
| #define SK_RLMT_PS_LINK_DOWN 1 /* Port state: Link down. */ |
| #define SK_RLMT_PS_DOWN 2 /* Port state: Port down. */ |
| #define SK_RLMT_PS_GOING_UP 3 /* Port state: Going up. */ |
| #define SK_RLMT_PS_UP 4 /* Port state: Up. */ |
| |
| /* ----- RLMT states ----- */ |
| |
| #define SK_RLMT_RS_INIT 0 /* RLMT state: Init. */ |
| #define SK_RLMT_RS_NET_DOWN 1 /* RLMT state: Net down. */ |
| #define SK_RLMT_RS_NET_UP 2 /* RLMT state: Net up. */ |
| |
| /* ----- PORT events ----- */ |
| |
| #define SK_RLMT_LINK_UP 1001 /* Link came up. */ |
| #define SK_RLMT_LINK_DOWN 1002 /* Link went down. */ |
| #define SK_RLMT_PORT_ADDR 1003 /* Port address changed. */ |
| |
| /* ----- RLMT events ----- */ |
| |
| #define SK_RLMT_START 2001 /* Start RLMT. */ |
| #define SK_RLMT_STOP 2002 /* Stop RLMT. */ |
| #define SK_RLMT_PACKET_RECEIVED 2003 /* Packet was received for RLMT. */ |
| #define SK_RLMT_STATS_CLEAR 2004 /* Clear statistics. */ |
| #define SK_RLMT_STATS_UPDATE 2005 /* Update statistics. */ |
| #define SK_RLMT_PREFPORT_CHANGE 2006 /* Change preferred port. */ |
| #define SK_RLMT_MODE_CHANGE 2007 /* New RlmtMode. */ |
| #define SK_RLMT_SET_NETS 2008 /* Number of Nets (1 or 2). */ |
| |
| /* ----- RLMT mode bits ----- */ |
| |
| /* |
| * CAUTION: These defines are private to RLMT. |
| * Please use the RLMT mode defines below. |
| */ |
| |
| #define SK_RLMT_CHECK_LINK 1 /* Check Link. */ |
| #define SK_RLMT_CHECK_LOC_LINK 2 /* Check other link on same adapter. */ |
| #define SK_RLMT_CHECK_SEG 4 /* Check segmentation. */ |
| |
| #ifndef RLMT_CHECK_REMOTE |
| #define SK_RLMT_CHECK_OTHERS SK_RLMT_CHECK_LOC_LINK |
| #else /* RLMT_CHECK_REMOTE */ |
| #define SK_RLMT_CHECK_REM_LINK 8 /* Check link(s) on other adapter(s). */ |
| #define SK_RLMT_MAX_REMOTE_PORTS_CHECKED 3 |
| #define SK_RLMT_CHECK_OTHERS \ |
| (SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_REM_LINK) |
| #endif /* RLMT_CHECK_REMOTE */ |
| |
| #ifndef SK_RLMT_ENABLE_TRANSPARENT |
| #define SK_RLMT_TRANSPARENT 0 /* RLMT transparent - inactive. */ |
| #else /* SK_RLMT_ENABLE_TRANSPARENT */ |
| #define SK_RLMT_TRANSPARENT 128 /* RLMT transparent. */ |
| #endif /* SK_RLMT_ENABLE_TRANSPARENT */ |
| |
| /* ----- RLMT modes ----- */ |
| |
| /* Check Link State. */ |
| #define SK_RLMT_MODE_CLS (SK_RLMT_CHECK_LINK) |
| |
| /* Check Local Ports: check other links on the same adapter. */ |
| #define SK_RLMT_MODE_CLP (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK) |
| |
| /* Check Local Ports and Segmentation Status. */ |
| #define SK_RLMT_MODE_CLPSS \ |
| (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_SEG) |
| |
| #ifdef RLMT_CHECK_REMOTE |
| /* Check Local and Remote Ports: check links (local or remote). */ |
| Name of define TBD! |
| #define SK_RLMT_MODE_CRP \ |
| (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_REM_LINK) |
| |
| /* Check Local and Remote Ports and Segmentation Status. */ |
| Name of define TBD! |
| #define SK_RLMT_MODE_CRPSS \ |
| (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | \ |
| SK_RLMT_CHECK_REM_LINK | SK_RLMT_CHECK_SEG) |
| #endif /* RLMT_CHECK_REMOTE */ |
| |
| /* ----- RLMT lookahead result bits ----- */ |
| |
| #define SK_RLMT_RX_RLMT 1 /* Give packet to RLMT. */ |
| #define SK_RLMT_RX_PROTOCOL 2 /* Give packet to protocol. */ |
| |
| /* Macros */ |
| |
| #if 0 |
| SK_AC *pAC /* adapter context */ |
| SK_U32 PortNum /* receiving port */ |
| unsigned PktLen /* received packet's length */ |
| SK_BOOL IsBc /* Flag: packet is broadcast */ |
| unsigned *pOffset /* offs. of bytes to present to SK_RLMT_LOOKAHEAD */ |
| unsigned *pNumBytes /* #Bytes to present to SK_RLMT_LOOKAHEAD */ |
| #endif /* 0 */ |
| |
| #define SK_RLMT_PRE_LOOKAHEAD(pAC,PortNum,PktLen,IsBc,pOffset,pNumBytes) { \ |
| SK_AC *_pAC; \ |
| SK_U32 _PortNum; \ |
| _pAC = (pAC); \ |
| _PortNum = (SK_U32)(PortNum); \ |
| /* _pAC->Rlmt.Port[_PortNum].PacketsRx++; */ \ |
| _pAC->Rlmt.Port[_PortNum].PacketsPerTimeSlot++; \ |
| if (_pAC->Rlmt.RlmtOff) { \ |
| *(pNumBytes) = 0; \ |
| } \ |
| else {\ |
| if ((_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_TRANSPARENT) != 0) { \ |
| *(pNumBytes) = 0; \ |
| } \ |
| else if (IsBc) { \ |
| if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode != SK_RLMT_MODE_CLS) { \ |
| *(pNumBytes) = 6; \ |
| *(pOffset) = 6; \ |
| } \ |
| else { \ |
| *(pNumBytes) = 0; \ |
| } \ |
| } \ |
| else { \ |
| if ((PktLen) > SK_RLMT_MAX_TX_BUF_SIZE) { \ |
| /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ |
| *(pNumBytes) = 0; \ |
| } \ |
| else { \ |
| *(pNumBytes) = 6; \ |
| *(pOffset) = 0; \ |
| } \ |
| } \ |
| } \ |
| } |
| |
| #if 0 |
| SK_AC *pAC /* adapter context */ |
| SK_U32 PortNum /* receiving port */ |
| SK_U8 *pLaPacket, /* received packet's data (points to pOffset) */ |
| SK_BOOL IsBc /* Flag: packet is broadcast */ |
| SK_BOOL IsMc /* Flag: packet is multicast */ |
| unsigned *pForRlmt /* Result: bits SK_RLMT_RX_RLMT, SK_RLMT_RX_PROTOCOL */ |
| SK_RLMT_LOOKAHEAD() expects *pNumBytes from |
| packet offset *pOffset (s.a.) at *pLaPacket. |
| |
| If you use SK_RLMT_LOOKAHEAD in a path where you already know if the packet is |
| BC, MC, or UC, you should use constants for IsBc and IsMc, so that your compiler |
| can trash unneeded parts of the if construction. |
| #endif /* 0 */ |
| |
| #define SK_RLMT_LOOKAHEAD(pAC,PortNum,pLaPacket,IsBc,IsMc,pForRlmt) { \ |
| SK_AC *_pAC; \ |
| SK_U32 _PortNum; \ |
| SK_U8 *_pLaPacket; \ |
| _pAC = (pAC); \ |
| _PortNum = (SK_U32)(PortNum); \ |
| _pLaPacket = (SK_U8 *)(pLaPacket); \ |
| if (IsBc) {\ |
| if (!SK_ADDR_EQUAL(_pLaPacket, _pAC->Addr.Net[_pAC->Rlmt.Port[ \ |
| _PortNum].Net->NetNumber].CurrentMacAddress.a)) { \ |
| _pAC->Rlmt.Port[_PortNum].BcTimeStamp = SkOsGetTime(_pAC); \ |
| _pAC->Rlmt.CheckSwitch = SK_TRUE; \ |
| } \ |
| /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ |
| *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ |
| } \ |
| else if (IsMc) { \ |
| if (SK_ADDR_EQUAL(_pLaPacket, BridgeMcAddr.a)) { \ |
| _pAC->Rlmt.Port[_PortNum].BpduPacketsPerTimeSlot++; \ |
| if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_CHECK_SEG) { \ |
| *(pForRlmt) = SK_RLMT_RX_RLMT | SK_RLMT_RX_PROTOCOL; \ |
| } \ |
| else { \ |
| *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ |
| } \ |
| } \ |
| else if (SK_ADDR_EQUAL(_pLaPacket, SkRlmtMcAddr.a)) { \ |
| *(pForRlmt) = SK_RLMT_RX_RLMT; \ |
| } \ |
| else { \ |
| /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ |
| *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ |
| } \ |
| } \ |
| else { \ |
| if (SK_ADDR_EQUAL( \ |
| _pLaPacket, \ |
| _pAC->Addr.Port[_PortNum].CurrentMacAddress.a)) { \ |
| *(pForRlmt) = SK_RLMT_RX_RLMT; \ |
| } \ |
| else { \ |
| /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ |
| *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ |
| } \ |
| } \ |
| } |
| |
| #ifdef SK_RLMT_FAST_LOOKAHEAD |
| Error: SK_RLMT_FAST_LOOKAHEAD no longer used. Use new macros for lookahead. |
| #endif /* SK_RLMT_FAST_LOOKAHEAD */ |
| #ifdef SK_RLMT_SLOW_LOOKAHEAD |
| Error: SK_RLMT_SLOW_LOOKAHEAD no longer used. Use new macros for lookahead. |
| #endif /* SK_RLMT_SLOW_LOOKAHEAD */ |
| |
| /* typedefs *******************************************************************/ |
| |
| #ifdef SK_RLMT_MBUF_PRIVATE |
| typedef struct s_RlmtMbuf { |
| some content |
| } SK_RLMT_MBUF; |
| #endif /* SK_RLMT_MBUF_PRIVATE */ |
| |
| |
| #ifdef SK_LA_INFO |
| typedef struct s_Rlmt_PacketInfo { |
| unsigned PacketLength; /* Length of packet. */ |
| unsigned PacketType; /* Directed/Multicast/Broadcast. */ |
| } SK_RLMT_PINFO; |
| #endif /* SK_LA_INFO */ |
| |
| |
| typedef struct s_RootId { |
| SK_U8 Id[8]; /* Root Bridge Id. */ |
| } SK_RLMT_ROOT_ID; |
| |
| |
| typedef struct s_port { |
| SK_MAC_ADDR CheckAddr; |
| SK_BOOL SuspectTx; |
| } SK_PORT_CHECK; |
| |
| |
| typedef struct s_RlmtNet SK_RLMT_NET; |
| |
| |
| typedef struct s_RlmtPort { |
| |
| /* ----- Public part (read-only) ----- */ |
| |
| SK_U8 PortState; /* Current state of this port. */ |
| |
| /* For PNMI */ |
| SK_BOOL LinkDown; |
| SK_BOOL PortDown; |
| SK_U8 Align01; |
| |
| SK_U32 PortNumber; /* Number of port on adapter. */ |
| SK_RLMT_NET * Net; /* Net port belongs to. */ |
| |
| SK_U64 TxHelloCts; |
| SK_U64 RxHelloCts; |
| SK_U64 TxSpHelloReqCts; |
| SK_U64 RxSpHelloCts; |
| |
| /* ----- Private part ----- */ |
| |
| /* SK_U64 PacketsRx; */ /* Total packets received. */ |
| SK_U32 PacketsPerTimeSlot; /* Packets rxed between TOs. */ |
| /* SK_U32 DataPacketsPerTimeSlot; */ /* Data packets ... */ |
| SK_U32 BpduPacketsPerTimeSlot; /* BPDU packets rxed in TS. */ |
| SK_U64 BcTimeStamp; /* Time of last BC receive. */ |
| SK_U64 GuTimeStamp; /* Time of entering GOING_UP. */ |
| |
| SK_TIMER UpTimer; /* Timer struct Link/Port up. */ |
| SK_TIMER DownRxTimer; /* Timer struct down rx. */ |
| SK_TIMER DownTxTimer; /* Timer struct down tx. */ |
| |
| SK_U32 CheckingState; /* Checking State. */ |
| |
| SK_ADDR_PORT * AddrPort; |
| |
| SK_U8 Random[4]; /* Random value. */ |
| unsigned PortsChecked; /* #ports checked. */ |
| unsigned PortsSuspect; /* #ports checked that are s. */ |
| SK_PORT_CHECK PortCheck[1]; |
| /* SK_PORT_CHECK PortCheck[SK_MAX_MACS - 1]; */ |
| |
| SK_BOOL PortStarted; /* Port is started. */ |
| SK_BOOL PortNoRx; /* NoRx for >= 1 time slot. */ |
| SK_BOOL RootIdSet; |
| SK_RLMT_ROOT_ID Root; /* Root Bridge Id. */ |
| } SK_RLMT_PORT; |
| |
| |
| struct s_RlmtNet { |
| |
| /* ----- Public part (read-only) ----- */ |
| |
| SK_U32 NetNumber; /* Number of net. */ |
| |
| SK_RLMT_PORT * Port[SK_MAX_MACS]; /* Ports that belong to this net. */ |
| SK_U32 NumPorts; /* Number of ports. */ |
| SK_U32 PrefPort; /* Preferred port. */ |
| |
| /* For PNMI */ |
| |
| SK_U32 ChgBcPrio; /* Change Priority of last broadcast received */ |
| SK_U32 RlmtMode; /* Check ... */ |
| SK_U32 ActivePort; /* Active port. */ |
| SK_U32 Preference; /* 0xFFFFFFFF: Automatic. */ |
| |
| SK_U8 RlmtState; /* Current RLMT state. */ |
| |
| /* ----- Private part ----- */ |
| SK_BOOL RootIdSet; |
| SK_U16 Align01; |
| |
| int LinksUp; /* #Links up. */ |
| int PortsUp; /* #Ports up. */ |
| SK_U32 TimeoutValue; /* RLMT timeout value. */ |
| |
| SK_U32 CheckingState; /* Checking State. */ |
| SK_RLMT_ROOT_ID Root; /* Root Bridge Id. */ |
| |
| SK_TIMER LocTimer; /* Timer struct. */ |
| SK_TIMER SegTimer; /* Timer struct. */ |
| }; |
| |
| |
| typedef struct s_Rlmt { |
| |
| /* ----- Public part (read-only) ----- */ |
| |
| SK_U32 NumNets; /* Number of nets. */ |
| SK_U32 NetsStarted; /* Number of nets started. */ |
| SK_RLMT_NET Net[SK_MAX_NETS]; /* Array of available nets. */ |
| SK_RLMT_PORT Port[SK_MAX_MACS]; /* Array of available ports. */ |
| |
| /* ----- Private part ----- */ |
| SK_BOOL CheckSwitch; |
| SK_BOOL RlmtOff; /* set to zero if the Mac addresses |
| are equal or the second one |
| is zero */ |
| SK_U16 Align01; |
| |
| } SK_RLMT; |
| |
| |
| extern SK_MAC_ADDR BridgeMcAddr; |
| extern SK_MAC_ADDR SkRlmtMcAddr; |
| |
| /* function prototypes ********************************************************/ |
| |
| |
| #ifndef SK_KR_PROTO |
| |
| /* Functions provided by SkRlmt */ |
| |
| /* ANSI/C++ compliant function prototypes */ |
| |
| extern void SkRlmtInit( |
| SK_AC *pAC, |
| SK_IOC IoC, |
| int Level); |
| |
| extern int SkRlmtEvent( |
| SK_AC *pAC, |
| SK_IOC IoC, |
| SK_U32 Event, |
| SK_EVPARA Para); |
| |
| #else /* defined(SK_KR_PROTO) */ |
| |
| /* Non-ANSI/C++ compliant function prototypes */ |
| |
| #error KR-style function prototypes are not yet provided. |
| |
| #endif /* defined(SK_KR_PROTO)) */ |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* __INC_SKRLMT_H */ |