diff options
author | Kristian Høgsberg <krh@redhat.com> | 2006-11-22 12:00:15 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2006-11-22 12:00:15 -0500 |
commit | 37b3aa3f985bad56a582f007412d248e21d92816 (patch) | |
tree | c5e14cf4c1d43234fdd6dfaf59b3e11f9ce0207d | |
parent | 6a54efc71097c48157e89508b416c918c5f43cb8 (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.c | 26 |
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) |