summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-11-22 12:00:15 -0500
committerKristian Høgsberg <krh@redhat.com>2006-11-22 12:00:15 -0500
commit37b3aa3f985bad56a582f007412d248e21d92816 (patch)
treec5e14cf4c1d43234fdd6dfaf59b3e11f9ce0207d
parent6a54efc71097c48157e89508b416c918c5f43cb8 (diff)
Add flag to indicate data length field.
Also, don't overwrite length argument in decode_link_packet() which breaks decoding negative offset fields.
-rw-r--r--nosy-dump.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/nosy-dump.c b/nosy-dump.c
index d139578..03fe664 100644
--- a/nosy-dump.c
+++ b/nosy-dump.c
@@ -495,7 +495,8 @@ struct packet_info {
};
enum {
- PACKET_FIELD_DETAIL = 0x01,
+ PACKET_FIELD_DETAIL = 0x01,
+ PACKET_FIELD_DATA_LENGTH = 0x02
};
struct packet_field {
@@ -548,7 +549,7 @@ struct packet_field read_block_request_fields[] = {
struct packet_field block_response_fields[] = {
COMMON_RESPONSE_FIELDS,
- { "data_length", 96, 16 },
+ { "data_length", 96, 16, PACKET_FIELD_DATA_LENGTH },
{ "extended_tcode", 112, 16 },
{ "crc", 128, 32, PACKET_FIELD_DETAIL },
{ "data", 160, 0 },
@@ -564,7 +565,7 @@ struct packet_field write_quadlet_request_fields[] = {
struct packet_field block_request_fields[] = {
COMMON_REQUEST_FIELDS,
- { "data_length", 96, 16 },
+ { "data_length", 96, 16, PACKET_FIELD_DATA_LENGTH },
{ "extended_tcode", 112, 16 },
{ "crc", 128, 32, PACKET_FIELD_DETAIL },
{ "data", 160, 0 },
@@ -583,7 +584,7 @@ struct packet_field cycle_start_fields[] = {
};
struct packet_field iso_data_fields[] = {
- { "data_length", 0, 16 },
+ { "data_length", 0, 16, PACKET_FIELD_DATA_LENGTH },
{ "tag", 16, 2 },
{ "channel", 18, 6 },
{ "tcode", 24, 4, 0, tcode_names },
@@ -835,6 +836,7 @@ void dump_data(unsigned char *data, int length)
void decode_link_packet(struct link_packet *packet, size_t length)
{
struct packet_info *pi;
+ int data_length = 0;
int i;
pi = &packet_info[packet->common.tcode];
@@ -858,16 +860,9 @@ void decode_link_packet(struct link_packet *packet, size_t length)
printf("%s", f->value_names[bits]);
}
else if (f->width == 0) {
- /* The way I'd like to do this instead is to have a way to
- * specify which of the other fields designate the length of the
- * data field. */
- if (packet->common.tcode == TCODE_ISO_DATA)
- length = packet->iso_data.data_length;
- else
- length = packet->write_block.data_length;
printf("%s=[", f->name);
- dump_data((unsigned char *) packet + (offset / 8 + 4), length);
- printf("] ");
+ dump_data((unsigned char *) packet + (offset / 8 + 4), data_length);
+ printf("]");
}
else {
unsigned long long bits;
@@ -879,13 +874,16 @@ void decode_link_packet(struct link_packet *packet, size_t length)
low_width = f->width - high_width;
bits = get_bits(packet, offset, high_width);
- bits = (bits << low_width) |
+ bits = (bits << low_width) |
get_bits(packet, offset + high_width, low_width);
}
else
bits = get_bits(packet, offset, f->width);
printf("%s=0x%0*llx", f->name, (f->width + 3) / 4, bits);
+
+ if (f->flags & PACKET_FIELD_DATA_LENGTH)
+ data_length = bits;
}
if (i < pi->field_count - 1)