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;
guint32 curr_offset;
guint8 velocity_type, uncertainty_speed = 0;
guint32 velocity_type, uncertainty_speed = 0;
curr_offset = offset;
/* Bit 8 - 5 Velocity Type */
velocity_type = tvb_get_guint8(tvb,curr_offset);
proto_tree_add_item(tree, hf_gsm_a_velocity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
curr_offset++;
proto_tree_add_item_ret_uint(tree, hf_gsm_a_velocity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &velocity_type);
switch (velocity_type) {
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);
curr_offset += 2;
/* 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;
break;
case 1:
@ -1184,17 +1182,17 @@ dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pi
/* Spare bits */
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 */
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. */
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2;
/* 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;
/* 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.
*/
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++;
break;
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);
curr_offset += 2;
/* 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;
/* 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
* 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(tree, hf_gsm_a_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified");
}else{
proto_item_append_text(velocity_item, " km/h");
proto_item_append_text(velocity_item, " (not specified)");
} else {
proto_item_append_text(velocity_item, "km/h");
}
offset++;
curr_offset++;
break;
case 3:
/* 8.15 Coding of Horizontal with Vertical Velocity and Uncertainty */
/* Spare bits */
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 */
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. */
proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN);
curr_offset += 2;
/* 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;
/* 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.
*/
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++;
/* Horizontal Uncertainty Speed Octet 6 */
uncertainty_speed = tvb_get_guint8(tvb,curr_offset);
velocity_item = proto_tree_add_item(tree, hf_gsm_a_h_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_h_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified");
}else{
proto_item_append_text(velocity_item, " km/h");
proto_item_append_text(velocity_item, " (not specified)");
} else {
proto_item_append_text(velocity_item, "km/h");
}
offset++;
curr_offset++;
/* Vertical Uncertainty Speed Octet 7 */
uncertainty_speed = tvb_get_guint8(tvb,curr_offset);
velocity_item = proto_tree_add_item(tree, hf_gsm_a_v_uncertainty_speed, tvb, offset, 1, ENC_BIG_ENDIAN);
velocity_item = proto_tree_add_item_ret_uint(tree, hf_gsm_a_v_uncertainty_speed, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &uncertainty_speed);
if (uncertainty_speed == 255) {
proto_item_append_text(velocity_item, " not specified");
}else{
proto_item_append_text(velocity_item, " km/h");
proto_item_append_text(velocity_item, " (not specified)");
} else {
proto_item_append_text(velocity_item, "km/h");
}
offset++;
curr_offset++;
break;
default:
break;
@ -4759,7 +4753,7 @@ proto_register_gsm_a_common(void)
NULL, HFILL }
},
{ &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,
NULL, HFILL }
},
@ -4795,7 +4789,7 @@ proto_register_gsm_a_common(void)
},
{ &hf_gsm_a_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}
},
{ &hf_gsm_a_geo_loc_D,