快速生成樹之端口角色選擇狀態機

1 源碼

   rstplib.1.1.02/rolesel.c, rolesel.h

2 功能

   每個網橋擁有一個端口角色選擇狀態機,負責爲每個端口分配角色。

3 端口角色

RSTP中端口角色有如下幾種:根端口、指定端口、可選端口、備份端口、棄用端口。

端口角色的分配由以下因素決定:

a) 每個網橋的唯一網橋ID(BridgeIdentifier);

b) 每個網橋端口的路徑代價(PortPathCost);

c) 每個網橋端口的端口ID(portId)。

3.1 基礎概念:

根網橋:所有網橋中網橋ID最小的那個網橋是該橋接LAN的根網橋。

路徑代價:幀經過該端口要花費的代價是該端口的路徑代價(可配置)。

根路徑代價(網橋):從根網橋到該網橋的最小代價路徑中,所有接收幀的端口(即根端口)的路徑代價之和是該網橋的根路徑代價,根網橋的根路徑代價爲0。

指定網橋(LAN):接在LAN上的所有網橋中根路徑代價最小的那個網橋是該LAN的指定網橋。

根路徑代價(LAN): LAN的根路徑代價等於該LAN的指定網橋的根路徑代價

3.2 端口角色概念:

根端口(網橋):從到根網橋的最小代價路徑接收幀的那個端口就是該網橋的根端口,根端口提供了到達根網橋的一條最優路徑。

指定端口(LAN):將LAN連到指定網橋的端口是該LAN的指定端口。

備份端口:如果一個網橋是一個LAN的指定網橋,那麼除了指定端口外,該網橋的所有接在該LAN上的可工作端口都是備份端口,備份端口是指定端口的一個備份。

可選端口:如果一個端口是可工作的,並且它不是根端口、指定端口或備份端口,那麼它就是可選端口,可選端口提供了到達根網橋的另一條可選路徑。

棄用端口(可配置):如果該端口是不可工作的(MAC_Operational==FALSE),那麼該端口是棄用端口。

當橋接LAN的拓撲結構穩定後:每個LAN僅有一個指定端口,除了根網橋外每個網橋只有一個根端口。

4 代碼簡析

4.1 狀態定義

#define STATES { /

  /* 初始化進入INIT_BRIDGE狀態 */

  CHOOSE(INIT_BRIDGE),      /        

  /* 計算端口角色併爲每個端口分配角色,如果在計算過程中任一端口的reselect又被置位,那麼計算過程立刻將重新開始 */

  CHOOSE(ROLE_SELECTION),   /   

}

4.2 STP_rolesel_enter_state

負責執行切換到某角色後的固定動作。

void STP_rolesel_enter_state (STATE_MACH_T* this)

{

  STPM_T* stpm;

  stpm = this->owner.stpm; // 指向所屬網橋

  switch (this->State) {

    case BEGIN:

    case INIT_BRIDGE:

      updtRoleDisableBridge (stpm); // 使本網橋所有端口的selectedRole = DisabledPort

      break;

    case ROLE_SELECTION:

      clearReselectBridge (stpm); // 使本網橋所有端口的reselect = FALSE

      updtRolesBridge (this); // 爲本網橋所有端口分配角色

      setSelectedBridge (stpm); // 當本網橋所有端口的reselect == FALSE時,使本網橋所有端口的selected = TRUE

      break;

  }

}

selectedRole:選擇的角色,端口角色選擇狀態機爲本端口新選擇的角色。

reselect:重選端口角色信號,=TRUE:當rcvBpdu()返回SuperiorDesignatedMsg時或infoIs == Disabled或infoIs == Aged。

selected:角色選擇完成標誌。

4.3 STP_rolesel_check_conditions

檢查倒換條件並進行狀態倒換。

Bool STP_rolesel_check_conditions (STATE_MACH_T* s)

{

  STPM_T* stpm;

  register PORT_T* port;

  switch (s->State) {

    /* BEGIN -> INIT_BRIDGE -> ROLE_SELECTION 皆爲無條件倒換 */

    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;

   /* 遍歷此網橋的所有端口,如果在計算角色過程中任一端口的reselect又被置位,那麼計算過程立刻將重新開始,

    * 即 重新切換到ROLE_SELECTION

    */

      for (port = stpm->ports; port; port = port->next) {

        if (port->reselect) {

          return STP_hop_2_state (s, ROLE_SELECTION);

        }

      }

      break;

  }

  return False;

}

5 狀態機

RSTP-端口角色選擇狀態機


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章