快速生成樹之優先級向量

1 源碼

   rstplib.1.1.02/vector.c,vector.h

2 功能

   提供生成樹優先級向量的基本操作。

3 代碼簡析

/* 網橋ID每個網橋在橋接LAN中唯一的標識,由優先級和地址兩部分組成,其中優先級可以手動配置*/

typedef struct bridge_id

{

  unsigned short    prio; //網橋優先級

  unsigned char     addr[6]; //網橋地址

} BRIDGE_ID;

/* 網橋ID比較 */

Int STP_VECT_compare_bridge_id (BRIDGE_ID* b1, BRIDGE_ID* b2)

{

  /* 先比較優先級,數字越小,優先級越高 */

  if (b1->prio < b2->prio)

    return -1;

  if (b1->prio > b2->prio)

  return 1;

  /* 相同時再比較地址 */

  return memcmp (b1->addr, b2->addr, 6);

}

/* 端口ID每個網橋獨立分配, 每個端口在當前網橋中的唯一標識 */

typedef unsigned short  PORT_ID;

/* 生成樹優先級向量:RSTP網橋之間通過配置消息來傳遞信息,並通過這些信息分配端* 口角色。這些信息就是生成樹優先級向量。比較規則:如  * 果X<Y(數值比較),那麼就說XY好,或X的優先級比Y高。

 */

typedef struct prio_vector_t {

  BRIDGE_ID root_bridge; // 根網橋ID

  unsigned long root_path_cost; // 發送網橋的根路徑代價

  BRIDGE_ID design_bridge;// 發送網橋ID(該消息是從哪個網橋發來的)

  PORT_ID   design_port; // 發送端口ID(該消息是從發送網橋的哪個端口發來的)

  PORT_ID   bridge_port; // 接收端口ID(該消息是從本網橋哪個端口接收的)

} PRIO_VECTOR_T;

/* 創建生成樹優先級向量,即根據傳參填充各字段 */

void STP_VECT_create (OUT PRIO_VECTOR_T* t,

                 IN BRIDGE_ID* root_br,

                 IN unsigned long root_path_cost,

                 IN BRIDGE_ID* design_bridge,

                 IN PORT_ID design_port,

                 IN PORT_ID bridge_port)

{

}

/* 生成樹優先級向量比較,按字段定義先後順序優先級進行比較,本字段相等則繼續比較下一字段 */

Int STP_VECT_compare_vector (PRIO_VECTOR_T* v1, PRIO_VECTOR_T* v2)

{

  int bridcmp;

  /* 比較根網橋ID,結果非0則返回比較結果,否則繼續 */

  bridcmp = STP_VECT_compare_bridge_id (&v1->root_bridge, &v2->root_bridge);

  if (bridcmp < 0) return bridcmp; // bridcmp < 0

  if (! bridcmp) { // bridcmp == 0

    /* 比較發送網橋的根路徑代價 */

    bridcmp = v1->root_path_cost - v2->root_path_cost;

    if (bridcmp < 0) return bridcmp;

      if (! bridcmp) {// bridcmp == 0

      /* 比較發送網橋ID */

      bridcmp = STP_VECT_compare_bridge_id (&v1->design_bridge, &v2->design_bridge);

      if (bridcmp < 0) return bridcmp;

      if (! bridcmp) {// bridcmp == 0

        /* 比較發送端口ID */

        bridcmp = v1->design_port - v2->design_port;

        if (bridcmp < 0) return bridcmp;

        if (! bridcmp) // bridcmp == 0

          /* 比較接收端口ID */

          return v1->bridge_port - v2->bridge_port;

      }

    }

  }

  return bridcmp; // bridcmp > 0

}

/* BPDU獲取優先級信息 */

void STP_VECT_get_vector (IN BPDU_BODY_T* b, OUT PRIO_VECTOR_T* v)

{

 /* 獲取根網橋ID

  * b->root_id[8] à 2字節:v->root_bridge ->prio6字節:v->root_bridge ->addr

  * 獲取優先級時調用了“stp_vect_get_short( ) -> ntohs( )”,其中ntohs( )完成網絡字節序到* 主機字節序的轉換

  * 是爲了解決不同主機的不同大小端問題。

  */

  stp_vect_get_bridge_id (b->root_id, &v->root_bridge);

  /* 獲取發送網橋的根路徑代價

   * b->root_path_cost [4] -> long -> 主機字節序

   */

  v->root_path_cost = ntohl (*((long*) b->root_path_cost));

   /* 發送網橋ID發送端口ID類似處理,另外接收端口ID即本端口ID,已有*/

  stp_vect_get_bridge_id (b->bridge_id, &v->design_bridge);

  v->design_port = stp_vect_get_short (b->port_id);

}

/* STP_VECT_set_vector( )STP_VECT_get_vector ( )的逆操作,將生成樹優先級信息填充到BPDU相應域*/

void STP_VECT_set_vector (IN PRIO_VECTOR_T* v, OUT BPDU_BODY_T* b)

{

}

 

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