📄 rolesel.c
字号:
{
continue;
}
STP_VECT_create (&port->designPrio, &stpm->rootPrio.root_bridge,
stpm->rootPrio.root_path_cost, &stpm->BrId, port->port_id,
port->port_id);
STP_copy_times (&port->designTimes, &stpm->rootTimes);
#if 0
#ifdef STP_DBG
if (port->roletrns->debug)
{
STP_VECT_br_id_print ("ch:designPrio.design_bridge",
&port->designPrio.design_bridge, True);
}
#endif
#endif
}
/*根端口为根优先级向量的桥端口*/
stpm->rootPortId = stpm->rootPrio.bridge_port;
#ifdef STP_DBG
if (old_root_port != stpm->rootPortId)
{
if (!stpm->rootPortId)
{
stp_trace ("\nbrige %s became root", stpm->name);
}
else
{
stp_trace ("\nbrige %s new root port: %s", stpm->name,
STP_stpm_get_port_name_by_id (stpm, stpm->rootPortId));
}
}
#endif
/*遍历所有的端口*/
for (port = stpm->port_list; port; port = port->next)
{
/*如果端口的stp未打开,设置端口为Non状态*/
if (port->admin_non_stp)
{
setRoleSelected ("Non", stpm, port, NonStpPort);
port->forward = port->learn = True;
continue;
}
if (is_port_uplink_port(port->port_no)!=1)
{
continue;
}
switch (port->infoIs)
{
/*g) 如果端口为disabled,selectedRole 被设置为disabled*/
case Disabled:
setRoleSelected ("Dis", stpm, port, DisabledPort);
break;
/*
h) 如果端口优先级向量被老化了,selectedRole 被
设置为DesignatedPort,updtInfo置位
*/
case Aged:
setRoleSelected ("Age", stpm, port, DesignatedPort);
port->updtInfo = True;
break;
/*
i) 如果端口的优先级向量从从桥上的另一个端口派生,或者
从一个自己就是根桥的桥上得到,则设置为DesignatedPort
updtInfo的值取决于两组向量中任何一组的不同,就真。
*/
case Mine:
setRoleSelected ("Mine", stpm, port, DesignatedPort);
if (0 != STP_VECT_compare_vector (&port->portPrio,
&port->designPrio) ||
0 != STP_compare_times (&port->portTimes,
&port->designTimes))
{
port->updtInfo = True;
}
break;
/*
i),j),k) 端口优先级向里那个从接收到的配置信息中得到,
并且未老化
*/
case Received:
/*
i) root priority vector 正是从这个端口中派生的,则端口为
根端口
*/
if (stpm->rootPortId == port->port_id)
{
setRoleSelected ("Rec", stpm, port, RootPort);
}
/*
这一段是802.1W协议上没有的。从作者的note来
看,是添加的有关802.1y Z1的内容。
如果端口的指定向量小于端口向量,则该端口
为指定端口,且updtInfo为真。
*/
else if (STP_VECT_compare_vector (&port->designPrio,
&port->portPrio) < 0)
{
/* Note: this important piece has been inserted after
* discussion with Mick Sieman and reading 802.1y Z1 */
setRoleSelected ("Rec", stpm, port, DesignatedPort);
port->updtInfo = True;
break;
}
/* k),l)*/
else
{
/* l) BackkupPort */
if (_is_backup_port (port, stpm))
{
setRoleSelected ("rec", stpm, port, BackupPort);
}
/* k) AlternatedPort */
else
{
setRoleSelected ("rec", stpm, port, AlternatePort);
}
}
/* j) k) l) updtInfo 被重置*/
port->updtInfo = False;
break;
default:
/*mn_fd_printf (cl_serv_console_fd,"undef infoIs=%d,port = %d\r\n", (int) port->infoIs,port->port_no);*/
break;
}
}
}
}
/********************************************************************************
* function:
purpose:
input:
output:
return:
remark:17.22. figure 17-14 ROLE_SELECTION
*
********************************************************************************/
static Bool setSelectedBridge (struct net_bridge * this)
{
register struct net_bridge_port *port;
for (port = this->port_list; port; port = port->next)
{
/*如果reselect为真,说明还需要计算*/
if (!is_port_uplink_port(port->port_no))
continue;
if (port->reselect)
{
#ifdef STP_DBG
stp_trace ("setSelectedBridge: TRUE=reselect on port %s",
port->port_name);
#endif
return False;
}
}
/*所有端口的角色都已经计算完毕,把selected置True*/
for (port = this->port_list; port; port = port->next)
{
if (!is_port_uplink_port(port->port_no))
continue;
port->selected = True;
}
return True;
}
/********************************************************************************
* function:
purpose: Port Role状态机的状态操作函数
input:
output:
return:
remark:17.22
********************************************************************************/
void STP_rolesel_enter_state (STATE_MACH_T * this)
{
struct net_bridge*stpm;
stpm = this->owner.stpm;
switch (this->State)
{
case BEGIN: /*和INTI_BRIDGE一样的操作*/
case INIT_BRIDGE:
updtRoleDisableBridge (stpm);
break;
case ROLE_SELECTION:
clearReselectBridge (stpm);
updtRolesBridge (this);
setSelectedBridge (stpm);
break;
default:
break;
}
}
/********************************************************************************
* function:
purpose: Port Role状态机的状态转移函数
input:
output:
return:
remark:17.22
********************************************************************************/
Bool STP_rolesel_check_conditions (STATE_MACH_T * s)
{
struct net_bridge *stpm;
register struct net_bridge_port *port;
if (BEGIN == s->State)
{
STP_hop_2_state (s, INIT_BRIDGE);
}
switch (s->State)
{
case BEGIN:
return STP_hop_2_state (s, INIT_BRIDGE);
case INIT_BRIDGE:
return STP_hop_2_state (s, ROLE_SELECTION);
case ROLE_SELECTION:
stpm = s->owner.stpm;
for (port = stpm->port_list; port; port = port->next)
{
if (!is_port_uplink_port(port->port_no))
continue;
if (port->reselect)
{
/* stp_trace ("reselect on port %s", port->port_name); */
return STP_hop_2_state (s, ROLE_SELECTION);
}
}
break;
}
return False;
}
/********************************************************************************
* function:
purpose:
input:
output:
return:
remark:未被调用
********************************************************************************/
void STP_rolesel_update_stpm (struct net_bridge* this)
{
register struct net_bridge_port *port;
PRIO_VECTOR_T rootPathPrio; /* 17.4.2.2 */
mn_fd_printf (cl_serv_console_fd,"%s", "??? STP_rolesel_update_stpm ???");
STP_VECT_create (&rootPathPrio, &this->BrId, 0, &this->BrId, 0, 0);
if (!this->rootPortId ||
STP_VECT_compare_vector (&rootPathPrio, &this->rootPrio) < 0)
{
STP_VECT_copy (&this->rootPrio, &rootPathPrio);
}
for (port = this->port_list; port; port = port->next)
{
if (!is_port_uplink_port(port->port_no))
continue;
STP_VECT_create (&port->designPrio, &this->rootPrio.root_bridge,
this->rootPrio.root_path_cost, &this->BrId, port->port_id,
port->port_id);
if (Received != port->infoIs || this->rootPortId == port->port_id)
{
STP_VECT_copy (&port->portPrio, &port->designPrio);
}
port->reselect = True;
port->selected = False;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -