f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy/************************************************************************
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * RSTP library - Rapid Spanning Tree (802.1t, 802.1w)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * Copyright (C) 2001-2003 Optical Access
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * Author: Alex Rozin
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * This file is part of RSTP library.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * RSTP library is free software; you can redistribute it and/or modify it
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * under the terms of the GNU Lesser General Public License as published by the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * Free Software Foundation; version 2.1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * RSTP library is distributed in the hope that it will be useful, but
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * WITHOUT ANY WARRANTY; without even the implied warranty of
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * General Public License for more details.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy *
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * You should have received a copy of the GNU Lesser General Public License
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * along with RSTP library; see the file COPYING. If not, write to the Free
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy * 02111-1307, USA.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy **********************************************************************/
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy/* Path Cost monitoring state machine */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#include "base.h"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#include "stpm.h"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#include "stp_to.h" /* for STP_OUT_get_port_oper_speed */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy#define STATES { \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy CHOOSE(AUTO), \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy CHOOSE(FORSE), \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy CHOOSE(STABLE) \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#define GET_STATE_NAME STP_pcost_get_state_name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#include "choose.h"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic long
f38cb554a534c6df738be3f4d23327e69888e634John Wren KennedycomputeAutoPCost (STATE_MACH_T *this)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy long lret;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy register PORT_T* port = this->owner.port;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (port->usedSpeed < 10L) { /* < 10Mb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 20000000;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 10L) { /* 10 Mb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 2000000;
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy } else if (port->usedSpeed <= 100L) { /* 100 Mb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 200000;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 1000L) { /* 1 Gb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 20000;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 10000L) { /* 10 Gb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 2000;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 100000L) { /* 100 Gb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 200;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 1000000L) { /* 1 GTb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 20;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else if (port->usedSpeed <= 10000000L) { /* 10 Tb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 2;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy } else /* ??? */ { /* > Tb/s */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy lret = 1;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy }
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#ifdef STP_DBG
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if (port->pcost->debug) {
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy stp_trace ("usedSpeed=%lu lret=%ld", port->usedSpeed, lret);
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy }
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy#endif
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy return lret;
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy/* ARGSUSED */
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedystatic void
f38cb554a534c6df738be3f4d23327e69888e634John Wren KennedyupdPortPathCost (STATE_MACH_T *this)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
void
STP_pcost_enter_state (STATE_MACH_T *this)
{
register PORT_T* port = this->owner.port;
switch (this->State) {
case BEGIN:
break;
case AUTO:
port->operSpeed = STP_OUT_get_port_oper_speed (port->port_index);
#ifdef STP_DBG
if (port->pcost->debug) {
stp_trace ("AUTO:operSpeed=%lu", port->operSpeed);
}
#endif
port->usedSpeed = port->operSpeed;
port->operPCost = computeAutoPCost (this);
break;
case FORSE:
port->operPCost = port->adminPCost;
port->usedSpeed = (unsigned long)-1;
break;
case STABLE:
updPortPathCost (this);
break;
}
}
Bool
STP_pcost_check_conditions (STATE_MACH_T* this)
{
register PORT_T* port = this->owner.port;
switch (this->State) {
case BEGIN:
return STP_hop_2_state (this, AUTO);
case AUTO:
return STP_hop_2_state (this, STABLE);
case FORSE:
return STP_hop_2_state (this, STABLE);
case STABLE:
if (ADMIN_PORT_PATH_COST_AUTO == port->adminPCost &&
port->operSpeed != port->usedSpeed) {
return STP_hop_2_state (this, AUTO);
}
if (ADMIN_PORT_PATH_COST_AUTO != port->adminPCost &&
port->operPCost != port->adminPCost) {
return STP_hop_2_state (this, FORSE);
}
break;
}
return False;
}