1/****************************************************************************** 2 * 3 * Name: skrlmt.h 4 * Project: GEnesis, PCI Gigabit Ethernet Adapter 5 * Version: $Revision: 1.35 $ 6 * Date: $Date: 2003/01/31 14:12:41 $ 7 * Purpose: Header file for Redundant Link ManagemenT. 8 * 9 ******************************************************************************/ 10 11/****************************************************************************** 12 * 13 * (C)Copyright 1998-2001 SysKonnect GmbH. 14 * 15 * This program is free software; you can redistribute it and/or modify 16 * it under the terms of the GNU General Public License as published by 17 * the Free Software Foundation; either version 2 of the License, or 18 * (at your option) any later version. 19 * 20 * The information in this file is provided "AS IS" without warranty. 21 * 22 ******************************************************************************/ 23 24/****************************************************************************** 25 * 26 * History: 27 * 28 * $Log: skrlmt.h,v $ 29 * Revision 1.35 2003/01/31 14:12:41 mkunz 30 * single port adapter runs now with two identical MAC addresses 31 * 32 * Revision 1.34 2002/09/23 15:13:41 rwahl 33 * Editorial changes. 34 * 35 * Revision 1.33 2001/07/03 12:16:48 mkunz 36 * New Flag ChgBcPrio (Change priority of last broadcast received) 37 * 38 * Revision 1.32 2001/02/14 14:06:31 rassmann 39 * Editorial changes. 40 * 41 * Revision 1.31 2001/02/05 14:25:26 rassmann 42 * Prepared RLMT for transparent operation. 43 * 44 * Revision 1.30 2001/01/22 13:41:39 rassmann 45 * Supporting two nets on dual-port adapters. 46 * 47 * Revision 1.29 2000/11/17 08:58:00 rassmann 48 * Moved CheckSwitch from SK_RLMT_PACKET_RECEIVED to SK_RLMT_TIM event. 49 * 50 * Revision 1.28 2000/11/09 12:24:34 rassmann 51 * Editorial changes. 52 * 53 * Revision 1.27 1999/11/22 13:59:56 cgoos 54 * Changed license header to GPL. 55 * 56 * Revision 1.26 1999/10/04 14:01:19 rassmann 57 * Corrected reaction to reception of BPDU frames (#10441). 58 * 59 * Revision 1.25 1999/07/20 12:53:39 rassmann 60 * Fixed documentation errors for lookahead macros. 61 * 62 * Revision 1.24 1999/05/28 11:15:56 rassmann 63 * Changed behaviour to reflect Design Spec v1.2. 64 * Controlling Link LED(s). 65 * Introduced RLMT Packet Version field in RLMT Packet. 66 * Newstyle lookahead macros (checking meta-information before looking at 67 * the packet). 68 * 69 * Revision 1.23 1999/01/28 12:50:42 rassmann 70 * Not using broadcast time stamps in CheckLinkState mode. 71 * 72 * Revision 1.22 1999/01/27 14:13:04 rassmann 73 * Monitoring broadcast traffic. 74 * Switching more reliably and not too early if switch is 75 * configured for spanning tree. 76 * 77 * Revision 1.21 1998/12/08 13:11:25 rassmann 78 * Stopping SegTimer at RlmtStop. 79 * 80 * Revision 1.20 1998/11/24 12:37:33 rassmann 81 * Implemented segmentation check. 82 * 83 * Revision 1.19 1998/11/17 13:43:06 rassmann 84 * Handling (logical) tx failure. 85 * Sending packet on logical address after PORT_SWITCH. 86 * 87 * Revision 1.18 1998/11/13 16:56:56 rassmann 88 * Added macro version of SkRlmtLookaheadPacket. 89 * 90 * Revision 1.17 1998/11/06 18:06:05 rassmann 91 * Corrected timing when RLMT checks fail. 92 * Clearing tx counter earlier in periodical checks. 93 * 94 * Revision 1.16 1998/11/03 13:53:50 rassmann 95 * RLMT should switch now (at least in mode 3). 96 * 97 * Revision 1.15 1998/10/22 11:39:52 rassmann 98 * Corrected signed/unsigned mismatches. 99 * Corrected receive list handling and address recognition. 100 * 101 * Revision 1.14 1998/10/15 15:16:36 rassmann 102 * Finished Spanning Tree checking. 103 * Checked with lint. 104 * 105 * Revision 1.13 1998/09/24 19:16:08 rassmann 106 * Code cleanup. 107 * Introduced Timer for PORT_DOWN due to no RX. 108 * 109 * Revision 1.12 1998/09/16 11:09:52 rassmann 110 * Syntax corrections. 111 * 112 * Revision 1.11 1998/09/15 11:28:50 rassmann 113 * Syntax corrections. 114 * 115 * Revision 1.10 1998/09/14 17:07:38 rassmann 116 * Added code for port checking via LAN. 117 * Changed Mbuf definition. 118 * 119 * Revision 1.9 1998/09/07 11:14:15 rassmann 120 * Syntax corrections. 121 * 122 * Revision 1.8 1998/09/07 09:06:08 rassmann 123 * Syntax corrections. 124 * 125 * Revision 1.7 1998/09/04 19:41:34 rassmann 126 * Syntax corrections. 127 * Started entering code for checking local links. 128 * 129 * Revision 1.6 1998/09/04 12:14:28 rassmann 130 * Interface cleanup. 131 * 132 * Revision 1.5 1998/09/02 16:55:29 rassmann 133 * Updated to reflect new DRV/HWAC/RLMT interface. 134 * 135 * Revision 1.4 1998/09/02 07:26:02 afischer 136 * typedef for SK_RLMT_PORT 137 * 138 * Revision 1.3 1998/08/27 14:29:03 rassmann 139 * Code cleanup. 140 * 141 * Revision 1.2 1998/08/27 14:26:25 rassmann 142 * Updated interface. 143 * 144 * Revision 1.1 1998/08/21 08:29:10 rassmann 145 * First public version. 146 * 147 ******************************************************************************/ 148 149/****************************************************************************** 150 * 151 * Description: 152 * 153 * This is the header file for Redundant Link ManagemenT. 154 * 155 * Include File Hierarchy: 156 * 157 * "skdrv1st.h" 158 * ... 159 * "sktypes.h" 160 * "skqueue.h" 161 * "skaddr.h" 162 * "skrlmt.h" 163 * ... 164 * "skdrv2nd.h" 165 * 166 ******************************************************************************/ 167 168#ifndef __INC_SKRLMT_H 169#define __INC_SKRLMT_H 170 171#ifdef __cplusplus 172#error C++ is not yet supported. 173extern "C" { 174#endif /* cplusplus */ 175 176/* defines ********************************************************************/ 177 178#define SK_RLMT_NET_DOWN_TEMP 1 /* NET_DOWN due to last port down. */ 179#define SK_RLMT_NET_DOWN_FINAL 2 /* NET_DOWN due to RLMT_STOP. */ 180 181/* ----- Default queue sizes - must be multiples of 8 KB ----- */ 182 183/* Less than 8 KB free in RX queue => pause frames. */ 184#define SK_RLMT_STANDBY_QRXSIZE 128 /* Size of rx standby queue in KB. */ 185#define SK_RLMT_STANDBY_QXASIZE 32 /* Size of async standby queue in KB. */ 186#define SK_RLMT_STANDBY_QXSSIZE 0 /* Size of sync standby queue in KB. */ 187 188#define SK_RLMT_MAX_TX_BUF_SIZE 60 /* Maximum RLMT transmit size. */ 189 190/* ----- PORT states ----- */ 191 192#define SK_RLMT_PS_INIT 0 /* Port state: Init. */ 193#define SK_RLMT_PS_LINK_DOWN 1 /* Port state: Link down. */ 194#define SK_RLMT_PS_DOWN 2 /* Port state: Port down. */ 195#define SK_RLMT_PS_GOING_UP 3 /* Port state: Going up. */ 196#define SK_RLMT_PS_UP 4 /* Port state: Up. */ 197 198/* ----- RLMT states ----- */ 199 200#define SK_RLMT_RS_INIT 0 /* RLMT state: Init. */ 201#define SK_RLMT_RS_NET_DOWN 1 /* RLMT state: Net down. */ 202#define SK_RLMT_RS_NET_UP 2 /* RLMT state: Net up. */ 203 204/* ----- PORT events ----- */ 205 206#define SK_RLMT_LINK_UP 1001 /* Link came up. */ 207#define SK_RLMT_LINK_DOWN 1002 /* Link went down. */ 208#define SK_RLMT_PORT_ADDR 1003 /* Port address changed. */ 209 210/* ----- RLMT events ----- */ 211 212#define SK_RLMT_START 2001 /* Start RLMT. */ 213#define SK_RLMT_STOP 2002 /* Stop RLMT. */ 214#define SK_RLMT_PACKET_RECEIVED 2003 /* Packet was received for RLMT. */ 215#define SK_RLMT_STATS_CLEAR 2004 /* Clear statistics. */ 216#define SK_RLMT_STATS_UPDATE 2005 /* Update statistics. */ 217#define SK_RLMT_PREFPORT_CHANGE 2006 /* Change preferred port. */ 218#define SK_RLMT_MODE_CHANGE 2007 /* New RlmtMode. */ 219#define SK_RLMT_SET_NETS 2008 /* Number of Nets (1 or 2). */ 220 221/* ----- RLMT mode bits ----- */ 222 223/* 224 * CAUTION: These defines are private to RLMT. 225 * Please use the RLMT mode defines below. 226 */ 227 228#define SK_RLMT_CHECK_LINK 1 /* Check Link. */ 229#define SK_RLMT_CHECK_LOC_LINK 2 /* Check other link on same adapter. */ 230#define SK_RLMT_CHECK_SEG 4 /* Check segmentation. */ 231 232#ifndef RLMT_CHECK_REMOTE 233#define SK_RLMT_CHECK_OTHERS SK_RLMT_CHECK_LOC_LINK 234#else /* RLMT_CHECK_REMOTE */ 235#define SK_RLMT_CHECK_REM_LINK 8 /* Check link(s) on other adapter(s). */ 236#define SK_RLMT_MAX_REMOTE_PORTS_CHECKED 3 237#define SK_RLMT_CHECK_OTHERS \ 238 (SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_REM_LINK) 239#endif /* RLMT_CHECK_REMOTE */ 240 241#ifndef SK_RLMT_ENABLE_TRANSPARENT 242#define SK_RLMT_TRANSPARENT 0 /* RLMT transparent - inactive. */ 243#else /* SK_RLMT_ENABLE_TRANSPARENT */ 244#define SK_RLMT_TRANSPARENT 128 /* RLMT transparent. */ 245#endif /* SK_RLMT_ENABLE_TRANSPARENT */ 246 247/* ----- RLMT modes ----- */ 248 249/* Check Link State. */ 250#define SK_RLMT_MODE_CLS (SK_RLMT_CHECK_LINK) 251 252/* Check Local Ports: check other links on the same adapter. */ 253#define SK_RLMT_MODE_CLP (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK) 254 255/* Check Local Ports and Segmentation Status. */ 256#define SK_RLMT_MODE_CLPSS \ 257 (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_SEG) 258 259#ifdef RLMT_CHECK_REMOTE 260/* Check Local and Remote Ports: check links (local or remote). */ 261 Name of define TBD! 262#define SK_RLMT_MODE_CRP \ 263 (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | SK_RLMT_CHECK_REM_LINK) 264 265/* Check Local and Remote Ports and Segmentation Status. */ 266 Name of define TBD! 267#define SK_RLMT_MODE_CRPSS \ 268 (SK_RLMT_CHECK_LINK | SK_RLMT_CHECK_LOC_LINK | \ 269 SK_RLMT_CHECK_REM_LINK | SK_RLMT_CHECK_SEG) 270#endif /* RLMT_CHECK_REMOTE */ 271 272/* ----- RLMT lookahead result bits ----- */ 273 274#define SK_RLMT_RX_RLMT 1 /* Give packet to RLMT. */ 275#define SK_RLMT_RX_PROTOCOL 2 /* Give packet to protocol. */ 276 277/* Macros */ 278 279#if 0 280SK_AC *pAC /* adapter context */ 281SK_U32 PortNum /* receiving port */ 282unsigned PktLen /* received packet's length */ 283SK_BOOL IsBc /* Flag: packet is broadcast */ 284unsigned *pOffset /* offs. of bytes to present to SK_RLMT_LOOKAHEAD */ 285unsigned *pNumBytes /* #Bytes to present to SK_RLMT_LOOKAHEAD */ 286#endif /* 0 */ 287 288#define SK_RLMT_PRE_LOOKAHEAD(pAC,PortNum,PktLen,IsBc,pOffset,pNumBytes) { \ 289 SK_AC *_pAC; \ 290 SK_U32 _PortNum; \ 291 _pAC = (pAC); \ 292 _PortNum = (SK_U32)(PortNum); \ 293 /* _pAC->Rlmt.Port[_PortNum].PacketsRx++; */ \ 294 _pAC->Rlmt.Port[_PortNum].PacketsPerTimeSlot++; \ 295 if (_pAC->Rlmt.RlmtOff) { \ 296 *(pNumBytes) = 0; \ 297 } \ 298 else {\ 299 if ((_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_TRANSPARENT) != 0) { \ 300 *(pNumBytes) = 0; \ 301 } \ 302 else if (IsBc) { \ 303 if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode != SK_RLMT_MODE_CLS) { \ 304 *(pNumBytes) = 6; \ 305 *(pOffset) = 6; \ 306 } \ 307 else { \ 308 *(pNumBytes) = 0; \ 309 } \ 310 } \ 311 else { \ 312 if ((PktLen) > SK_RLMT_MAX_TX_BUF_SIZE) { \ 313 /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ 314 *(pNumBytes) = 0; \ 315 } \ 316 else { \ 317 *(pNumBytes) = 6; \ 318 *(pOffset) = 0; \ 319 } \ 320 } \ 321 } \ 322} 323 324#if 0 325SK_AC *pAC /* adapter context */ 326SK_U32 PortNum /* receiving port */ 327SK_U8 *pLaPacket, /* received packet's data (points to pOffset) */ 328SK_BOOL IsBc /* Flag: packet is broadcast */ 329SK_BOOL IsMc /* Flag: packet is multicast */ 330unsigned *pForRlmt /* Result: bits SK_RLMT_RX_RLMT, SK_RLMT_RX_PROTOCOL */ 331SK_RLMT_LOOKAHEAD() expects *pNumBytes from 332packet offset *pOffset (s.a.) at *pLaPacket. 333 334If you use SK_RLMT_LOOKAHEAD in a path where you already know if the packet is 335BC, MC, or UC, you should use constants for IsBc and IsMc, so that your compiler 336can trash unneeded parts of the if construction. 337#endif /* 0 */ 338 339#define SK_RLMT_LOOKAHEAD(pAC,PortNum,pLaPacket,IsBc,IsMc,pForRlmt) { \ 340 SK_AC *_pAC; \ 341 SK_U32 _PortNum; \ 342 SK_U8 *_pLaPacket; \ 343 _pAC = (pAC); \ 344 _PortNum = (SK_U32)(PortNum); \ 345 _pLaPacket = (SK_U8 *)(pLaPacket); \ 346 if (IsBc) {\ 347 if (!SK_ADDR_EQUAL(_pLaPacket, _pAC->Addr.Net[_pAC->Rlmt.Port[ \ 348 _PortNum].Net->NetNumber].CurrentMacAddress.a)) { \ 349 _pAC->Rlmt.Port[_PortNum].BcTimeStamp = SkOsGetTime(_pAC); \ 350 _pAC->Rlmt.CheckSwitch = SK_TRUE; \ 351 } \ 352 /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ 353 *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ 354 } \ 355 else if (IsMc) { \ 356 if (SK_ADDR_EQUAL(_pLaPacket, BridgeMcAddr.a)) { \ 357 _pAC->Rlmt.Port[_PortNum].BpduPacketsPerTimeSlot++; \ 358 if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_CHECK_SEG) { \ 359 *(pForRlmt) = SK_RLMT_RX_RLMT | SK_RLMT_RX_PROTOCOL; \ 360 } \ 361 else { \ 362 *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ 363 } \ 364 } \ 365 else if (SK_ADDR_EQUAL(_pLaPacket, SkRlmtMcAddr.a)) { \ 366 *(pForRlmt) = SK_RLMT_RX_RLMT; \ 367 } \ 368 else { \ 369 /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ 370 *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ 371 } \ 372 } \ 373 else { \ 374 if (SK_ADDR_EQUAL( \ 375 _pLaPacket, \ 376 _pAC->Addr.Port[_PortNum].CurrentMacAddress.a)) { \ 377 *(pForRlmt) = SK_RLMT_RX_RLMT; \ 378 } \ 379 else { \ 380 /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ 381 *(pForRlmt) = SK_RLMT_RX_PROTOCOL; \ 382 } \ 383 } \ 384} 385 386#ifdef SK_RLMT_FAST_LOOKAHEAD 387Error: SK_RLMT_FAST_LOOKAHEAD no longer used. Use new macros for lookahead. 388#endif /* SK_RLMT_FAST_LOOKAHEAD */ 389#ifdef SK_RLMT_SLOW_LOOKAHEAD 390Error: SK_RLMT_SLOW_LOOKAHEAD no longer used. Use new macros for lookahead. 391#endif /* SK_RLMT_SLOW_LOOKAHEAD */ 392 393/* typedefs *******************************************************************/ 394 395#ifdef SK_RLMT_MBUF_PRIVATE 396typedef struct s_RlmtMbuf { 397 some content 398} SK_RLMT_MBUF; 399#endif /* SK_RLMT_MBUF_PRIVATE */ 400 401 402#ifdef SK_LA_INFO 403typedef struct s_Rlmt_PacketInfo { 404 unsigned PacketLength; /* Length of packet. */ 405 unsigned PacketType; /* Directed/Multicast/Broadcast. */ 406} SK_RLMT_PINFO; 407#endif /* SK_LA_INFO */ 408 409 410typedef struct s_RootId { 411 SK_U8 Id[8]; /* Root Bridge Id. */ 412} SK_RLMT_ROOT_ID; 413 414 415typedef struct s_port { 416 SK_MAC_ADDR CheckAddr; 417 SK_BOOL SuspectTx; 418} SK_PORT_CHECK; 419 420 421typedef struct s_RlmtNet SK_RLMT_NET; 422 423 424typedef struct s_RlmtPort { 425 426/* ----- Public part (read-only) ----- */ 427 428 SK_U8 PortState; /* Current state of this port. */ 429 430 /* For PNMI */ 431 SK_BOOL LinkDown; 432 SK_BOOL PortDown; 433 SK_U8 Align01; 434 435 SK_U32 PortNumber; /* Number of port on adapter. */ 436 SK_RLMT_NET * Net; /* Net port belongs to. */ 437 438 SK_U64 TxHelloCts; 439 SK_U64 RxHelloCts; 440 SK_U64 TxSpHelloReqCts; 441 SK_U64 RxSpHelloCts; 442 443/* ----- Private part ----- */ 444 445/* SK_U64 PacketsRx; */ /* Total packets received. */ 446 SK_U32 PacketsPerTimeSlot; /* Packets rxed between TOs. */ 447/* SK_U32 DataPacketsPerTimeSlot; */ /* Data packets ... */ 448 SK_U32 BpduPacketsPerTimeSlot; /* BPDU packets rxed in TS. */ 449 SK_U64 BcTimeStamp; /* Time of last BC receive. */ 450 SK_U64 GuTimeStamp; /* Time of entering GOING_UP. */ 451 452 SK_TIMER UpTimer; /* Timer struct Link/Port up. */ 453 SK_TIMER DownRxTimer; /* Timer struct down rx. */ 454 SK_TIMER DownTxTimer; /* Timer struct down tx. */ 455 456 SK_U32 CheckingState; /* Checking State. */ 457 458 SK_ADDR_PORT * AddrPort; 459 460 SK_U8 Random[4]; /* Random value. */ 461 unsigned PortsChecked; /* #ports checked. */ 462 unsigned PortsSuspect; /* #ports checked that are s. */ 463 SK_PORT_CHECK PortCheck[1]; 464/* SK_PORT_CHECK PortCheck[SK_MAX_MACS - 1]; */ 465 466 SK_BOOL PortStarted; /* Port is started. */ 467 SK_BOOL PortNoRx; /* NoRx for >= 1 time slot. */ 468 SK_BOOL RootIdSet; 469 SK_RLMT_ROOT_ID Root; /* Root Bridge Id. */ 470} SK_RLMT_PORT; 471 472 473struct s_RlmtNet { 474 475/* ----- Public part (read-only) ----- */ 476 477 SK_U32 NetNumber; /* Number of net. */ 478 479 SK_RLMT_PORT * Port[SK_MAX_MACS]; /* Ports that belong to this net. */ 480 SK_U32 NumPorts; /* Number of ports. */ 481 SK_U32 PrefPort; /* Preferred port. */ 482 483 /* For PNMI */ 484 485 SK_U32 ChgBcPrio; /* Change Priority of last broadcast received */ 486 SK_U32 RlmtMode; /* Check ... */ 487 SK_U32 ActivePort; /* Active port. */ 488 SK_U32 Preference; /* 0xFFFFFFFF: Automatic. */ 489 490 SK_U8 RlmtState; /* Current RLMT state. */ 491 492/* ----- Private part ----- */ 493 SK_BOOL RootIdSet; 494 SK_U16 Align01; 495 496 int LinksUp; /* #Links up. */ 497 int PortsUp; /* #Ports up. */ 498 SK_U32 TimeoutValue; /* RLMT timeout value. */ 499 500 SK_U32 CheckingState; /* Checking State. */ 501 SK_RLMT_ROOT_ID Root; /* Root Bridge Id. */ 502 503 SK_TIMER LocTimer; /* Timer struct. */ 504 SK_TIMER SegTimer; /* Timer struct. */ 505}; 506 507 508typedef struct s_Rlmt { 509 510/* ----- Public part (read-only) ----- */ 511 512 SK_U32 NumNets; /* Number of nets. */ 513 SK_U32 NetsStarted; /* Number of nets started. */ 514 SK_RLMT_NET Net[SK_MAX_NETS]; /* Array of available nets. */ 515 SK_RLMT_PORT Port[SK_MAX_MACS]; /* Array of available ports. */ 516 517/* ----- Private part ----- */ 518 SK_BOOL CheckSwitch; 519 SK_BOOL RlmtOff; /* set to zero if the Mac addresses 520 are equal or the second one 521 is zero */ 522 SK_U16 Align01; 523 524} SK_RLMT; 525 526 527extern SK_MAC_ADDR BridgeMcAddr; 528extern SK_MAC_ADDR SkRlmtMcAddr; 529 530/* function prototypes ********************************************************/ 531 532 533#ifndef SK_KR_PROTO 534 535/* Functions provided by SkRlmt */ 536 537/* ANSI/C++ compliant function prototypes */ 538 539extern void SkRlmtInit( 540 SK_AC *pAC, 541 SK_IOC IoC, 542 int Level); 543 544extern int SkRlmtEvent( 545 SK_AC *pAC, 546 SK_IOC IoC, 547 SK_U32 Event, 548 SK_EVPARA Para); 549 550#else /* defined(SK_KR_PROTO) */ 551 552/* Non-ANSI/C++ compliant function prototypes */ 553 554#error KR-style function prototypes are not yet provided. 555 556#endif /* defined(SK_KR_PROTO)) */ 557 558 559#ifdef __cplusplus 560} 561#endif /* __cplusplus */ 562 563#endif /* __INC_SKRLMT_H */ 564