⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rolesel.c

📁 rstp for switch in vxworks
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			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 + -