快速生成树之优先级向量
来源:互联网 发布:淘宝怎么看产品展现量 编辑:程序博客网 时间:2024/06/06 03:44
1 源码
rstplib.1.1.02/vector.c,vector.h
2 功能
提供生成树优先级向量的基本操作。
3 代码简析
/* 网桥ID:每个网桥在桥接LAN中唯一的标识,由优先级和地址两部分组成,其中优先级可以手动配置*/
typedef structbridge_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)
return1;
/* 相同时再比较地址*/
return memcmp (b1->addr, b2->addr, 6);
}
/* 端口ID:每个网桥独立分配, 每个端口在当前网桥中的唯一标识*/
typedef unsignedshort PORT_ID;
/* 生成树优先级向量:RSTP网桥之间通过配置消息来传递信息,并通过这些信息分配端* 口角色。这些信息就是生成树优先级向量。比较规则:如 * 果X<Y(数值比较),那么就说X比Y好,或X的优先级比Y高。
*/
typedef structprio_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 longroot_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)
{
…
}
- 快速生成树之优先级向量
- rstplib源码分析---快速生成树之优先级向量
- 快速生成树之端口信息状态机
- 快速生成树之通用状态机
- 快速生成树之时间信息
- 快速生成树之拓扑变化状态机
- HDU --- 4305 Lighting 【生成树计数 + 向量 】
- C语言运算符优先级 之 快速记忆
- c语言之运算符的优先级快速记忆
- C语言运算符优先级 之 快速记忆
- C语言运算符优先级 之 快速记忆
- C语言运算符优先级 之 快速记忆
- Spark中组件Mllib的学习12之密集向量和稀疏向量的生成
- 快速生成树之端口角色选择状态机
- 快速生成树之端口角色转移状态机
- 快速生成树之端口状态转移状态机
- rstplib源码分析---快速生成树之端口信息状态机
- rstplib源码分析---快速生成树之拓扑变化状态机
- session失效的一些整理
- C# 字符串格式化
- SQL2000操作类
- typedef的四个用途和两个陷阱
- 触发器示例 2
- 快速生成树之优先级向量
- File文件操作 大集合
- 求一个英文字符的前置字符
- TCPDump使用方法小结
- 分拆列值1
- 把Iphone 变成 拨号猫
- 一个组合问题
- 递归和尾递归
- TCPdump Quick Intro Guide