Ethereal-dev: [Ethereal-dev] More MSTP extensions
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Clive A Stubbings <eth@xxxxxxxxxxxxxxxx>
Date: Tue, 24 Sep 2002 23:13:27 +0100
Ok, here is the rest of the MSTP (802.1s) support.. This adds decoding of the MST instance records too.. The diff is against the current CVS tree.. Cheers Clive --- packet-bpdu.orig.c Tue Sep 24 23:04:14 2002 +++ packet-bpdu.c Tue Sep 24 23:06:52 2002 @@ -59,10 +59,19 @@ #define BPDU_CIST_INTERNAL_ROOT_PATH_COST 89 #define BPDU_CIST_BRIDGE_IDENTIFIER 93 #define BPDU_CIST_REMAINING_HOPS 101 +#define BPDU_MSTI 102 +#define MSTI_FLAGS 0 +#define MSTI_REGIONAL_ROOT 1 +#define MSTI_INTERNAL_ROOT_PATH_COST 9 +#define MSTI_BRIDGE_IDENTIFIER_PRIORITY 13 +#define MSTI_PORT_IDENTIFIER_PRIORITY 14 +#define MSTI_REMAINING_HOPS 15 #define CONF_BPDU_SIZE 35 #define TC_BPDU_SIZE 4 #define RST_BPDU_SIZE 36 +#define VERSION_3_STATIC_LENGTH 64 +#define MSTI_MESSAGE_SIZE 16 /* Flag bits */ @@ -104,10 +113,17 @@ static int hf_bpdu_cist_internal_root_path_cost = -1; static int hf_bpdu_cist_bridge_identifier_mac = -1; static int hf_bpdu_cist_remaining_hops = -1; +static int hf_bpdu_msti_flags = -1; +static int hf_bpdu_msti_regional_root_mac = -1; +static int hf_bpdu_msti_internal_root_path_cost = -1; +static int hf_bpdu_msti_bridge_identifier_priority = -1; +static int hf_bpdu_msti_port_identifier_priority = -1; +static int hf_bpdu_msti_remaining_hops = -1; static gint ett_bpdu = -1; static gint ett_bpdu_flags = -1; static gint ett_mstp = -1; +static gint ett_msti = -1; static dissector_handle_t gvrp_handle; static dissector_handle_t gmrp_handle; @@ -183,12 +199,18 @@ gchar *cist_bridge_identifier_mac_str; const guint8 *mst_config_name; guint16 mst_config_revision_level; - guint8 cist_remaining_hops; + guint8 cist_remaining_hops, msti_remaining_hops; + guint32 msti_internal_root_path_cost; + guint32 msti_regional_root_mstid, msti_regional_root_priority; + const guint8 *msti_regional_root_mac; + gchar *msti_regional_root_mac_str; + guint8 msti_bridge_identifier_priority, msti_port_identifier_priority; + int length, offset, msti; proto_tree *bpdu_tree; - proto_tree *mstp_tree; + proto_tree *mstp_tree, *msti_tree; proto_item *bpdu_item; - proto_item *mstp_item; + proto_item *mstp_item, *msti_item; proto_tree *flags_tree; proto_item *flags_item; guint8 rstp_bpdu, mstp_bpdu=0; @@ -489,8 +511,77 @@ proto_tree_add_uint(mstp_tree, hf_bpdu_cist_remaining_hops, tvb, BPDU_CIST_REMAINING_HOPS, 1, cist_remaining_hops); - /* TODO: MSTI messages */ - + /* MSTI messages */ + length = version_3_length - VERSION_3_STATIC_LENGTH; + offset = BPDU_MSTI; + msti = 1; + while (length >= MSTI_MESSAGE_SIZE) { + msti_regional_root_mstid = tvb_get_guint8(tvb, offset+ MSTI_REGIONAL_ROOT); + msti_regional_root_priority = (msti_regional_root_mstid &0xf0) << 8; + msti_regional_root_mstid = ((msti_regional_root_mstid & 0x0f) << 8) + + tvb_get_guint8(tvb, offset+ MSTI_REGIONAL_ROOT+1);; + msti_regional_root_mac = tvb_get_ptr(tvb, offset+ MSTI_REGIONAL_ROOT + 2, 6); + msti_regional_root_mac_str = ether_to_str(msti_regional_root_mac); + + msti_item = proto_tree_add_text(mstp_tree, tvb, offset, 16, + "MSTID %d, Regional Root Identifier %d / %s", + msti_regional_root_mstid, msti_regional_root_priority, + msti_regional_root_mac_str); + msti_tree = proto_item_add_subtree(msti_item, ett_msti); + + /* flags */ + flags_item = proto_tree_add_uint(msti_tree, hf_bpdu_msti_flags, tvb, + offset+MSTI_FLAGS, 1, flags); + + sep = initial_sep; + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_TCACK, flags_item, "%sMaster"); + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_AGREEMENT, flags_item, "%sAgreement"); + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_FORWARDING, flags_item, "%sForwarding"); + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_LEARNING, flags_item, "%sLearning"); + if (flags_item) { + guint8 port_role; + port_role = (flags & BPDU_FLAGS_PORT_ROLE_MASK) >> BPDU_FLAGS_PORT_ROLE_SHIFT; + proto_item_append_text(flags_item, "%sPort Role: %s", sep, + val_to_str(port_role, role_vals, "Unknown (%u)")); + } + sep = cont_sep; + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_PROPOSAL, flags_item, "%sProposal"); + APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_TC, flags_item, "%sTopology Change"); + if (sep != initial_sep) { /* We put something in; put in the terminating ")" */ + proto_item_append_text(flags_item, ")"); + } + + /* pri, MSTID, Regional root */ + proto_tree_add_ether_hidden(msti_tree, hf_bpdu_msti_regional_root_mac, tvb, + offset + MSTI_REGIONAL_ROOT + 2, 6, + msti_regional_root_mac); + proto_tree_add_text(msti_tree, tvb, offset + MSTI_REGIONAL_ROOT, 8, + "MSTID %d, priority %d Root Identifier %s", + msti_regional_root_mstid, msti_regional_root_priority, + msti_regional_root_mac_str); + + + msti_internal_root_path_cost = tvb_get_ntohs(tvb, offset+MSTI_INTERNAL_ROOT_PATH_COST); + proto_tree_add_uint(msti_tree, hf_bpdu_msti_internal_root_path_cost, tvb, + offset+MSTI_INTERNAL_ROOT_PATH_COST, 4, msti_internal_root_path_cost); + + msti_bridge_identifier_priority = tvb_get_guint8(tvb, offset+MSTI_BRIDGE_IDENTIFIER_PRIORITY) >> 4; + msti_port_identifier_priority = tvb_get_guint8(tvb, offset+MSTI_PORT_IDENTIFIER_PRIORITY) >> 4; + + proto_tree_add_uint(msti_tree, hf_bpdu_msti_bridge_identifier_priority, tvb, + offset+MSTI_BRIDGE_IDENTIFIER_PRIORITY, 1, msti_bridge_identifier_priority); + proto_tree_add_uint(msti_tree, hf_bpdu_msti_port_identifier_priority, tvb, + offset+MSTI_PORT_IDENTIFIER_PRIORITY, 1, msti_port_identifier_priority); + + msti_remaining_hops = tvb_get_guint8(tvb, offset+MSTI_REMAINING_HOPS); + proto_tree_add_uint(msti_tree, hf_bpdu_msti_remaining_hops, tvb, + offset + MSTI_REMAINING_HOPS, 1, msti_remaining_hops); + + length -= MSTI_MESSAGE_SIZE; + offset += MSTI_MESSAGE_SIZE; + msti++; + } + } } } @@ -586,7 +677,7 @@ FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }}, { &hf_bpdu_version_3_length, - { "Version 3 Length", "mstp.version_3_length", + { "MST Extension, Length", "mstp.version_3_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, { &hf_bpdu_mst_config_format_selector, @@ -617,11 +708,37 @@ { "CIST Remaining hops", "mstp.cist_remaining_hops", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_bpdu_msti_flags, + { "MSTI flags", "mstp.msti.flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + "", HFILL }}, + { &hf_bpdu_msti_regional_root_mac, + { "Regional Root", "mstp.msti.root.hw", + FT_ETHER, BASE_DEC, NULL, 0x0, + "", HFILL }}, + { &hf_bpdu_msti_internal_root_path_cost, + { "Internal root path cost", "mstp.msti.root_cost", + FT_UINT32, BASE_DEC, NULL, 0x0, + "", HFILL }}, + { &hf_bpdu_msti_bridge_identifier_priority, + { "Bridge Identifier Priority", "mstp.msti.bridge_priority", + FT_UINT8, BASE_DEC, NULL, 0x0, + "", HFILL }}, + { &hf_bpdu_msti_port_identifier_priority, + { "Port identifier prority", "mstp.msti.port_priority", + FT_UINT8, BASE_DEC, NULL, 0x0, + "", HFILL }}, + { &hf_bpdu_msti_remaining_hops, + { "Remaining hops", "mstp.msti.remaining_hops", + FT_UINT8, BASE_DEC, NULL, 0x0, + "", HFILL }}, + }; static gint *ett[] = { &ett_bpdu, &ett_bpdu_flags, &ett_mstp, + &ett_msti }; proto_bpdu = proto_register_protocol("Spanning Tree Protocol", "STP", "stp");
- Follow-Ups:
- Re: [Ethereal-dev] More MSTP extensions
- From: Joerg Mayer
- Re: [Ethereal-dev] More MSTP extensions
- Prev by Date: Re: [Ethereal-dev] Request for Change
- Next by Date: Re: [Ethereal-dev] Request for Change
- Previous by thread: [Ethereal-dev] AIM protocol Unknown Channel 5
- Next by thread: Re: [Ethereal-dev] More MSTP extensions
- Index(es):