diff options
author | Jaap Keuter <jaap.keuter@xs4all.nl> | 2011-05-07 14:50:36 +0000 |
---|---|---|
committer | Jaap Keuter <jaap.keuter@xs4all.nl> | 2011-05-07 14:50:36 +0000 |
commit | 8428b08b1a11bfebd6a6039362eaa528727ac904 (patch) | |
tree | 92ce2f81f30b32778c2a30cbb6c1911f81aba9c4 /epan | |
parent | fa82fe17a93362cd06f0069842b99eab664d7770 (diff) |
From Jens Osterkamp:
The following patch adds some code to decode the EVB TLV being standardized in
the upcoming IEEE 802.1Qbg draft 0.
svn path=/trunk/; revision=37014
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-lldp.c | 156 | ||||
-rw-r--r-- | epan/oui.h | 1 |
2 files changed, 151 insertions, 6 deletions
diff --git a/epan/dissectors/packet-lldp.c b/epan/dissectors/packet-lldp.c index e1a5c003da..af5699b2b6 100644 --- a/epan/dissectors/packet-lldp.c +++ b/epan/dissectors/packet-lldp.c @@ -80,6 +80,7 @@ static int hf_mgn_obj_id = -1; static int hf_org_spc_oui = -1; static int hf_ieee_802_1_subtype = -1; static int hf_ieee_802_3_subtype = -1; +static int hf_ieee_802_1qbg_subtype = -1; static int hf_media_tlv_subtype = -1; static int hf_profinet_tlv_subtype = -1; static int hf_profinet_class2_port_status = -1; @@ -125,6 +126,7 @@ static gint ett_802_3_flags = -1; static gint ett_802_3_autoneg_advertised = -1; static gint ett_802_3_power = -1; static gint ett_802_3_aggregation = -1; +static gint ett_802_1qbg_capabilities_flags = -1; static gint ett_media_capabilities = -1; static gint ett_profinet_period = -1; static gint ett_cisco_fourwire_tlv = -1; @@ -180,6 +182,7 @@ static const value_string tlv_oui_subtype_vals[] = { { OUI_MEDIA_ENDPOINT, "TIA" }, { OUI_PROFINET, "PROFINET" }, { OUI_CISCO_2, "Cisco" }, + { OUI_IEEE_802_1QBG, "IEEE 802.1Qbg" }, { 0, NULL } }; @@ -217,6 +220,14 @@ static const value_string media_subtypes[] = { { 0, NULL } }; +/* IEEE 802.1Qbg Subtypes */ +static const value_string ieee_802_1qbg_subtypes[] = { + { 0x00, "EVB" }, + { 0x01, "CDCP" }, + { 0, NULL } +}; + + /* Media Class Values */ static const value_string media_class_values[] = { { 0, "Type Not Defined" }, @@ -461,6 +472,13 @@ static const value_string operational_mau_type_values[] = { #define INV_AUTONEG_1000BASE_T 0x4000 /* b1000baseT(14), -- 1000BASE-T half duplex mode */ #define INV_AUTONEG_1000BASE_TFD 0x8000 /* b1000baseTFD(15) -- 1000BASE-T full duplex mode */ +#define EVB_CAPA_STD 0x8000 +#define EVB_CAPA_RR 0x4000 + +#define EVB_CAPA_RTE 0x0004 +#define EVB_CAPA_ECP 0x0002 +#define EVB_CAPA_VDP 0x0001 + #define MAX_MAC_LEN 6 @@ -1339,6 +1357,121 @@ dissect_ieee_802_1_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, return; } +/* Dissect IEEE 802.1Qbg TLVs */ +static void +dissect_ieee_802_1qbg_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset) +{ + guint8 subType; + guint8 tempByte; + guint16 tempShort; + guint32 tempOffset = offset; + + proto_tree *evb_capabilities_subtree = NULL; + + proto_item *tf = NULL; + + subType = tvb_get_guint8(tvb, tempOffset); + + if (tree) + proto_tree_add_item(tree, hf_ieee_802_1qbg_subtype, tvb, tempOffset, 1, FALSE); + + tempOffset++; + + switch (subType) { + case 0x00: + /* Get EVB capabilities */ + tempShort = tvb_get_ntohs(tvb, tempOffset); + if (tree) { + tf = proto_tree_add_text(tree, tvb, tempOffset, 2, "supported capabilities: 0x%04X", tempShort); + evb_capabilities_subtree = proto_item_add_subtree(tf, ett_802_1qbg_capabilities_flags); + + if (tempShort & EVB_CAPA_STD) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_STD, + 16, "standard bridging (STD)", "")); + + if (tempShort & EVB_CAPA_RR) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_RR, + 16, "reflective relay (RR)", "")); + + if (tempShort & EVB_CAPA_RTE) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_RTE, + 16, "retransmission timer exponent (RTE)", "")); + + if (tempShort & EVB_CAPA_ECP) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_ECP, + 16, "edge control protocol (ECP)", "")); + + if (tempShort & EVB_CAPA_VDP) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_VDP, + 16, "VSI discovery protocol (VDP)", "")); + } + + tempOffset += 2; + + tempShort = tvb_get_ntohs(tvb, tempOffset); + if (tree) { + tf = proto_tree_add_text(tree, tvb, tempOffset, 2, "configured capabilities: 0x%04X", tempShort); + evb_capabilities_subtree = proto_item_add_subtree(tf, ett_802_1qbg_capabilities_flags); + + if (tempShort & EVB_CAPA_STD) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_STD, + 16, "standard bridging (STD)", "")); + + if (tempShort & EVB_CAPA_RR) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_RR, + 16, "reflective relay (RR)", "")); + + if (tempShort & EVB_CAPA_RTE) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_RTE, + 16, "retransmission timer exponent (RTE)", "")); + + if (tempShort & EVB_CAPA_ECP) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_ECP, + 16, "edge control protocol (ECP)", "")); + + if (tempShort & EVB_CAPA_VDP) + proto_tree_add_text(evb_capabilities_subtree, tvb, (offset+2), 2, "%s", + decode_boolean_bitfield(tempShort, EVB_CAPA_VDP, + 16, "VSI discovery protocol (VDP)", "")); + } + + tempOffset += 2; + + tempShort = tvb_get_ntohs(tvb, tempOffset); + if (tree) { + tf = proto_tree_add_text(tree, tvb, tempOffset, 2, "supported no. of VSIs: %04u", tempShort); + } + + tempOffset += 2; + + tempShort = tvb_get_ntohs(tvb, tempOffset); + if (tree) { + tf = proto_tree_add_text(tree, tvb, tempOffset, 2, "configured no. of VSIs: %04u", tempShort); + } + + tempOffset += 2; + + tempByte= tvb_get_guint8(tvb, tempOffset); + if (tree) { + tf = proto_tree_add_text(tree, tvb, tempOffset, 1, "retransmission timer exponent: %02u", tempByte); + } + + break; + } + + return; +} + + /* Dissect IEEE 802.3 TLVs */ static void dissect_ieee_802_3_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset, guint16 tlvLen) @@ -2505,6 +2638,9 @@ dissect_organizational_specific_tlv(tvbuff_t *tvb, packet_info *pinfo, proto_tre case OUI_CISCO_2: subTypeStr = val_to_str(subType, cisco_subtypes, "Unknown subtype (0x%x)"); break; + case OUI_IEEE_802_1QBG: + subTypeStr = val_to_str(subType, ieee_802_1qbg_subtypes, "Unknown subtype 0x%x"); + break; default: subTypeStr = "Unknown"; break; @@ -2551,6 +2687,9 @@ dissect_organizational_specific_tlv(tvbuff_t *tvb, packet_info *pinfo, proto_tre case OUI_CISCO_2: dissect_cisco_tlv(tvb, pinfo, org_tlv_tree, (offset+5)); break; + case OUI_IEEE_802_1QBG: + dissect_ieee_802_1qbg_tlv(tvb, pinfo, org_tlv_tree, (offset+5)); + break; default: proto_tree_add_item(org_tlv_tree, hf_unknown_subtype, tvb, (offset+5), (guint16) (tempLen-3), FALSE); } @@ -2774,16 +2913,20 @@ proto_register_lldp(void) NULL, 0, NULL, HFILL } }, { &hf_org_spc_oui, - { "Organization Unique Code", "lldp.orgtlv.oui", FT_UINT24, BASE_HEX, - VALS(tlv_oui_subtype_vals), 0x0, NULL, HFILL } + { "Organization Unique Code", "lldp.orgtlv.oui", FT_UINT24, BASE_HEX, + VALS(tlv_oui_subtype_vals), 0x0, NULL, HFILL } }, { &hf_ieee_802_1_subtype, - { "IEEE 802.1 Subtype", "lldp.ieee.802_1.subtype", FT_UINT8, BASE_HEX, - VALS(ieee_802_1_subtypes), 0x0, NULL, HFILL } + { "IEEE 802.1 Subtype", "lldp.ieee.802_1.subtype", FT_UINT8, BASE_HEX, + VALS(ieee_802_1_subtypes), 0x0, NULL, HFILL } }, { &hf_ieee_802_3_subtype, - { "IEEE 802.3 Subtype", "lldp.ieee.802_3.subtype", FT_UINT8, BASE_HEX, - VALS(ieee_802_3_subtypes), 0x0, NULL, HFILL } + { "IEEE 802.3 Subtype", "lldp.ieee.802_3.subtype", FT_UINT8, BASE_HEX, + VALS(ieee_802_3_subtypes), 0x0, NULL, HFILL } + }, + { &hf_ieee_802_1qbg_subtype, + { "IEEE 802.1Qbg Subtype", "lldp.ieee.802_1qbg.subtype", FT_UINT8, BASE_HEX, + VALS(ieee_802_1qbg_subtypes), 0x0, NULL, HFILL } }, { &hf_media_tlv_subtype, { "Media Subtype", "lldp.media.subtype", FT_UINT8, BASE_HEX, @@ -2907,6 +3050,7 @@ proto_register_lldp(void) &ett_802_3_autoneg_advertised, &ett_802_3_power, &ett_802_3_aggregation, + &ett_802_1qbg_capabilities_flags, &ett_media_capabilities, &ett_profinet_period, &ett_cisco_fourwire_tlv diff --git a/epan/oui.h b/epan/oui.h index 52ee84681c..0cc6cf2ba9 100644 --- a/epan/oui.h +++ b/epan/oui.h @@ -60,6 +60,7 @@ #define OUI_SONY_ERICSSON_6 0x0016B8 /* Sony Ericsson Mobile Communications AB */ #define OUI_SONY_ERICSSON_7 0x001813 /* Sony Ericsson Mobile Communications AB */ #define OUI_SONY_ERICSSON_8 0x001963 /* Sony Ericsson Mobile Communications AB */ +#define OUI_IEEE_802_1QBG 0x001B3F /* IEEE 802.1 Qbg */ #define OUI_TURBOCELL 0x0020F6 /* KarlNet, who brought you Turbocell */ #define OUI_CISCOWL 0x004096 /* Cisco Wireless (Aironet) */ #define OUI_MARVELL 0x005043 /* Marvell Semiconductor */ |