1 源码
rstplib.1.1.02/vector.c,vector.h
2 功能
提供生成树优先级向量的基本操作。
3 代码简析
typedef struct bridge_id
{
unsigned short prio; //网桥优先级
unsigned char addr[6]; //网桥地址
} BRIDGE_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);
}
typedef unsigned short PORT_ID;
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;
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
bridcmp = STP_VECT_compare_bridge_id (&v1->design_bridge, &v2->design_bridge);
if (bridcmp < 0) return bridcmp;
if (! bridcmp) {// bridcmp == 0
bridcmp = v1->design_port - v2->design_port;
if (bridcmp < 0) return bridcmp;
if (! bridcmp) // bridcmp == 0
return v1->bridge_port - v2->bridge_port;
}
}
}
return bridcmp; // bridcmp > 0
}
void STP_VECT_get_vector (IN BPDU_BODY_T* b, OUT PRIO_VECTOR_T* v)
{
stp_vect_get_bridge_id (b->root_id, &v->root_bridge);
v->root_path_cost = ntohl (*((long*) b->root_path_cost));
stp_vect_get_bridge_id (b->bridge_id, &v->design_bridge);
v->design_port = stp_vect_get_short (b->port_id);
}
void STP_VECT_set_vector (IN PRIO_VECTOR_T* v, OUT BPDU_BODY_T* b)
{
…
}