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

📄 sttrans.c

📁 rstp for switch in vxworks
💻 C
字号:

/************************************************************************ 
 * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 
 * Copyright (C) 2001-2003 Optical Access 
 * Author: Alex Rozin 
 * 
 * This file is part of RSTP library. 
 * 
 * RSTP library is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU Lesser General Public License as published by the 
 * Free Software Foundation; version 2.1 
 * 
 * RSTP library is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser 
 * General Public License for more details. 
 * 
 * You should have received a copy of the GNU Lesser General Public License 
 * along with RSTP library; see the file COPYING.  If not, write to the Free 
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
 * 02111-1307, USA. 
 **********************************************************************/

/* Port State Transition state machine : 17.24 */

#include "base.h"
#include "stpm.h"
#include "stp_to.h"

#define STATES { \
  CHOOSE(DISCARDING),   \
  CHOOSE(LEARNING), \
  CHOOSE(FORWARDING),   \
}


#define DISCARDING   2
#define LEARNING     3
#define FORWARDING   4


#define PortSTPDisabled		0
#define PortSTPBlocking		1
#define PortSTPListening	       2
#define PortSTPLearning		3
#define PortSTPForwarding	4

#define GET_STATE_NAME STP_sttrans_get_state_name

#include "choose.h"

#ifdef STRONGLY_SPEC_802_1W

/*************************************************************************************
  function:
  purpose: 让端口的learning状态disable
  input:
  output:
  return:
  remark: 图17-18 DISCARDING
    
**************************************************************************************/
static Bool disableLearning (STATE_MACH_T * this)
{
	register struct net_bridge_port *port = this->owner.port;

	return STP_OUT_set_learning (port->port_index, port->owner->vlan_id, False);
}

/*************************************************************************************
  function:
  purpose: 让端口的learning状态enable
  input:
  output:
  return:
  remark: 图17-18 LEARNING
    
**************************************************************************************/
static Bool enableLearning (STATE_MACH_T * this)
{
	register struct net_bridge_port  *port = this->owner.port;

	return STP_OUT_set_learning (port->port_index, port->owner->vlan_id, True);
}

/*************************************************************************************
  function:
  purpose: 让端口的forwarding状态disable
  input:
  output:
  return:
  remark: 图17-18 DISCARDING
    
**************************************************************************************/
static Bool disableForwarding (STATE_MACH_T * this)
{
	register struct net_bridge_port *port = this->owner.port;

	return STP_OUT_set_forwarding (port->port_index, port->owner->vlan_id,
		False);
}

/*************************************************************************************
  function:
  purpose: 让端口的Forwarding状态enable
  input:
  output:
  return:
  remark: 图17-18 FORWARDING
    
**************************************************************************************/
static Bool enableForwarding (STATE_MACH_T * this)
{
	register struct net_bridge_port *port = this->owner.port;

	return STP_OUT_set_forwarding (port->port_index, port->owner->vlan_id,
		True);
}
#endif


/*************************************************************************************
  function:
  purpose: 状态操作函数
  input:
  output:
  return:
  remark: 17.24    
**************************************************************************************/
void STP_sttrans_enter_state (STATE_MACH_T * this)
{
	register struct net_bridge_port *port = this->owner.port;

/*	printf("port= %d\r\n");*/

	switch (this->State)
	{
		case BEGIN:
		#ifdef STTRANS_DEBUG
				printf("sttrans:  Enter:BEGIN  \r\n");
		#endif
		case DISCARDING:
		#ifdef STTRANS_DEBUG
				printf("sttrans:  Enter:DISCARDING  \r\n");
		#endif
			port->learning = False;
			port->forwarding = False;
#ifdef STRONGLY_SPEC_802_1W
			disableLearning (this);
			disableForwarding (this);
#else
			STP_OUT_set_port_state (port, UID_PORT_DISCARDING);
			
			


#endif
			break;

		case LEARNING:
		#ifdef STTRANS_DEBUG
				printf("sttrans:  Enter:LEARNING  \r\n");
		#endif
			port->learning = True;
#ifdef STRONGLY_SPEC_802_1W
			enableLearning (this);
#else
			STP_OUT_set_port_state (port, UID_PORT_LEARNING);

#endif
			break;

		case FORWARDING:
		#ifdef STTRANS_DEBUG
				printf("sttrans:  Enter:FORWARDING  \r\n");
		#endif
			port->tc = !port->operEdge;
			port->forwarding = True;
#ifdef STRONGLY_SPEC_802_1W
			enableForwarding (this);
#else
			STP_OUT_set_port_state (port, UID_PORT_FORWARDING);

#endif
    			break;

		default:
			break;
			
	}

}

/*************************************************************************************
  function:
  purpose: Port State Transition 状态机转移函数
  input:
  output:
  return:
  remark: 17.24    
**************************************************************************************/
Bool STP_sttrans_check_conditions (STATE_MACH_T * this)
{
	register struct net_bridge_port  *port = this->owner.port;

	if (BEGIN == this->State)		
	{
		#ifdef STTRANS_DEBUG
				printf("sttrans:  BEGIN  To   DISCARDING\r\n");
		#endif
		return STP_hop_2_state (this, DISCARDING);
	}

	switch (this->State)
	{
		case DISCARDING:
			if (port->learn)
			{
			#ifdef STTRANS_DEBUG
				printf("sttrans:  DISCARDING  To  LEARNING\r\n");
 			#endif
				return STP_hop_2_state (this, LEARNING);
			}
			break;
		case LEARNING:
			if (port->forward)
			{
			#ifdef STTRANS_DEBUG
				printf("sttrans:  LEARNING  To   FORWARDING\r\n");
			#endif
				return STP_hop_2_state (this, FORWARDING);
			}
			if (!port->learn)
			{
			#ifdef STTRANS_DEBUG
				printf("sttrans:  LEARNIG  To   DISCARDING\r\n");
			#endif
				return STP_hop_2_state (this, DISCARDING);
			}
			break;
		case FORWARDING:
			if (!port->forward)
			{
			#ifdef STTRANS_DEBUG
				printf("sttrans:  FORWARDING  To   DISCARDING\r\n");
			#endif
				return STP_hop_2_state (this, DISCARDING);
			}
			break;
		default:
			break;
	}

	return False;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -