diff options
author | Jaap Keuter <jaap.keuter@xs4all.nl> | 2008-01-13 11:56:39 +0000 |
---|---|---|
committer | Jaap Keuter <jaap.keuter@xs4all.nl> | 2008-01-13 11:56:39 +0000 |
commit | e7f4e2d6e5b46a30ed5b1ee091e19d010c4b999d (patch) | |
tree | 87e138d56feed071d16d0a533564ba43b8e0c737 /epan/dissectors/packet-cdp.c | |
parent | 94636676924c132755f0f3bb18eb4ea50bfec885 (diff) |
From Michael Earnhart:
Patch to add cdp Power_request and Power_available fields
This added the support for the 0x0019 and 0x001a power_request and power_available fields.
Submitted patch slightly modified to present summary line and make more robust.
svn path=/trunk/; revision=24074
Diffstat (limited to 'epan/dissectors/packet-cdp.c')
-rw-r--r-- | epan/dissectors/packet-cdp.c | 91 |
1 files changed, 88 insertions, 3 deletions
diff --git a/epan/dissectors/packet-cdp.c b/epan/dissectors/packet-cdp.c index 670d0c38be..8a24c093a5 100644 --- a/epan/dissectors/packet-cdp.c +++ b/epan/dissectors/packet-cdp.c @@ -105,7 +105,10 @@ add_multi_line_string_to_tree(proto_tree *tree, tvbuff_t *tvb, gint start, #define TYPE_SYSTEM_OID 0x0015 /* System OID */ #define TYPE_MANAGEMENT_ADDR 0x0016 /* Management Address(es) */ #define TYPE_LOCATION 0x0017 /* Location */ - +#define TYPE_EXT_PORT_ID 0x0018 /* External Port-ID */ +#define TYPE_POWER_REQUESTED 0x0019 /* Power Requested */ +#define TYPE_POWER_AVAILABLE 0x001a /* Power Available */ +#define TYPE_PORT_UNIDIR 0x001b /* Port Unidirectional */ static const value_string type_vals[] = { { TYPE_DEVICE_ID, "Device ID" }, @@ -130,6 +133,10 @@ static const value_string type_vals[] = { { TYPE_SYSTEM_OID, "System Object ID" }, { TYPE_MANAGEMENT_ADDR, "Management Address" }, { TYPE_LOCATION, "Location" }, + { TYPE_EXT_PORT_ID, "External Port-ID" }, + { TYPE_POWER_REQUESTED, "Power Requested" }, + { TYPE_POWER_AVAILABLE, "Power Available" }, + { TYPE_PORT_UNIDIR, "Port Unidirectional" }, { 0, NULL } }; @@ -153,6 +160,8 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree *tlv_tree; int real_length; guint32 naddresses; + guint32 power_avail_len, power_avail; + guint32 power_req_len, power_req; int addr_length; guint32 ip_addr; vec_t cksum_vec[1]; @@ -578,7 +587,7 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case TYPE_POWER: tlvi = proto_tree_add_text(cdp_tree, tvb, - offset, length, "Power consumption: %u mW", + offset, length, "Power Consumption: %u mW", tvb_get_ntohs(tvb, offset + 4)); tlv_tree = proto_item_add_subtree(tlvi, ett_cdp_tlv); proto_tree_add_uint(tlv_tree, hf_cdp_tlvtype, tvb, @@ -586,7 +595,7 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_uint(tlv_tree, hf_cdp_tlvlength, tvb, offset + TLV_LENGTH, 2, length); proto_tree_add_text(tlv_tree, tvb, offset + 4, - length - 4, "Power consumption: %u mW", + length - 4, "Power Consumption: %u mW", tvb_get_ntohs(tvb, offset + 4)); offset += length; break; @@ -712,6 +721,82 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) break; } + case TYPE_POWER_REQUESTED: + tlvi = proto_tree_add_text(cdp_tree, tvb, + offset, length, "Power Request: "); + tlv_tree = proto_item_add_subtree(tlvi, ett_cdp_tlv); + proto_tree_add_uint(tlv_tree, hf_cdp_tlvtype, tvb, + offset + TLV_TYPE, 2, type); + proto_tree_add_uint(tlv_tree, hf_cdp_tlvlength, tvb, + offset + TLV_LENGTH, 2, length); + proto_tree_add_text(tlv_tree, tvb, offset + 4, + 2, "Request-ID: %u", + tvb_get_ntohs(tvb, offset + 4)); + proto_tree_add_text(tlv_tree, tvb, offset + 6, + 2, "Management-ID: %u", + tvb_get_ntohs(tvb, offset + 6)); + power_req_len = (tvb_get_ntohs(tvb, offset + TLV_LENGTH)) - 8; + /* Move offset to where the list of Power Request Values Exist */ + offset += 8; + while(power_req_len) { + if (power_req_len > 4) { + power_req = tvb_get_ntohl(tvb, offset); + proto_tree_add_text(tlv_tree, tvb, offset, + 4, "Power Requested: %u mW", power_req); + proto_item_append_text(tlvi, "%u mW, ", power_req); + power_req_len -= 4; + offset += 4; + } else { + if (power_req_len == 4) { + power_req = tvb_get_ntohl(tvb, offset); + proto_tree_add_text(tlv_tree, tvb, offset, + 4, "Power Requested: %u mW", power_req); + proto_item_append_text(tlvi, "%u mW", power_req); + } + offset += power_req_len; + break; + } + } + break; + + case TYPE_POWER_AVAILABLE: + tlvi = proto_tree_add_text(cdp_tree, tvb, + offset, length, "Power Available: "); + tlv_tree = proto_item_add_subtree(tlvi, ett_cdp_tlv); + proto_tree_add_uint(tlv_tree, hf_cdp_tlvtype, tvb, + offset + TLV_TYPE, 2, type); + proto_tree_add_uint(tlv_tree, hf_cdp_tlvlength, tvb, + offset + TLV_LENGTH, 2, length); + proto_tree_add_text(tlv_tree, tvb, offset + 4, + 2, "Request-ID: %u", + tvb_get_ntohs(tvb, offset + 4)); + proto_tree_add_text(tlv_tree, tvb, offset + 6, + 2, "Management-ID: %u", + tvb_get_ntohs(tvb, offset + 6)); + power_avail_len = (tvb_get_ntohs(tvb, offset + TLV_LENGTH)) - 8; + /* Move offset to where the list of Power Available Values Exist */ + offset += 8; + while(power_avail_len) { + if (power_avail_len > 4) { + power_avail = tvb_get_ntohl(tvb, offset); + proto_tree_add_text(tlv_tree, tvb, offset, + 4, "Power Available: %u mW", power_avail); + proto_item_append_text(tlvi, "%u mW, ", power_avail); + power_avail_len -= 4; + offset += 4; + } else { + if (power_avail_len == 4) { + power_avail = tvb_get_ntohl(tvb, offset); + proto_tree_add_text(tlv_tree, tvb, offset, + 4, "Power Available: %u mW", power_avail); + proto_item_append_text(tlvi, "%u mW", power_avail); + } + offset += power_avail_len; + break; + } + } + break; + default: tlvi = proto_tree_add_text(cdp_tree, tvb, offset, length, "Type: %s, length: %u", |