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

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. /* Path Cost monitoring state machine */
  23.  
  24. #include "base.h"
  25. #include "stpm.h"
  26. #include "stp_to.h" /* for STP_OUT_get_port_oper_speed */
  27. #define STATES {        
  28.   CHOOSE(AUTO),         
  29.   CHOOSE(FORSE),        
  30.   CHOOSE(STABLE),       
  31. }
  32. #define GET_STATE_NAME STP_pcost_get_state_name
  33. #include "choose.h"
  34. static long
  35. computeAutoPCost (STATE_MACH_T *this)
  36. {
  37.     long lret;
  38.     register PORT_T*  port = this->owner.port;
  39.     if (port->usedSpeed        < 10L) {         /* < 10Mb/s */
  40.         lret = 20000000;
  41.     } else if (port->usedSpeed <= 10L) {        /* 10 Mb/s  */
  42.         lret = 2000000;        
  43.     } else if (port->usedSpeed <= 100L) {       /* 100 Mb/s */
  44.         lret = 200000;     
  45.     } else if (port->usedSpeed <= 1000L) {      /* 1 Gb/s */
  46.         lret = 20000;      
  47.     } else if (port->usedSpeed <= 10000L) {     /* 10 Gb/s */
  48.         lret = 2000;       
  49.     } else if (port->usedSpeed <= 100000L) {    /* 100 Gb/s */
  50.         lret = 200;        
  51.     } else if (port->usedSpeed <= 1000000L) {   /* 1 GTb/s */
  52.         lret = 20;     
  53.     } else if (port->usedSpeed <= 10000000L) {  /* 10 Tb/s */
  54.         lret = 2;      
  55.     } else   /* ??? */                        { /* > Tb/s */
  56.         lret = 1;       
  57.     }
  58. #ifdef STP_DBG
  59.     if (port->pcost->debug) {
  60.       stp_trace ("usedSpeed=%lu lret=%ld", port->usedSpeed, lret);
  61.     }
  62. #endif
  63.     return lret;
  64. }
  65. static void
  66. updPortPathCost (STATE_MACH_T *this)
  67. {
  68. }
  69. void
  70. STP_pcost_enter_state (STATE_MACH_T *this)
  71. {
  72.   register PORT_T*  port = this->owner.port;
  73.   switch (this->State) {
  74.     case BEGIN:
  75.       break;
  76.     case AUTO:
  77.       port->operSpeed = STP_OUT_get_port_oper_speed (port->port_index);
  78. #ifdef STP_DBG
  79.       if (port->pcost->debug) {
  80.         stp_trace ("AUTO:operSpeed=%lu", port->operSpeed);
  81.       }
  82. #endif
  83.       port->usedSpeed = port->operSpeed;
  84.       port->operPCost = computeAutoPCost (this);
  85.       break;
  86.     case FORSE:
  87.       port->operPCost = port->adminPCost;
  88.       port->usedSpeed = -1;
  89.       break;
  90.     case STABLE:
  91.       updPortPathCost (this);
  92.       break;
  93.   }
  94. }
  95. Bool
  96. STP_pcost_check_conditions (STATE_MACH_T* this)
  97. {
  98.   register PORT_T*  port = this->owner.port;
  99.   switch (this->State) {
  100.     case BEGIN:
  101.       return STP_hop_2_state (this, AUTO);
  102.     case AUTO:
  103.       return STP_hop_2_state (this, STABLE);
  104.     case FORSE:
  105.       return STP_hop_2_state (this, STABLE);
  106.     case STABLE:
  107.       if (ADMIN_PORT_PATH_COST_AUTO == port->adminPCost && 
  108.           port->operSpeed != port->usedSpeed) {
  109.           return STP_hop_2_state (this, AUTO);
  110.       }
  111.       if (ADMIN_PORT_PATH_COST_AUTO != port->adminPCost &&
  112.           port->operPCost != port->adminPCost) {
  113.           return STP_hop_2_state (this, FORSE);
  114.       }
  115.       break;
  116.   }
  117.   return False;
  118. }