aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2006-06-02 16:58:22 +0000
committerAnders Broman <anders.broman@ericsson.com>2006-06-02 16:58:22 +0000
commit770777bd1763b7b3f4e603e4aab5f217ace089c4 (patch)
tree14e217e320942404b8b9103b2b4272c2b120bc90 /epan
parenta1326954018d68b735cdff469c9186b65644c4b8 (diff)
dissect_geographical_description updates.
svn path=/trunk/; revision=18318
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-gsm_map.c75
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 */