edge.c
上传用户:allwinjm
上传日期:2021-08-29
资源大小:99k
文件大小:3k
源码类别:

Internet/IE编程

开发平台:

Unix_Linux

  1. /************************************************************************ 
  2.  * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 
  3.  * Copyright (C) 2001-2003 Optical Access 
  4.  * Author: Alex Rozin 
  5.  * 
  6.  * This file is part of RSTP library. 
  7.  * 
  8.  * RSTP library is free software; you can redistribute it and/or modify it 
  9.  * under the terms of the GNU Lesser General Public License as published by the 
  10.  * Free Software Foundation; version 2.1 
  11.  * 
  12.  * RSTP library is distributed in the hope that it will be useful, but 
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser 
  15.  * General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public License 
  18.  * along with RSTP library; see the file COPYING.  If not, write to the Free 
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  20.  * 02111-1307, USA. 
  21.  **********************************************************************/
  22. /* Note: this state mashine distinkts from described in P802.1t Clause 18. */
  23. /* I am ready to discuss it                                                */
  24.  
  25. #include "base.h"
  26. #include "stpm.h"
  27. #define STATES {        
  28.   CHOOSE(DISABLED),         
  29.   CHOOSE(DETECTED),     
  30.   CHOOSE(DELEAYED),     
  31.   CHOOSE(RESOLVED),     
  32. }
  33. #define GET_STATE_NAME STP_edge_get_state_name
  34. #include "choose.h"
  35. #define DEFAULT_LINK_DELAY  3
  36. void
  37. STP_edge_enter_state (STATE_MACH_T *s)
  38. {
  39.   register PORT_T *port = s->owner.port;
  40.   switch (s->State) {
  41.     case BEGIN:
  42.       break;
  43.     case DISABLED:
  44.       port->operEdge = port->adminEdge;
  45.       port->wasInitBpdu = False;
  46.       port->lnkWhile = 0;
  47.       port->portEnabled = False;
  48.       break;
  49.     case DETECTED:
  50.       port->portEnabled = True;
  51.       port->lnkWhile = port->LinkDelay;
  52.       port->operEdge = False;
  53.       break;
  54.     case DELEAYED:
  55.       break;
  56.     case RESOLVED:
  57.       if (! port->wasInitBpdu) {
  58.           port->operEdge = port->adminEdge;
  59.       }
  60.       break;
  61.   }
  62. }
  63. Bool
  64. STP_edge_check_conditions (STATE_MACH_T *s)
  65. {
  66.   register PORT_T *port = s->owner.port;
  67.   switch (s->State) {
  68.     case BEGIN:
  69.       return STP_hop_2_state (s, DISABLED);
  70.     case DISABLED:
  71.       if (port->adminEnable) {
  72.         return STP_hop_2_state (s, DETECTED);
  73.       }
  74.       break;
  75.     case DETECTED:
  76.       return STP_hop_2_state (s, DELEAYED);
  77.     case DELEAYED:
  78.       if (port->wasInitBpdu) {
  79. #ifdef STP_DBG
  80.         if (s->debug)
  81.             stp_trace ("port %s 'edge' resolved by BPDU", port->port_name);
  82. #endif        
  83.         return STP_hop_2_state (s, RESOLVED);
  84.       }
  85.       if (! port->lnkWhile)  {
  86. #ifdef STP_DBG
  87.         if (s->debug)
  88.           stp_trace ("port %s 'edge' resolved by timer", port->port_name);
  89. #endif        
  90.         return STP_hop_2_state (s, RESOLVED);
  91.       }
  92.       if (! port->adminEnable) {
  93.         return STP_hop_2_state (s, DISABLED);
  94.       }
  95.       break;
  96.     case RESOLVED:
  97.       if (! port->adminEnable) {
  98.         return STP_hop_2_state (s, DISABLED);
  99.       }
  100.       break;
  101.   }
  102.   return False;
  103. }