Hi,
I'm trying to modify the stp kernel files in order to implements the
RSTP. I've already modify the bpdu format like this :
------------------------------------------------------------------------------------------------------------------------------------
typedef struct
{
int topo_change = 0;
int proposal = 0;
int port_role[2] = {0,0} ; //role du port ?metteur du BPDU initialis? ?
UNKNOWN
int learning = 0;
int forwarding = 0;
int agreement = 0;
int topo_change_ack = 0;
}bpdu_flag;
typedef struct
{
unsigned char protocol[2]= {0x00,0x00}; // le type unsigned char peut ?tre
assimil? ? un octet
unsigned char version = 0x02; //convention
unsigned char bpdu_type;
} bpdu_header;
typedef struct
{
bpdu_flag flags;
unsigned char root_id[8];
unsigned char root_path_cost[4];
unsigned char bridge_id[8];
unsigned char port_id[2];
unsigned char message_age[2];
unsigned char max_age[2];
unsigned char hello_time[2];
unsigned char forward_delay[2];
} bpdu_body;
typedef struct
{
bpdu_header hdr;
bpdu_body body;
unsigned char ver_1_len[2];// ?
}bpdu;
--------------------------------------------------------------------------------------------------------------------------
but i'm perplex with this following function in br_stp_bpdu.c :
-------------------------------------------------------------------------------------------------------------------------
void br_send_config_bpdu(struct net_bridge_port *p, struct bpdu *bpdu)
{
unsigned char buf[38];
buf[0] = 0x42;
buf[1] = 0x42;
buf[2] = 0x03;
buf[3] = 0;
buf[4] = 0;
buf[5] = 0;
buf[6] = BPDU_TYPE_CONFIG;
buf[7] = (bpdu->topology_change ? 0x01 : 0) |
(bpdu->topology_change_ack ? 0x80 : 0);
buf[8] = bpdu->root.prio[0];
buf[9] = bpdu->root.prio[1];
buf[10] = bpdu->root.addr[0];
buf[11] = bpdu->root.addr[1];
buf[12] = bpdu->root.addr[2];
buf[13] = bpdu->root.addr[3];
buf[14] = bpdu->root.addr[4];
buf[15] = bpdu->root.addr[5];
buf[16] = (bpdu->root_path_cost >> 24) & 0xFF;
buf[17] = (bpdu->root_path_cost >> 16) & 0xFF;
buf[18] = (bpdu->root_path_cost >> 8) & 0xFF;
buf[19] = bpdu->root_path_cost & 0xFF;
buf[20] = bpdu->bridge_id.prio[0];
buf[21] = bpdu->bridge_id.prio[1];
buf[22] = bpdu->bridge_id.addr[0];
buf[23] = bpdu->bridge_id.addr[1];
buf[24] = bpdu->bridge_id.addr[2];
buf[25] = bpdu->bridge_id.addr[3];
buf[26] = bpdu->bridge_id.addr[4];
buf[27] = bpdu->bridge_id.addr[5];
buf[28] = (bpdu->port_id >> 8) & 0xFF;
buf[29] = bpdu->port_id & 0xFF;
br_set_ticks(buf+30, bpdu->message_age);
br_set_ticks(buf+32, bpdu->max_age);
br_set_ticks(buf+34, bpdu->hello_time);
br_set_ticks(buf+36, bpdu->forward_delay);
br_send_bpdu(p, buf, 38);
}
--------------------------------------------------------------------------------
Indeed I don't understand the default value from buffer[0] to buffer[7]
because if I follow my new structure of bpdu i would have :
--------------------------------------------------------------------------------------------------------------------------------
void br_send_config_bpdu(struct net_bridge_port *p, struct bpdu *bpdu)
{
unsigned char buf[42];
buf[0] = bpdu->bpdu_header->protocol[0]; //0x00
buf[1] = bpdu->bpdu_header->protocol[1]; //0x00
buf[2] = bpdu->bpdu_header->version; //0x02
buf[3] = BPDU_TYPE_CONFIG;
buf[4] = bpdu->bpdu_body->flags->topo_change;
buf[5] = bpdu->bpdu_body->flags->proposal;
buf[6] = bpdu->bpdu_body->flags->port_role[0];
buf[7] = bpdu->bpdu_body->flags->port_role[1];
buf[8] = bpdu->bpdu_body->flags->learning;
buf[9] = bpdu->bpdu_body->flags->forwarding;
buf[10] = bpdu->bpdu_body->flags->agreement;
buf[11] = bpdu->bpdu_body->flags->topo_change_ack;
buf[12] = bpdu->root.prio[0];
buf[13] = bpdu->root.prio[1];
buf[14] = bpdu->root.addr[0];
buf[15] = bpdu->root.addr[1];
buf[16] = bpdu->root.addr[2];
buf[17] = bpdu->root.addr[3];
buf[18] = bpdu->root.addr[4];
buf[19] = bpdu->root.addr[5];
buf[20] = (bpdu->root_path_cost >> 24) & 0xFF;
buf[21] = (bpdu->root_path_cost >> 16) & 0xFF;
buf[22] = (bpdu->root_path_cost >> 8) & 0xFF;
buf[23] = bpdu->root_path_cost & 0xFF;
buf[24] = bpdu->bridge_id.prio[0];
buf[25] = bpdu->bridge_id.prio[1];
buf[26] = bpdu->bridge_id.addr[0];
buf[27] = bpdu->bridge_id.addr[1];
buf[28] = bpdu->bridge_id.addr[2];
buf[29] = bpdu->bridge_id.addr[3];
buf[30] = bpdu->bridge_id.addr[4];
buf[31] = bpdu->bridge_id.addr[5];
buf[32] = (bpdu->port_id >> 8) & 0xFF;
buf[33] = bpdu->port_id & 0xFF;
br_set_ticks(buf+34, bpdu->message_age);
br_set_ticks(buf+36, bpdu->max_age);
br_set_ticks(buf+38, bpdu->hello_time);
br_set_ticks(buf+40, bpdu->forward_delay);
br_send_bpdu(p, buf, 42);
}
-------------------------------------------------------------------------------------------------
what do you think of it ?
thanks
Simon Henry
------------------------------------------
Faites un voeu et puis Voila ! www.voila.fr