/*******************************************************************************
* STP_PACKET.c
*
* IC+ for IP1826
*
* Editor: Chance 2008/04/09
*******************************************************************************/
/*******************************************************************************
* Include Files
*******************************************************************************/
#include "STP_PACKET.h"
#include "MDC_MDIO.h"
#include "switch.h"
/*******************************************************************************
* Global Variables
*******************************************************************************/
m_PORT_STATUS pstatus[26];
m_STPTX send_data;
m_SWITCH_INFO my_switch_info;
u8_t bpduDA[6]={0x01,0x80,0xC2,0x00,0x00,0x00};
#ifdef DEBUGPORTINFO
u16_t portinfo=0;
u8_t info_flag=0;
#endif
extern u16_t stpPortForward[2];
extern u16_t stpPortTx[2];
//function for web while
void STP_Process(void* pindata,u8_t in_portnum)
{
u8_t stp_result,root_flag,bpduflag,i;
u8_t pktType=0;
p_STPTRUC pinBPDU;
m_BPDU_FLAGS inrstpflag;
pinBPDU=(p_STPTRUC)pindata;
pktType=Check_BPDU_Packet(pindata);
if(pktType!=UnkownPacket)
{
//if received STP or RSTP BPUD then become not edge port
if(pstatus[in_portnum].porttimer.edge_timer.active==1)
{
pstatus[in_portnum].porttimer.edge_timer.value=0;
pstatus[in_portnum].porttimer.edge_timer.active=0;
}
pstatus[in_portnum].edge_flag=0;
//is BPDU packet
#ifdef STP_Process_debug
printf("\nBPDU Packet %d",(u16_t)in_portnum);
#endif
if((pktType==ConfBPDUs)||(pktType==TcnBPDUs))
{
#ifdef STP_Process_debug
printf("\nBPDU STP_MODE (%02X)",(u16_t)in_portnum);
#endif
pstatus[in_portnum].STP_RSTP=STP;//chance for RSTP
if(pktType==TcnBPDUs)
{
#ifdef STPPORTINFO
printf("\nBPDU STP_MODE TOPOLOGY_CHANGE_NOTIFICATION_BPDU");
printf("\n DA: %02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->da[0],(u16_t)pinBPDU->da[1],(u16_t)pinBPDU->da[2],(u16_t)pinBPDU->da[3],(u16_t)pinBPDU->da[4],(u16_t)pinBPDU->da[5]);
printf("\n SA: %02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->sa[0],(u16_t)pinBPDU->da[1],(u16_t)pinBPDU->sa[2],(u16_t)pinBPDU->sa[3],(u16_t)pinBPDU->sa[4],(u16_t)pinBPDU->sa[5]);
printf("\n DLCLEN:%d",(u16_t)pinBPDU->dlc_len);
printf("\n LLC DSAP:%02X",(u16_t)pinBPDU->llc.dsap);
printf("\n LLC SSAP:%02X",(u16_t)pinBPDU->llc.ssap);
printf("\n LLC ctrl:%02X",(u16_t)pinBPDU->llc.ctrl);
printf("\n STP protocol ID:%04X",(u16_t)pinBPDU->rstp.proid);
printf("\n STP version:%02X",(u16_t)pinBPDU->rstp.version);
printf("\n STP type:%02X",(u16_t)pinBPDU->rstp.type);
#endif
if(pstatus[in_portnum].port_status!=DISABLED)
{
if(Designated_Port_Check(in_portnum))
{
topology_change_detection();
//send tca to the port which TCN from
pstatus[in_portnum].topology_change_acknowledge=1;
transmit_config(in_portnum);
}
}
}
else
{
#ifdef STPPORTINFO
printf("\nBPDU STP_MODE CONFIGURATION_BPDU");
printf("\n DA: %02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->da[0],(u16_t)pinBPDU->da[1],(u16_t)pinBPDU->da[2],(u16_t)pinBPDU->da[3],(u16_t)pinBPDU->da[4],(u16_t)pinBPDU->da[5]);
printf("\n SA: %02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->sa[0],(u16_t)pinBPDU->da[1],(u16_t)pinBPDU->sa[2],(u16_t)pinBPDU->sa[3],(u16_t)pinBPDU->sa[4],(u16_t)pinBPDU->sa[5]);
printf("\n DLCLEN:%d",(u16_t)pinBPDU->dlc_len);
printf("\n LLC DSAP:%02X",(u16_t)pinBPDU->llc.dsap);
printf("\n LLC SSAP:%02X",(u16_t)pinBPDU->llc.ssap);
printf("\n LLC ctrl:%02X",(u16_t)pinBPDU->llc.ctrl);
printf("\n STP protocol ID:%04X",(u16_t)pinBPDU->rstp.proid);
printf("\n STP version:%02X",(u16_t)pinBPDU->rstp.version);
printf("\n STP type:%02X",(u16_t)pinBPDU->rstp.type);
printf("\n STP flags:%02X",(u16_t)pinBPDU->rstp.flags);
printf("\n STP ridp:%04X",(u16_t)pinBPDU->rstp.rootid.priority);
WatchDogTimerReset();
printf("\n Root ID:%02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->rstp.rootid.macid[0],(u16_t)pinBPDU->rstp.rootid.macid[1],(u16_t)pinBPDU->rstp.rootid.macid[2],(u16_t)pinBPDU->rstp.rootid.macid[3],(u16_t)pinBPDU->rstp.rootid.macid[4],(u16_t)pinBPDU->rstp.rootid.macid[5]);
printf("\n STP rpc:%08lX",pinBPDU->rstp.rpc);
printf("\n STP bidp:%04X",(u16_t)pinBPDU->rstp.switchid.priority);
printf("\n Brigde ID:%02X %02X %02X %02X %02X %02X",(u16_t)pinBPDU->rstp.switchid.macid[0],(u16_t)pinBPDU->rstp.switchid.macid[1],(u16_t)pinBPDU->rstp.switchid.macid[2],(u16_t)pinBPDU->rstp.switchid.macid[3],(u16_t)pinBPDU->rstp.switchid.macid[4],(u16_t)pinBPDU->rstp.switchid.macid[5]);
printf("\n STP pidp:%02X",(u16_t)pinBPDU->rstp.port_id.priority);
printf("\n STP pid:%02X",(u16_t)pinBPDU->rstp.port_id.portid);
printf("\n STP msgage:%04X",(u16_t)pinBPDU->rstp.msgage);
printf("\n STP maxage:%04X",(u16_t)pinBPDU->rstp.maxage);
printf("\n STP hellotime:%04X",(u16_t)pinBPDU->rstp.hellotime);
printf("\n STP f_time:%04X",(u16_t)pinBPDU->rstp.f_time);
printf("\n indata port number=%d",(u16_t)in_portnum);
#endif
root_flag=root_bridge();
if(pstatus[in_portnum].port_status!=DISABLED)
{
//WatchDogTimerReset();
stp_result=BPDU_COMPARE_SWITCH(pindata,in_portnum);
if((stp_result==SMALL)||(stp_result==EQUAL))
{
//updata bpdu information to port information
update_bpdu_to_port(pindata,in_portnum);
if(stp_result==SMALL)
{
root_select();//select root and root port
designated_port_selection();//select designated port
//set port state
set_port_state();
}
//************************20080428****************************
if(root_flag&&(!root_bridge()))//i am root before, I'm not root now.
{
if(my_switch_info.STP_RSTP==STP)//20080604 chance
{
my_switch_info.hello_timer.active=0;//chance 20080529
}
//tcn
if(pstatus[my_switch_info.root_port].STP_RSTP==STP)//chance 20080604
{
if(my_switch_info.topology_change_detected)
{
//stop topology change timer
pstatus[in_portnum].porttimer.topology_timer.active=0;
pstatus[in_portnum].porttimer.topology_timer.value=0;
transmit_tcn();//STP TCN
//start tcn timer
my_switch_info.tcn_timer.active=1;//STP TCN
my_switch_info.tcn_timer.value=0;
}
}
}
if(in_portnum==my_switch_info.root_port)//bpdu from root port
{
//record root timer information
my_switch_info.stp_time.MAXAGE_Time=pinBPDU->rstp.maxage;
my_switch_info.stp_time.HELLO_TIME=pinBPDU->rstp.hellotime;
my_switch_info.stp_time.FW_TIME=pinBPDU->rstp.f_time;
bpduflag=pinBPDU->rstp.flags;
if((bpduflag&0x01)==TOPOLOGY_CHANGE_FLAGS)
{
my_switch_info.topology_change_port=in_portnum;
for(i=0;i<26;i++)
{
if((pstatus[i].port_status!=DISABLED)&&
(pstatus[i].port_status!=BLOCK)&&
(i!=in_portnum)
)
{
pstatus[i].topology_change=1;
}
}
//clear mac address table
Reset_LUT();
}
//find the Designated port and generate the new BPDU to send
STP_PACKET.zip_STP_rstp_stp协议_交换机
版权申诉
5 浏览量
2022-09-20
22:33:50
上传
评论
收藏 11KB ZIP 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- 微软常用运行库 游戏运行库 VC++各个版本
- 微信小程序开发教程.pptx
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 锐捷网络认证中心网络管理.pdf
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- SD8233LF是一款用于单按键触摸及接近感应开关,其用途是替代传统的机械型开关芯片IC
- 基于YOLOv5的烟雾火焰检测算法研究
- 基于STM32的联合调试侦听设备解决方案原理图PCB源文件调试工具视频(大赛作品)
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈