migrate.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. /* Port Protocol Migration state machine : 17.26 */
  23.  
  24. #include "base.h"
  25. #include "stpm.h"
  26. #define STATES { 
  27.   CHOOSE(INIT),     
  28.   CHOOSE(SEND_RSTP),    
  29.   CHOOSE(SENDING_RSTP), 
  30.   CHOOSE(SEND_STP), 
  31.   CHOOSE(SENDING_STP),  
  32. }
  33. #define GET_STATE_NAME STP_migrate_get_state_name
  34. #include "choose.h"
  35. #define MigrateTime 3 /* 17,16.4 */
  36. void
  37. STP_migrate_enter_state (STATE_MACH_T* this)
  38. {
  39.   register PORT_T*       port = this->owner.port;
  40.   switch (this->State) {
  41.     case BEGIN:
  42.     case INIT:
  43.       port->initPm = True;
  44.       port->mcheck = False;
  45.       break;
  46.     case SEND_RSTP:
  47.       port->mdelayWhile = MigrateTime;
  48.       port->mcheck = port->initPm = False;
  49.       port->sendRSTP = True;
  50.       break;
  51.     case SENDING_RSTP:
  52.       port->rcvdRSTP = port->rcvdSTP = False;
  53.       break;
  54.     case SEND_STP:
  55.       port->mdelayWhile = MigrateTime;
  56.       port->sendRSTP = False;
  57.       port->initPm = False;
  58.       break;
  59.     case SENDING_STP:
  60.       port->rcvdRSTP = port->rcvdSTP = False;
  61.       break;
  62.   }
  63. }
  64. Bool
  65. STP_migrate_check_conditions (STATE_MACH_T* this)
  66. {
  67.   register PORT_T*    port = this->owner.port;
  68.   if ((!port->portEnabled && !port->initPm) || BEGIN == this->State)
  69.     return STP_hop_2_state (this, INIT);
  70.   switch (this->State) {
  71.     case INIT:
  72.       if (port->portEnabled) {
  73.         return STP_hop_2_state (this, (port->owner->ForceVersion >= 2) ?
  74.                                    SEND_RSTP : SEND_STP);
  75.       }
  76.       break;
  77.     case SEND_RSTP:
  78.       return STP_hop_2_state (this, SENDING_RSTP);
  79.     case SENDING_RSTP:
  80.       if (port->mcheck)
  81.         return STP_hop_2_state (this, SEND_RSTP);
  82.       if (port->mdelayWhile &&
  83.           (port->rcvdSTP || port->rcvdRSTP)) {
  84.         return STP_hop_2_state (this, SENDING_RSTP);
  85.       }
  86.         
  87.       if (!port->mdelayWhile && port->rcvdSTP) {
  88.         return STP_hop_2_state (this, SEND_STP);       
  89.       }
  90.         
  91.       if (port->owner->ForceVersion < 2) {
  92.         return STP_hop_2_state (this, SEND_STP);
  93.       }
  94.         
  95.       break;
  96.     case SEND_STP:
  97.       return STP_hop_2_state (this, SENDING_STP);
  98.     case SENDING_STP:
  99.       if (port->mcheck)
  100.         return STP_hop_2_state (this, SEND_RSTP);
  101.       if (port->mdelayWhile &&
  102.           (port->rcvdSTP || port->rcvdRSTP))
  103.         return STP_hop_2_state (this, SENDING_STP);
  104.       if (!port->mdelayWhile && port->rcvdRSTP)
  105.         return STP_hop_2_state (this, SEND_RSTP);
  106.       break;
  107.   }
  108.   return False;
  109. }