diff options
author | Anders Broman <anders.broman@ericsson.com> | 2006-06-02 16:58:22 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2006-06-02 16:58:22 +0000 |
commit | 770777bd1763b7b3f4e603e4aab5f217ace089c4 (patch) | |
tree | 14e217e320942404b8b9103b2b4272c2b120bc90 /epan | |
parent | a1326954018d68b735cdff469c9186b65644c4b8 (diff) |
dissect_geographical_description updates.
svn path=/trunk/; revision=18318
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_map.c | 75 |
1 files changed, 53 insertions, 22 deletions
diff --git a/epan/dissectors/packet-gsm_map.c b/epan/dissectors/packet-gsm_map.c index ac824fd698..a2b9f57691 100644 --- a/epan/dissectors/packet-gsm_map.c +++ b/epan/dissectors/packet-gsm_map.c @@ -41,6 +41,7 @@ #endif #include <glib.h> +#include <math.h> #include <epan/packet.h> #include <epan/prefs.h> #include <epan/conversation.h> @@ -963,7 +964,7 @@ static int hf_gsm_map_SupportedGADShapes_ellipsoidPointWithAltitudeAndUncertaint static int hf_gsm_map_SupportedGADShapes_ellipsoidArc = -1; /*--- End of included file: packet-gsm_map-hf.c ---*/ -#line 135 "packet-gsm_map-template.c" +#line 136 "packet-gsm_map-template.c" /* Initialize the subtree pointers */ static gint ett_gsm_map = -1; @@ -979,6 +980,7 @@ static gint ett_gsm_map_pdptypenumber = -1; static gint ett_gsm_map_RAIdentity = -1; static gint ett_gsm_map_LAIFixedLength = -1; static gint ett_gsm_map_isdn_address_string = -1; +static gint ett_gsm_map_geo_desc = -1; /*--- Included file: packet-gsm_map-ett.c ---*/ @@ -1381,7 +1383,7 @@ static gint ett_gsm_map_ExtensionContainer = -1; static gint ett_gsm_map_AccessTypePriv = -1; /*--- End of included file: packet-gsm_map-ett.c ---*/ -#line 152 "packet-gsm_map-template.c" +#line 154 "packet-gsm_map-template.c" static dissector_table_t sms_dissector_table; /* SMS TPDU */ static dissector_handle_t data_handle; @@ -1632,10 +1634,17 @@ static const value_string dir_of_alt_vals[] = { void dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){ + proto_item *lat_item, *long_item, *major_item, *minor_item, *alt_item; + /*proto_tree *subtree; */ + guint8 type_of_shape; guint8 no_of_points; int offset = 0; int length; + guint8 value; + guint32 value32; + + /*subtree = proto_item_add_subtree(item, ett_gsm_map_geo_desc);*/ length = tvb_reported_length_remaining(tvb,0); /* Geographical Location @@ -1657,11 +1666,18 @@ dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree * if (length<4) return; proto_tree_add_item(tree, hf_geo_loc_sign_of_lat, tvb, offset, 1, FALSE); - proto_tree_add_item(tree, hf_geo_loc_deg_of_lat, tvb, offset, 3, FALSE); + + value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; + /* convert degrees (X/0x7fffff) * 90 = degrees */ + lat_item = proto_tree_add_item(tree, hf_geo_loc_deg_of_lat, tvb, offset, 3, FALSE); + proto_item_append_text(lat_item,"(%.2f degrees)", (((double)value32/8388607) * 90)); if (length<7) return; offset = offset + 3; - proto_tree_add_item(tree, hf_geo_loc_deg_of_long, tvb, offset, 3, FALSE); + value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; + long_item = proto_tree_add_item(tree, hf_geo_loc_deg_of_long, tvb, offset, 3, FALSE); + /* (X/0xffffff) *360 = degrees */ + proto_item_append_text(long_item,"(%.2f degrees)", (((double)value32/16777215) * 260)); offset = offset + 3; if(type_of_shape==2){ /* Ellipsoid Point with uncertainty Circle */ @@ -1671,14 +1687,26 @@ dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item(tree, hf_geo_loc_uncertainty_code, tvb, offset, 1, FALSE); }else if(type_of_shape==3){ /* Ellipsoid Point with uncertainty Ellipse */ - /* Uncertainty semi-major */ - proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + /* Uncertainty semi-major octet 10 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + major_item = proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + proto_item_append_text(major_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); offset++; - /* Uncertainty semi-minor */ - proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + /* Uncertainty semi-minor Octet 11 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + minor_item = proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + proto_item_append_text(minor_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); offset++; - /* Orientation of major axis */ - proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + /* Orientation of major axis octet 12 + * allowed value from 0-179 to convert + * to actual degrees multiply by 2. + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + proto_tree_add_uint(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); offset++; /* Confidence */ proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); @@ -1697,29 +1725,31 @@ dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree * offset = offset +2; /* Uncertainty semi-major octet 10 * To convert to metres 10*(((1.1)^X)-1) - * - * value = tvb_get_guint8(tvb,offset) - * - * value = 10*(pow(1.1,tvb_get_guint8(tvb,offset))-1); - * proto_tree_add_uint(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, value); */ - proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + value = tvb_get_guint8(tvb,offset)&0x7f; + major_item = proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + proto_item_append_text(major_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); offset++; /* Uncertainty semi-minor Octet 11 * To convert to metres 10*(((1.1)^X)-1) */ - proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + value = tvb_get_guint8(tvb,offset)&0x7f; + minor_item = proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + proto_item_append_text(minor_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); offset++; /* Orientation of major axis octet 12 * allowed value from 0-179 to convert * to actual degrees multiply by 2. */ - proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + value = tvb_get_guint8(tvb,offset)&0x7f; + proto_tree_add_uint(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); offset++; /* Uncertainty Altitude 13 * to convert to metres 45*(((1.025)^X)-1) */ - proto_tree_add_item(tree, hf_geo_loc_uncertainty_altitude, tvb, offset, 1, FALSE); + value = tvb_get_guint8(tvb,offset)&0x7f; + alt_item = proto_tree_add_item(tree, hf_geo_loc_uncertainty_altitude, tvb, offset, 1, FALSE); + proto_item_append_text(alt_item,"(%.1f m)", 45 * (pow(1.025, (double)value) - 1)); offset++; /* Confidence octet 14 */ @@ -14693,7 +14723,7 @@ static void dissect_Component_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree /*--- End of included file: packet-gsm_map-fn.c ---*/ -#line 532 "packet-gsm_map-template.c" +#line 562 "packet-gsm_map-template.c" const value_string gsm_map_opr_code_strings[] = { { 2, "updateLocation" }, @@ -19613,7 +19643,7 @@ void proto_register_gsm_map(void) { "", HFILL }}, /*--- End of included file: packet-gsm_map-hfarr.c ---*/ -#line 2175 "packet-gsm_map-template.c" +#line 2205 "packet-gsm_map-template.c" }; /* List of subtrees */ @@ -19631,6 +19661,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_RAIdentity, &ett_gsm_map_LAIFixedLength, &ett_gsm_map_isdn_address_string, + &ett_gsm_map_geo_desc, /*--- Included file: packet-gsm_map-ettarr.c ---*/ @@ -20033,7 +20064,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_AccessTypePriv, /*--- End of included file: packet-gsm_map-ettarr.c ---*/ -#line 2194 "packet-gsm_map-template.c" +#line 2225 "packet-gsm_map-template.c" }; /* Register protocol */ |