Ethernet Bridge development
 help / color / mirror / Atom feed
From: shenry82 <shenry82@voila.fr>
To: bridge@lists.osdl.org
Subject: [Bridge] STP Explanation
Date: Thu, 30 Jun 2005 12:07:41 +0200 (CEST)	[thread overview]
Message-ID: <13229820.1120126061358.JavaMail.www@wwinf4101> (raw)

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 





                 reply	other threads:[~2005-06-30 10:07 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=13229820.1120126061358.JavaMail.www@wwinf4101 \
    --to=shenry82@voila.fr \
    --cc=bridge@lists.osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox