rstplib源码分析---快速生成树之端口状态转移状态机

本文主要分析了rstplib库中关于Rapid Spanning Tree Protocol (RSTP) 的端口状态转移状态机。在802.1w和802.1d标准下,交换机芯片提供了不同的API来管理端口状态。对于802.1w,端口有学习和转发两种状态;而对于802.1d,端口有关闭、阻塞、侦听、学习和转发五种状态。状态机包括DISCARDING、LEARNING和FORWARDING三种状态,并根据port->learn和port->forward标志进行状态转换。进入每个状态时,会执行相应端口学习和转发功能的开启或关闭操作。
摘要由CSDN通过智能技术生成

1 源码

   rstplib.1.1.02/sttrans.c,sttrans.h。

2 代码简析

802.1w标准对应RSTP,802.1d标准对应STP,针对802.1w和802.1d标准,交换机芯片硬件一般提供不同形式的API:

(1) 802.1w:对于某个端口定义“学习”、“转发”两种状态的使能和禁止,对于“丢弃”状态,将“学习”和“转发”状态同时禁止即可;

#ifdef STRONGLY_SPEC_802_1W

static Bool disableLearning (STATE_MACH_T *this)

{

  register PORT_T *port = this->owner.port;

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

}

static Bool disableLearning (STATE_MACH_T *this) { }

static Bool enableLearning (STATE_MACH_T *this) { }

static Bool disableForwarding (STATE_MACH_T *this) { }

static Bool enableForwarding (STATE_MACH_T *this) { }

#endif

(2) 802.1d:对于某个端口定义“关闭”、“阻塞”、“侦听”、“学习”、“转发”5种状态,提供2个比特,映射到5种状态,其中“关闭”、“阻塞”、“侦听”一般可应用为“丢弃”。

typedef enum {

  UID_PORT_DISABLED = 0,

  UID_PORT_DISCARDING,

  UID_PORT_LEARNING,

  UID_PORT_FORWARDING,

  UID_PORT_NON_STP

} RSTP_PORT_STATE;

STP_OUT_set_port_state(port->port_index, port->owner->vlan_id, UID_PORT_DISCARDING);

 

此状态机包含以下三态:

#define STATES {            /

  CHOOSE(DISCARDING),   /

  CHOOSE(LEARNING),     /

  CHOOSE(FORWARDING),  /

}

初始化进入DISCARDING状态,各状态之间根据当前状态结合port->learn、port->forward标识进行倒换(STP_sttrans_check_conditions( )),进入某状态后都有固定的动作(STP_sttrans_enter_state( )),这里主要是打开关闭端口的学习和转发功能。

 

/* 状态执行动作 */

void STP_sttrans_enter_state (STATE_MACH_T *this)

{

  register PORT_T    *port = this->owner.port;

  switch (this->State) {

    case BEGIN:

    case DISCARDING:

      port->learning = False;

      port->forwarding = False; // 更新标识

#ifdef STRONGLY_SPEC_802_1W // 802.1w

      disableLearning (this);

      disableForwarding (this); // 禁止学习和转发,效果上即执行“丢弃”

#else                          // 802.1d

      STP_OUT_set_port_state (port->port_index, port->owner->vlan_id, UID_PORT_DISCARDING); // 将端口状态设为“丢弃”

#endif

      break;

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值