📄 portinfo.c
字号:
if (port->admin_non_stp)
return;
port->rcvdBpdu = True;
break;
case BPDU_TOPO_CHANGE_TYPE:
port->rx_tcn_bpdu_cnt++;
#if 0 /* def STP_DBG */
if (port->info->debug)
stp_trace ("TcnBpdu on port %s", port->port_name);
#endif
if (port->admin_non_stp)
return;
port->rcvdBpdu = True;
port->msgBpduVersion = bpdu->hdr.version;
port->msgBpduType = bpdu->hdr.bpdu_type;
return;
default:
#ifdef _INFO_DEBUG_
mn_fd_printf (cl_serv_console_fd,"RX undef bpdu type=%d", (int) bpdu->hdr.bpdu_type);
#endif
return;
case BPDU_RSTP:
port->rx_rstp_bpdu_cnt++;
if (port->admin_non_stp)
return;
if (port->br->ForceVersion >= NORMAL_RSTP)
{
port->rcvdBpdu = True;
}
else
{
return;
}
#if 0 /* def STP_DBG */
if (port->info->debug)
stp_trace ("BPDU_RSTP on port %s", port->port_name);
#endif
break;
}
port->msgBpduVersion = bpdu->hdr.version;
port->msgBpduType = bpdu->hdr.bpdu_type;
port->msgFlags = bpdu->body.flags;
/* 17.18.11 */
STP_VECT_get_vector (&bpdu->body, &port->msgPrio);
port->msgPrio.bridge_port = port->port_id;
/* 17.18.12 */
STP_get_times (&bpdu->body, &port->msgTimes);
/* 17.18.25, 17.18.26 : see setTcFlags() */
}
/************************************************************************************
function:
purpose: Port Information状态机的状态操作
input:
output:
return:
remark:
#define DISABLED 2
#define ENABLED 3
#define AGED 4
#define UPDATE 5
#define CURRENT 6
#define RECEIVE 7
#define SUPERIOR 8
#define REPEAT 9
#define AGREEMENT 10
*************************************************************************************/
void STP_info_enter_state (STATE_MACH_T * this)
{
register struct net_bridge_port *port = this->owner.port;
switch (this->State)
{
case BEGIN:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Begin\r\n");
#endif
port->rcvdMsg = OtherMsg;
port->msgBpduType = -1;
port->msgPortRole = RSTP_PORT_ROLE_UNKN;
port->msgFlags = 0;
/* clear port statistics */
port->rx_cfg_bpdu_cnt = port->rx_rstp_bpdu_cnt =
port->rx_tcn_bpdu_cnt = 0;
case DISABLED:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Disabled\r\n");
#endif
port->rcvdBpdu = port->rcvdRSTP = port->rcvdSTP = False;
port->updtInfo = port->proposing = False; /* In DISABLED */
port->agreed = port->proposed = False;
port->rcvdInfoWhile = 0;
port->infoIs = Disabled;
port->reselect = True;
port->selected = False;
break;
case ENABLED: /* IEEE 802.1y, 17.21, Z.14 */
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Enabled\r\n");
#endif
STP_VECT_copy (&port->portPrio, &port->designPrio);
STP_copy_times (&port->portTimes, &port->designTimes);
break;
case AGED:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Aged\r\n");
#endif
port->infoIs = Aged;
port->reselect = True;
port->selected = False;
break;
case UPDATE:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Update\r\n");
#endif
STP_VECT_copy (&port->portPrio, &port->designPrio);
STP_copy_times (&port->portTimes, &port->designTimes);
port->updtInfo = False;
port->agreed = port->synced = False; /* In UPDATE */
port->proposed = port->proposing = False; /* in UPDATE */
port->infoIs = Mine;
port->newInfo = True;
#ifdef STP_DBG
if (this->debug)
{
STP_VECT_br_id_print ("updated: portPrio.design_bridge",
&port->portPrio.design_bridge, True);
}
#endif
break;
case CURRENT:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Current\r\n");
#endif
break;
case RECEIVE:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Receive\r\n");
#endif
port->rcvdMsg = rcvBpdu (this);
updtBPDUVersion (this);
setTcFlags (this);
port->rcvdBpdu = False;
break;
case SUPERIOR:
STP_VECT_copy (&port->portPrio, &port->msgPrio);
STP_copy_times (&port->portTimes, &port->msgTimes);
updtRcvdInfoWhile (this);
#if 1 /* due 802.1y, Z.7 */
port->agreed = False; /* deleted due 802.y in SUPERIOR */
port->synced = False; /* due 802.y deleted in SUPERIOR */
#endif
port->proposing = False; /* in SUPERIOR */
port->proposed = recordProposed (this, "SUPERIOR");
port->infoIs = Received;
port->reselect = True;
port->selected = False;
#ifdef STP_DBG
if (this->debug)
{
STP_VECT_br_id_print ("stored: portPrio.design_bridge",
&port->portPrio.design_bridge, True);
stp_trace ("proposed=%d on port %s", (int) port->proposed,
port->port_name);
}
#endif
break;
case REPEAT:
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Repeat\r\n");
#endif
port->proposed = recordProposed (this, "REPEAT");
updtRcvdInfoWhile (this);
break;
case AGREEMENT:
#ifdef STP_DBG
if (port->roletrns->debug)
{
stp_trace ("(%s-%s) rx AGREEMENT flag !", port->owner->name,
port->port_name);
}
#endif
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO EnterState :Agreement\r\n");
#endif
port->agreed = True;
port->proposing = False; /* In AGREEMENT */
break;
}
}
/************************************************************************************
function:
purpose: Port Information状态机的状态转移
input:
output:
return:
remark:
*************************************************************************************/
Bool STP_info_check_conditions (STATE_MACH_T * this)
{
register struct net_bridge_port *port = this->owner.port;
if ((!port->portEnabled && port->infoIs != Disabled) ||
BEGIN == this->State)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :To Disabled\r\n");
#endif
return STP_hop_2_state (this, DISABLED);
}
switch (this->State)
{
case DISABLED:
if (port->updtInfo)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Disable To Disabled\r\n");
#endif
return STP_hop_2_state (this, DISABLED);
}
if (port->portEnabled && port->selected)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Disable To Enabled\r\n");
#endif
return STP_hop_2_state (this, ENABLED);
}
if (port->rcvdBpdu)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Disable To Disabled\r\n");
#endif
return STP_hop_2_state (this, DISABLED);
}
break;
case ENABLED: /* IEEE 802.1y, 17.21, Z.14 */
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Enable To Aged\r\n");
#endif
return STP_hop_2_state (this, AGED);
}
break;
case AGED:
if (port->selected && port->updtInfo)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Aged To Update\r\n");
#endif
return STP_hop_2_state (this, UPDATE);
}
break;
case UPDATE:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Update To Current\r\n");
#endif
return STP_hop_2_state (this, CURRENT);
}
break;
case CURRENT:
if (port->selected && port->updtInfo)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Current To Update\r\n");
#endif
return STP_hop_2_state (this, UPDATE);
}
if (Received == port->infoIs && !port->rcvdInfoWhile &&
!port->updtInfo && !port->rcvdBpdu)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Current To Aged\r\n");
#endif
return STP_hop_2_state (this, AGED);
}
if (port->rcvdBpdu && !port->updtInfo)
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Current To Received\r\n");
#endif
return STP_hop_2_state (this, RECEIVE);
}
break;
case RECEIVE:
switch (port->rcvdMsg)
{
case SuperiorDesignateMsg:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Receive To Superior\r\n");
#endif
return STP_hop_2_state (this, SUPERIOR);
}
case RepeatedDesignateMsg:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Receive To Repeat\r\n");
#endif
return STP_hop_2_state (this, REPEAT);
}
case ConfirmedRootMsg:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Receive To Agreement\r\n");
#endif
return STP_hop_2_state (this, AGREEMENT);
}
default:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Receive To Current\r\n");
#endif
return STP_hop_2_state (this, CURRENT);
}
}
break;
case SUPERIOR:
{
return STP_hop_2_state (this, CURRENT);
}
break;
case REPEAT:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Repeat To Current\r\n");
#endif
return STP_hop_2_state (this, CURRENT);
}
break;
case AGREEMENT:
{
#ifdef _INFO_DEBUG_
mn_fd_printf(cl_serv_console_fd,"INFO change :From Agreement To \r\n");
#endif
return STP_hop_2_state (this, CURRENT);
}
break;
}
return False;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -