#include "base.h"
#include "stpm.h"
#include "stp_to.h"
#define STATES { \
CHOOSE(AUTO), \
CHOOSE(FORSE), \
CHOOSE(STABLE) \
}
#define GET_STATE_NAME STP_pcost_get_state_name
#include "choose.h"
static long
computeAutoPCost (STATE_MACH_T *this)
{
long lret;
register PORT_T* port = this->owner.port;
if (port->usedSpeed < 10L) {
lret = 20000000;
} else if (port->usedSpeed <= 10L) {
lret = 2000000;
} else if (port->usedSpeed <= 100L) {
lret = 200000;
} else if (port->usedSpeed <= 1000L) {
lret = 20000;
} else if (port->usedSpeed <= 10000L) {
lret = 2000;
} else if (port->usedSpeed <= 100000L) {
lret = 200;
} else if (port->usedSpeed <= 1000000L) {
lret = 20;
} else if (port->usedSpeed <= 10000000L) {
lret = 2;
} else {
lret = 1;
}
#ifdef STP_DBG
if (port->pcost->debug) {
stp_trace ("usedSpeed=%lu lret=%ld", port->usedSpeed, lret);
}
#endif
return lret;
}
static void
updPortPathCost (STATE_MACH_T *this)
{
}
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;
}