rstplib源码分析---快速生成树之优先级向量

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(数值比较),那么就说X比Y好,或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 ->prio,6字节: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)

{

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值