gsm_a: Fix dissect_description_of_velocity()

Several improvements to dissect_description_of_velocity()
- Velocity Type is first 4 bits, do not increase offset after this
- Direction of Vertical Speed is bit 7
- Only increase curr_offset in this function
This commit is contained in:
Stig Bjørlykke 2021-10-06 14:41:02 +02:00 committed by Wireshark GitLab Utility
parent 4804c1224d
commit d3695f8b53
1 changed files with 27 additions and 33 deletions

View File

@ -1158,14 +1158,12 @@ dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pi
{ {
proto_item *velocity_item; proto_item *velocity_item;
guint32 curr_offset; guint32 curr_offset;
guint8 velocity_type, uncertainty_speed = 0; guint32 velocity_type, uncertainty_speed = 0;
curr_offset = offset; curr_offset = offset;
/* Bit 8 - 5 Velocity Type */ /* Bit 8 - 5 Velocity Type */
velocity_type = tvb_get_guint8(tvb,curr_offset); proto_tree_add_item_ret_uint(tree, hf_gsm_a_velocity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &velocity_type);
proto_tree_add_item(tree, hf_gsm_a_velocity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
switch (velocity_type) { switch (velocity_type) {
case 0: case 0:
@ -1176,7 +1174,7 @@ dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pi
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */
proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
break; break;
case 1: case 1:
@ -1184,17 +1182,17 @@ dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pi
/* Spare bits */ /* Spare bits */
proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN);
/* D: Direction of Vertical Speed */ /* D: Direction of Vertical Speed */
proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_d, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */
proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Vertical Speed Octet 5 /* Vertical Speed Octet 5
* Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1.
*/ */
proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++; curr_offset++;
break; break;
case 2: case 2:
@ -1205,59 +1203,55 @@ dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pi
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */
proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Uncertainty Speed Octet 5 /* Uncertainty Speed Octet 5
* Uncertainty speed is encoded in increments of 1 kilometre per hour using an 8 bit binary coded number N. The value of * Uncertainty speed is encoded in increments of 1 kilometre per hour using an 8 bit binary coded number N. The value of
* N gives the uncertainty speed except for N=255 which indicates that the uncertainty is not specified. * N gives the uncertainty speed except for N=255 which indicates that the uncertainty is not specified.
*/ */
uncertainty_speed = tvb_get_guint8(tvb,curr_offset); velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
velocity_item = proto_tree_add_item(tree, hf_gsm_a_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
if (uncertainty_speed == 255) { if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified"); proto_item_append_text(velocity_item, " (not specified)");
}else{ } else {
proto_item_append_text(velocity_item, " km/h"); proto_item_append_text(velocity_item, "km/h");
} }
offset++; curr_offset++;
break; break;
case 3: case 3:
/* 8.15 Coding of Horizontal with Vertical Velocity and Uncertainty */ /* 8.15 Coding of Horizontal with Vertical Velocity and Uncertainty */
/* Spare bits */ /* Spare bits */
proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN);
/* D: Direction of Vertical Speed */ /* D: Direction of Vertical Speed */
proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_d, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
/* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */
proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
curr_offset += 2; curr_offset += 2;
/* Vertical Speed Octet 5 /* Vertical Speed Octet 5
* Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1.
*/ */
proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
curr_offset++; curr_offset++;
/* Horizontal Uncertainty Speed Octet 6 */ /* Horizontal Uncertainty Speed Octet 6 */
uncertainty_speed = tvb_get_guint8(tvb,curr_offset); velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_h_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
velocity_item = proto_tree_add_item(tree, hf_gsm_a_h_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
if (uncertainty_speed == 255) { if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified"); proto_item_append_text(velocity_item, " (not specified)");
}else{ } else {
proto_item_append_text(velocity_item, " km/h"); proto_item_append_text(velocity_item, "km/h");
} }
offset++; curr_offset++;
/* Vertical Uncertainty Speed Octet 7 */ /* Vertical Uncertainty Speed Octet 7 */
uncertainty_speed = tvb_get_guint8(tvb,curr_offset); velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_v_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
velocity_item = proto_tree_add_item(tree, hf_gsm_a_v_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
if (uncertainty_speed == 255) { if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified"); proto_item_append_text(velocity_item, " (not specified)");
}else{ } else {
proto_item_append_text(velocity_item, " km/h"); proto_item_append_text(velocity_item, "km/h");
} }
offset++; curr_offset++;
break; break;
default: default:
break; break;
@ -4759,7 +4753,7 @@ proto_register_gsm_a_common(void)
NULL, HFILL } NULL, HFILL }
}, },
{ &hf_gsm_a_velocity_type, { &hf_gsm_a_velocity_type,
{ "Number of points", "gsm_a.gad.velocity_type", { "Velocity type", "gsm_a.gad.velocity_type",
FT_UINT8, BASE_DEC, VALS(gsm_a_velocity_type_vals), 0xf0, FT_UINT8, BASE_DEC, VALS(gsm_a_velocity_type_vals), 0xf0,
NULL, HFILL } NULL, HFILL }
}, },
@ -4795,7 +4789,7 @@ proto_register_gsm_a_common(void)
}, },
{ &hf_gsm_a_d, { &hf_gsm_a_d,
{ "Direction of Vertical Speed", "gsm_a.gad.d", { "Direction of Vertical Speed", "gsm_a.gad.d",
FT_BOOLEAN, 8, TFS(&gsm_a_dir_of_ver_speed_vals), 0x08, FT_BOOLEAN, 8, TFS(&gsm_a_dir_of_ver_speed_vals), 0x02,
NULL, HFILL} NULL, HFILL}
}, },
{ &hf_gsm_a_geo_loc_D, { &hf_gsm_a_geo_loc_D,