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
This commit is contained in:
Jaap Keuter 2008-01-13 11:56:39 +00:00
parent 9463667692
commit e7f4e2d6e5
1 changed files with 88 additions and 3 deletions

View File

@ -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",