From 86d8177cc1384ff07b91f2e43579785e2188a664 Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Wed, 17 May 2006 20:09:48 +0000 Subject: Decode Ext-GeographicalInformation. svn path=/trunk/; revision=18182 --- asn1/gsmmap/Makefile.nmake | 2 +- asn1/gsmmap/gsm_map-exp.cnf | 9 + asn1/gsmmap/packet-gsm_map-template.c | 242 ++++++++++++++++++++++++ asn1/gsmmap/packet-gsm_map-template.h | 2 + asn1/rrlp/rrlp.cnf | 8 + epan/dissectors/packet-gsm_map.c | 338 +++++++++++++++++++++++++++++++--- epan/dissectors/packet-gsm_map.h | 6 +- epan/dissectors/packet-rrlp.c | 13 +- 8 files changed, 589 insertions(+), 31 deletions(-) diff --git a/asn1/gsmmap/Makefile.nmake b/asn1/gsmmap/Makefile.nmake index a2aaa4f77c..589ca2cc43 100644 --- a/asn1/gsmmap/Makefile.nmake +++ b/asn1/gsmmap/Makefile.nmake @@ -15,7 +15,7 @@ generate_dissector: $(DISSECTOR_FILES) $(DISSECTOR_FILES): ../../tools/asn2eth.py GSMMAP.asn packet-$(PROTOCOL_NAME)-template.c packet-$(PROTOCOL_NAME)-template.h gsmmap.cnf !IFDEF PYTHON - $(PYTHON) ../../tools/asn2eth.py -X -b -e -p $(PROTOCOL_NAME) -c gsmmap.cnf -s packet-$(PROTOCOL_NAME)-template GSMMAP.asn + $(PYTHON) ../../tools/asn2eth.py -b -e -p $(PROTOCOL_NAME) -c gsmmap.cnf -s packet-$(PROTOCOL_NAME)-template GSMMAP.asn !ELSE @echo Error: You need Python to use asn2eth.py @exit 1 diff --git a/asn1/gsmmap/gsm_map-exp.cnf b/asn1/gsmmap/gsm_map-exp.cnf index 8852269883..d3748efff5 100644 --- a/asn1/gsmmap/gsm_map-exp.cnf +++ b/asn1/gsmmap/gsm_map-exp.cnf @@ -1,3 +1,12 @@ +# Do not modify this file. +# It is created automatically by the ASN.1 to Ethereal dissector compiler +# .\gsm_map-exp.cnf +# ../../tools/asn2eth.py -b -e -p gsm_map -c gsmmap.cnf -s packet-gsm_map-template GSMMAP.asn + +#.MODULE +MAP-Protocol gsm_map +#.END + #.IMPORT_TAG LocalErrorcode BER_CLASS_UNI BER_UNI_TAG_INTEGER SupportedCamelPhases BER_CLASS_UNI BER_UNI_TAG_BITSTRING diff --git a/asn1/gsmmap/packet-gsm_map-template.c b/asn1/gsmmap/packet-gsm_map-template.c index a6c259e18c..a83694468d 100644 --- a/asn1/gsmmap/packet-gsm_map-template.c +++ b/asn1/gsmmap/packet-gsm_map-template.c @@ -113,6 +113,23 @@ static int hf_gsm_map_guaranteed_max_brate_ulink = -1; static int hf_gsm_map_guaranteed_max_brate_dlink = -1; static int hf_gsm_map_GSNAddress_IPv4 = -1; static int hf_gsm_map_GSNAddress_IPv6 = -1; +static int hf_geo_loc_type_of_shape = -1; +static int hf_geo_loc_sign_of_lat = -1; +static int hf_geo_loc_deg_of_lat =-1; +static int hf_geo_loc_deg_of_long =-1; +static int hf_geo_loc_uncertainty_code = -1; +static int hf_geo_loc_uncertainty_semi_major = -1; +static int hf_geo_loc_uncertainty_semi_minor = -1; +static int hf_geo_loc_orientation_of_major_axis = -1; +static int hf_geo_loc_confidence = -1; +static int hf_geo_loc_no_of_points = -1; +static int hf_geo_loc_D = -1; +static int hf_geo_loc_altitude = -1; +static int hf_geo_loc_inner_radius = -1; +static int hf_geo_loc_uncertainty_radius = -1; +static int hf_geo_loc_offset_angle = -1; +static int hf_geo_loc_included_angle = -1; + #include "packet-gsm_map-hf.c" /* Initialize the subtree pointers */ @@ -349,6 +366,151 @@ dissect_gsm_map_ext_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo, proto_tree } +#define ELLIPSOID_POINT 0 + + +/* TS 23 032 Table 2a: Coding of Type of Shape */ +static const value_string type_of_shape_vals[] = { + { ELLIPSOID_POINT, "Ellipsoid Point"}, + { 1, "Ellipsoid point with uncertainty Circle"}, + { 3, "Ellipsoid point with uncertainty Ellipse"}, + { 5, "Polygon"}, + { 8, "Ellipsoid point with altitude"}, + { 9, "Ellipsoid point with altitude and uncertainty Ellipsoid"}, + { 10, "Ellipsoid Arc"}, + { 0, NULL } +}; + +/* 3GPP TS 23.032 7.3.1 */ +static const value_string sign_of_latitude_vals[] = { + { 0, "North"}, + { 1, "South"}, + { 0, NULL } +}; + +static const value_string dir_of_alt_vals[] = { + { 0, "Altitude expresses height"}, + { 1, "Altitude expresses depth"}, + { 0, NULL } +}; + + +void +dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){ + + guint8 type_of_shape; + guint8 no_of_points; + int offset = 0; + int length; + + length = tvb_reported_length_remaining(tvb,0); + /* Geographical Location + * The Location Estimate field is composed of 1 or more octets with an internal structure + * according to section 7 in [23.032]. + */ + proto_tree_add_item(tree, hf_geo_loc_type_of_shape, tvb, 0, 1, FALSE); + if (length<2) + return; + type_of_shape = tvb_get_guint8(tvb,offset)>>4; + switch (type_of_shape){ + case ELLIPSOID_POINT: /* Ellipsoid Point */ + case 2: /* Ellipsoid Point with uncertainty Circle */ + case 3: /* Ellipsoid Point with uncertainty Ellipse */ + case 8: /* Ellipsoid Point with Altitude */ + case 9: /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + case 10: /* Ellipsoid Arc */ + offset++; + 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); + if (length<7) + return; + offset = offset + 3; + proto_tree_add_item(tree, hf_geo_loc_deg_of_long, tvb, offset, 3, FALSE); + offset = offset + 3; + if(type_of_shape==2){ + /* Ellipsoid Point with uncertainty Circle */ + if (length<8) + return; + /* Uncertainty code */ + 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); + offset++; + /* Uncertainty semi-minor */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + offset++; + /* Orientation of major axis */ + proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + }else if(type_of_shape==8){ + /* Ellipsoid Point with Altitude */ + offset++; + /*D: Direction of Altitude */ + proto_tree_add_item(tree, hf_geo_loc_D, tvb, offset, 1, FALSE); + /* Altitude */ + proto_tree_add_item(tree, hf_geo_loc_altitude, tvb, offset, 2, FALSE); + }else if(type_of_shape==9){ + /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + offset++; + /*D: Direction of Altitude */ + proto_tree_add_item(tree, hf_geo_loc_D, tvb, offset, 1, FALSE); + /* Altitude */ + proto_tree_add_item(tree, hf_geo_loc_altitude, tvb, offset, 2, FALSE); + offset++; + /* Uncertainty semi-major */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + offset++; + /* Uncertainty semi-minor */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + offset++; + /* Orientation of major axis */ + proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + }else if(type_of_shape==10){ + /* Ellipsoid Arc */ + offset++; + /* Inner radius */ + proto_tree_add_item(tree, hf_geo_loc_inner_radius, tvb, offset, 2, FALSE); + offset= offset +2; + /* Uncertainty radius */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_radius, tvb, offset, 1, FALSE); + offset++; + /* Offset angle */ + proto_tree_add_item(tree, hf_geo_loc_offset_angle, tvb, offset, 1, FALSE); + offset++; + /* Included angle */ + proto_tree_add_item(tree, hf_geo_loc_included_angle, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + } + + break; + case 5: /* Polygon */ + /* Number of points */ + no_of_points = tvb_get_guint8(tvb,offset)&0x0f; + proto_tree_add_item(tree, hf_geo_loc_no_of_points, tvb, offset, 1, FALSE); + /* + while ( no_of_points > 0){ + offset++; + + no_of_points--; + } + */ + break; + default: + break; + } + +} #include "packet-gsm_map-fn.c" const value_string gsm_map_opr_code_strings[] = { @@ -1906,6 +2068,86 @@ void proto_register_gsm_map(void) { { "GSN Address IPv6", "gsm_map.gsnaddress_ipv6", FT_IPv4, BASE_NONE, NULL, 0, "IPAddress IPv6", HFILL }}, + { &hf_geo_loc_type_of_shape, + { "Location estimate","gad.location_estimate", + FT_UINT8,BASE_DEC, VALS(type_of_shape_vals), 0xf0, + "Location estimate", HFILL } + }, + { &hf_geo_loc_sign_of_lat, + { "Sign of latitude","gad.sign_of_latitude", + FT_UINT8,BASE_DEC, VALS(sign_of_latitude_vals), 0x80, + "Sign of latitude", HFILL } + }, + { &hf_geo_loc_deg_of_lat, + { "Degrees of latitude","gad.sign_of_latitude", + FT_UINT32,BASE_DEC, NULL, 0x3fffff, + "Degrees of latitude", HFILL } + }, + { &hf_geo_loc_deg_of_long, + { "Degrees of longitude","gad.sign_of_longitude", + FT_UINT32,BASE_DEC, NULL, 0xffffff, + "Degrees of longitude", HFILL } + }, + { &hf_geo_loc_uncertainty_code, + { "Uncertainty code","gad.uncertainty_code", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty code", HFILL } + }, + { &hf_geo_loc_uncertainty_semi_major, + { "Uncertainty semi-major","gad.uncertainty_semi_major", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty semi-majore", HFILL } + }, + { &hf_geo_loc_uncertainty_semi_minor, + { "Uncertainty semi-minor","gad.uncertainty_semi_minor", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty semi-minor", HFILL } + }, + { &hf_geo_loc_orientation_of_major_axis, + { "Orientation of major axis","gad.orientation_of_major_axis", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Orientation of major axis", HFILL } + }, + { &hf_geo_loc_confidence, + { "Confidence","gad.confidence", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Confidence", HFILL } + }, + { &hf_geo_loc_no_of_points, + { "Number of points","gad.no_of_points", + FT_UINT8,BASE_DEC, NULL, 0x0f, + "Number of points", HFILL } + }, + { &hf_geo_loc_D, + { "D: Direction of Altitude","gad.D", + FT_UINT8,BASE_DEC, VALS(dir_of_alt_vals), 0x8000, + "D: Direction of Altitude", HFILL } + }, + { &hf_geo_loc_altitude, + { "Altitude","gad.altitude", + FT_UINT16,BASE_DEC, NULL, 0x7fff, + "Altitude", HFILL } + }, + { &hf_geo_loc_inner_radius, + { "Inner radius","gad.altitude", + FT_UINT16,BASE_DEC, NULL, 0x0, + "Inner radius", HFILL } + }, + { &hf_geo_loc_uncertainty_radius, + { "Uncertainty radius","gad.no_of_points", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty radius", HFILL } + }, + { &hf_geo_loc_offset_angle, + { "Offset angle","gad.offset_angle", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Offset angle", HFILL } + }, + { &hf_geo_loc_included_angle, + { "Included angle","gad.included_angle", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Included angle", HFILL } + }, #include "packet-gsm_map-hfarr.c" }; diff --git a/asn1/gsmmap/packet-gsm_map-template.h b/asn1/gsmmap/packet-gsm_map-template.h index 4892d378ab..31bcbff8f0 100644 --- a/asn1/gsmmap/packet-gsm_map-template.h +++ b/asn1/gsmmap/packet-gsm_map-template.h @@ -38,6 +38,8 @@ typedef struct _gsm_map_tap_rec_t { ETH_VAR_IMPORT const value_string gsm_map_opr_code_strings[]; char* unpack_digits(tvbuff_t *tvb, int offset); +void dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + extern const value_string ssCode_vals[]; extern const value_string gsm_map_PDP_Type_Organisation_vals[]; extern const value_string gsm_map_ietf_defined_pdp_vals[]; diff --git a/asn1/rrlp/rrlp.cnf b/asn1/rrlp/rrlp.cnf index d04d92f83d..7c93c8a0ea 100644 --- a/asn1/rrlp/rrlp.cnf +++ b/asn1/rrlp/rrlp.cnf @@ -19,3 +19,11 @@ PDU #.END +#.FN_BODY Ext-GeographicalInformation VAL_PTR = ¶meter_tvb + +tvbuff_t *parameter_tvb = NULL; + + %(DEFAULT_BODY)s + + if(parameter_tvb) + dissect_geographical_description(parameter_tvb, pinfo, tree); diff --git a/epan/dissectors/packet-gsm_map.c b/epan/dissectors/packet-gsm_map.c index 722c278b4e..47c8fbd237 100644 --- a/epan/dissectors/packet-gsm_map.c +++ b/epan/dissectors/packet-gsm_map.c @@ -1,7 +1,7 @@ /* Do not modify this file. */ /* It is created automatically by the ASN.1 to Ethereal dissector compiler */ /* .\packet-gsm_map.c */ -/* ../../tools/asn2eth.py -X -b -e -p gsm_map -c gsmmap.cnf -s packet-gsm_map-template GSMMAP.asn */ +/* ../../tools/asn2eth.py -b -e -p gsm_map -c gsmmap.cnf -s packet-gsm_map-template GSMMAP.asn */ /* Input file: packet-gsm_map-template.c */ @@ -55,6 +55,7 @@ #include "packet-gsm_map.h" #include "packet-gsm_a.h" #include "packet-tcap.h" +#include "packet-e164.h" #include "packet-e212.h" #include "packet-smpp.h" #include "packet-gsm_sms.h" @@ -120,6 +121,23 @@ static int hf_gsm_map_guaranteed_max_brate_ulink = -1; static int hf_gsm_map_guaranteed_max_brate_dlink = -1; static int hf_gsm_map_GSNAddress_IPv4 = -1; static int hf_gsm_map_GSNAddress_IPv6 = -1; +static int hf_geo_loc_type_of_shape = -1; +static int hf_geo_loc_sign_of_lat = -1; +static int hf_geo_loc_deg_of_lat =-1; +static int hf_geo_loc_deg_of_long =-1; +static int hf_geo_loc_uncertainty_code = -1; +static int hf_geo_loc_uncertainty_semi_major = -1; +static int hf_geo_loc_uncertainty_semi_minor = -1; +static int hf_geo_loc_orientation_of_major_axis = -1; +static int hf_geo_loc_confidence = -1; +static int hf_geo_loc_no_of_points = -1; +static int hf_geo_loc_D = -1; +static int hf_geo_loc_altitude = -1; +static int hf_geo_loc_inner_radius = -1; +static int hf_geo_loc_uncertainty_radius = -1; +static int hf_geo_loc_offset_angle = -1; +static int hf_geo_loc_included_angle = -1; + /*--- Included file: packet-gsm_map-hf.c ---*/ #line 1 "packet-gsm_map-hf.c" @@ -944,7 +962,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 116 "packet-gsm_map-template.c" +#line 134 "packet-gsm_map-template.c" /* Initialize the subtree pointers */ static gint ett_gsm_map = -1; @@ -959,6 +977,7 @@ static gint ett_gsm_map_ext_qos_subscribed = -1; 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; /*--- Included file: packet-gsm_map-ett.c ---*/ @@ -1361,7 +1380,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 132 "packet-gsm_map-template.c" +#line 151 "packet-gsm_map-template.c" static dissector_table_t sms_dissector_table; /* SMS TPDU */ static dissector_handle_t data_handle; @@ -1580,6 +1599,151 @@ dissect_gsm_map_ext_qos_subscribed(tvbuff_t *tvb, packet_info *pinfo, proto_tree } +#define ELLIPSOID_POINT 0 + + +/* TS 23 032 Table 2a: Coding of Type of Shape */ +static const value_string type_of_shape_vals[] = { + { ELLIPSOID_POINT, "Ellipsoid Point"}, + { 1, "Ellipsoid point with uncertainty Circle"}, + { 3, "Ellipsoid point with uncertainty Ellipse"}, + { 5, "Polygon"}, + { 8, "Ellipsoid point with altitude"}, + { 9, "Ellipsoid point with altitude and uncertainty Ellipsoid"}, + { 10, "Ellipsoid Arc"}, + { 0, NULL } +}; + +/* 3GPP TS 23.032 7.3.1 */ +static const value_string sign_of_latitude_vals[] = { + { 0, "North"}, + { 1, "South"}, + { 0, NULL } +}; + +static const value_string dir_of_alt_vals[] = { + { 0, "Altitude expresses height"}, + { 1, "Altitude expresses depth"}, + { 0, NULL } +}; + + +void +dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){ + + guint8 type_of_shape; + guint8 no_of_points; + int offset = 0; + int length; + + length = tvb_reported_length_remaining(tvb,0); + /* Geographical Location + * The Location Estimate field is composed of 1 or more octets with an internal structure + * according to section 7 in [23.032]. + */ + proto_tree_add_item(tree, hf_geo_loc_type_of_shape, tvb, 0, 1, FALSE); + if (length<2) + return; + type_of_shape = tvb_get_guint8(tvb,offset)>>4; + switch (type_of_shape){ + case ELLIPSOID_POINT: /* Ellipsoid Point */ + case 2: /* Ellipsoid Point with uncertainty Circle */ + case 3: /* Ellipsoid Point with uncertainty Ellipse */ + case 8: /* Ellipsoid Point with Altitude */ + case 9: /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + case 10: /* Ellipsoid Arc */ + offset++; + 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); + if (length<7) + return; + offset = offset + 3; + proto_tree_add_item(tree, hf_geo_loc_deg_of_long, tvb, offset, 3, FALSE); + offset = offset + 3; + if(type_of_shape==2){ + /* Ellipsoid Point with uncertainty Circle */ + if (length<8) + return; + /* Uncertainty code */ + 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); + offset++; + /* Uncertainty semi-minor */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + offset++; + /* Orientation of major axis */ + proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + }else if(type_of_shape==8){ + /* Ellipsoid Point with Altitude */ + offset++; + /*D: Direction of Altitude */ + proto_tree_add_item(tree, hf_geo_loc_D, tvb, offset, 1, FALSE); + /* Altitude */ + proto_tree_add_item(tree, hf_geo_loc_altitude, tvb, offset, 2, FALSE); + }else if(type_of_shape==9){ + /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + offset++; + /*D: Direction of Altitude */ + proto_tree_add_item(tree, hf_geo_loc_D, tvb, offset, 1, FALSE); + /* Altitude */ + proto_tree_add_item(tree, hf_geo_loc_altitude, tvb, offset, 2, FALSE); + offset++; + /* Uncertainty semi-major */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_major, tvb, offset, 1, FALSE); + offset++; + /* Uncertainty semi-minor */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_semi_minor, tvb, offset, 1, FALSE); + offset++; + /* Orientation of major axis */ + proto_tree_add_item(tree, hf_geo_loc_orientation_of_major_axis, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + }else if(type_of_shape==10){ + /* Ellipsoid Arc */ + offset++; + /* Inner radius */ + proto_tree_add_item(tree, hf_geo_loc_inner_radius, tvb, offset, 2, FALSE); + offset= offset +2; + /* Uncertainty radius */ + proto_tree_add_item(tree, hf_geo_loc_uncertainty_radius, tvb, offset, 1, FALSE); + offset++; + /* Offset angle */ + proto_tree_add_item(tree, hf_geo_loc_offset_angle, tvb, offset, 1, FALSE); + offset++; + /* Included angle */ + proto_tree_add_item(tree, hf_geo_loc_included_angle, tvb, offset, 1, FALSE); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_geo_loc_confidence, tvb, offset, 1, FALSE); + } + + break; + case 5: /* Polygon */ + /* Number of points */ + no_of_points = tvb_get_guint8(tvb,offset)&0x0f; + proto_tree_add_item(tree, hf_geo_loc_no_of_points, tvb, offset, 1, FALSE); + /* + while ( no_of_points > 0){ + offset++; + + no_of_points--; + } + */ + break; + default: + break; + } + +} /*--- Included file: packet-gsm_map-fn.c ---*/ #line 1 "packet-gsm_map-fn.c" @@ -2502,6 +2666,7 @@ static const value_string gsm_map_ProtocolId_vals[] = { { 0, NULL } }; +static guint32 ProtocolId_value_map[4+0] = {1, 2, 3, 4}; static int dissect_gsm_map_ProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -2518,7 +2683,7 @@ static int dissect_protocolId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv static int dissect_gsm_map_SignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 338 "gsmmap.cnf" +#line 366 "gsmmap.cnf" tvbuff_t *parameter_tvb; guint8 octet; @@ -2574,7 +2739,7 @@ static int dissect_diagnosticInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t static int dissect_gsm_map_T_extType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 451 "gsmmap.cnf" +#line 479 "gsmmap.cnf" proto_tree_add_text(tree, tvb, offset, -1, "Extension Data"); @@ -2774,6 +2939,11 @@ dissect_gsm_map_ISDN_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int tvbuff_t *parameter_tvb; char *digit_str; + guint8 octet; + guint8 na; + guint8 np; + proto_item *item; + proto_tree *subtree; offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, ¶meter_tvb); @@ -2782,13 +2952,22 @@ dissect_gsm_map_ISDN_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int if (!parameter_tvb) return offset; - proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); - proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); - proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); + item = get_ber_last_created_item(); + subtree = proto_item_add_subtree(item, ett_gsm_map_isdn_address_string); + + proto_tree_add_item(subtree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); + proto_tree_add_item(subtree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); + proto_tree_add_item(subtree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); digit_str = unpack_digits(parameter_tvb, 1); - proto_tree_add_string(tree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str); + proto_tree_add_string(subtree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str); + + octet = tvb_get_guint8(parameter_tvb,0); + na = (octet & 0x70)>>4; + np = octet & 0x0f; + if ((na == 1) && (np==1))/*International Number & E164*/ + dissect_e164_cc(parameter_tvb, subtree, 1, TRUE); pinfo->p2p_dir = P2P_DIR_RECV; @@ -3082,7 +3261,7 @@ static int dissect_vlr_Capability_impl(packet_info *pinfo, proto_tree *tree, tvb int dissect_gsm_map_GSN_Address(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 535 "gsmmap.cnf" +#line 563 "gsmmap.cnf" tvbuff_t *parameter_tvb; guint8 octet; @@ -3478,7 +3657,7 @@ static int dissect_numberOfRequestedVectors(packet_info *pinfo, proto_tree *tree int dissect_gsm_map_LAIFixedLength(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 583 "gsmmap.cnf" +#line 611 "gsmmap.cnf" tvbuff_t *parameter_tvb; proto_item *item; @@ -3899,6 +4078,7 @@ static const value_string gsm_map_AccessNetworkProtocolId_vals[] = { { 0, NULL } }; +static guint32 AccessNetworkProtocolId_value_map[2+0] = {1, 2}; static int dissect_gsm_map_AccessNetworkProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -3915,7 +4095,7 @@ static int dissect_accessNetworkProtocolId(packet_info *pinfo, proto_tree *tree, static int dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 382 "gsmmap.cnf" +#line 410 "gsmmap.cnf" tvbuff_t *parameter_tvb; guint8 octet; @@ -5158,6 +5338,7 @@ static const value_string gsm_map_BcsmTriggerDetectionPoint_vals[] = { { 0, NULL } }; +static guint32 BcsmTriggerDetectionPoint_value_map[5+0] = {2, 4, 12, 13, 14}; static int dissect_gsm_map_BcsmTriggerDetectionPoint(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -5262,6 +5443,7 @@ static const value_string gsm_map_O_BcsmTriggerDetectionPoint_vals[] = { { 0, NULL } }; +static guint32 O_BcsmTriggerDetectionPoint_value_map[1+1] = {2, 4}; static int dissect_gsm_map_O_BcsmTriggerDetectionPoint(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -5506,7 +5688,7 @@ static int dissect_BasicServiceCriteria_item(packet_info *pinfo, proto_tree *tre static int dissect_gsm_map_Ext_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 300 "gsmmap.cnf" +#line 328 "gsmmap.cnf" /* Note Ext-SS-Status can have more than one byte */ tvbuff_t *parameter_tvb; @@ -5573,7 +5755,7 @@ static int dissect_gsm_map_T_forwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_gsm_map_Ext_ForwOptions(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 470 "gsmmap.cnf" +#line 498 "gsmmap.cnf" proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE); @@ -5604,10 +5786,15 @@ static int dissect_ext_noReplyConditionTime_impl(packet_info *pinfo, proto_tree int dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 250 "gsmmap.cnf" +#line 264 "gsmmap.cnf" tvbuff_t *parameter_tvb; char *digit_str; + guint8 octet; + guint8 na; + guint8 np; + proto_item *item; + proto_tree *subtree; offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, ¶meter_tvb); @@ -5616,6 +5803,9 @@ dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs if (!parameter_tvb) return offset; + item = get_ber_last_created_item(); + subtree = proto_item_add_subtree(item, ett_gsm_map_isdn_address_string); + proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE); @@ -5624,6 +5814,12 @@ dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs proto_tree_add_string(tree, hf_gsm_map_address_digits, parameter_tvb, 1, -1, digit_str); + octet = tvb_get_guint8(parameter_tvb,0); + na = (octet & 0x70)>>4; + np = octet & 0x0f; + if ((na == 1) && (np==1))/*International Number & E164*/ + dissect_e164_cc(parameter_tvb, subtree, 1, TRUE); + return offset; @@ -6547,6 +6743,7 @@ static const value_string gsm_map_SMS_TriggerDetectionPoint_vals[] = { { 0, NULL } }; +static guint32 SMS_TriggerDetectionPoint_value_map[1+1] = {1, 2}; static int dissect_gsm_map_SMS_TriggerDetectionPoint(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -6650,6 +6847,7 @@ static const value_string gsm_map_T_BcsmTriggerDetectionPoint_vals[] = { { 0, NULL } }; +static guint32 T_BcsmTriggerDetectionPoint_value_map[1+2] = {12, 13, 14}; static int dissect_gsm_map_T_BcsmTriggerDetectionPoint(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -7002,7 +7200,7 @@ static int dissect_pdp_ContextIdentifier_impl(packet_info *pinfo, proto_tree *tr static int dissect_gsm_map_PDP_Type(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 481 "gsmmap.cnf" +#line 509 "gsmmap.cnf" guint8 pdp_type_org; tvbuff_t *parameter_tvb; @@ -7051,7 +7249,7 @@ static int dissect_pdp_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff int dissect_gsm_map_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 507 "gsmmap.cnf" +#line 535 "gsmmap.cnf" tvbuff_t *parameter_tvb; @@ -7097,7 +7295,7 @@ static int dissect_lcsAPN_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *t int dissect_gsm_map_Ext_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 521 "gsmmap.cnf" +#line 549 "gsmmap.cnf" tvbuff_t *parameter_tvb; @@ -7764,6 +7962,7 @@ static const value_string gsm_map_GPRS_TriggerDetectionPoint_vals[] = { { 0, NULL } }; +static guint32 GPRS_TriggerDetectionPoint_value_map[5+0] = {1, 2, 11, 12, 14}; static int dissect_gsm_map_GPRS_TriggerDetectionPoint(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -8198,7 +8397,7 @@ dissect_gsm_map_DeleteSubscriberDataRes(gboolean implicit_tag _U_, tvbuff_t *tvb int dissect_gsm_map_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 273 "gsmmap.cnf" +#line 301 "gsmmap.cnf" tvbuff_t *parameter_tvb; guint8 octet; @@ -8327,7 +8526,7 @@ dissect_gsm_map_ForwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, NULL); -#line 464 "gsmmap.cnf" +#line 492 "gsmmap.cnf" proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE); proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE); @@ -8844,6 +9043,7 @@ static const value_string gsm_map_Ext_ProtocolId_vals[] = { { 0, NULL } }; +static guint32 Ext_ProtocolId_value_map[1+0] = {1}; static int dissect_gsm_map_Ext_ProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -9209,7 +9409,7 @@ static int dissect_subscriberState(packet_info *pinfo, proto_tree *tree, tvbuff_ int dissect_gsm_map_RAIdentity(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 565 "gsmmap.cnf" +#line 593 "gsmmap.cnf" tvbuff_t *parameter_tvb; proto_item *item; @@ -9508,6 +9708,7 @@ static const value_string gsm_map_NumberPortabilityStatus_vals[] = { { 0, NULL } }; +static guint32 NumberPortabilityStatus_value_map[3+2] = {0, 1, 2, 4, 5}; static int dissect_gsm_map_NumberPortabilityStatus(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -9618,6 +9819,7 @@ static const value_string gsm_map_UnavailabilityCause_vals[] = { { 0, NULL } }; +static guint32 UnavailabilityCause_value_map[6+0] = {1, 2, 3, 4, 5, 6}; static int dissect_gsm_map_UnavailabilityCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -10553,7 +10755,7 @@ dissect_gsm_map_InterrogateSS_Res(gboolean implicit_tag _U_, tvbuff_t *tvb, int int dissect_gsm_map_USSD_DataCodingScheme(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 414 "gsmmap.cnf" +#line 442 "gsmmap.cnf" guint8 octet; guint8 length; @@ -10581,7 +10783,7 @@ static int dissect_dataCodingScheme_impl(packet_info *pinfo, proto_tree *tree, t int dissect_gsm_map_USSD_String(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 429 "gsmmap.cnf" +#line 457 "gsmmap.cnf" guint8 octet; guint8 length; @@ -13708,6 +13910,7 @@ static const value_string gsm_map_T_roamingNotAllowedCause_vals[] = { { 0, NULL } }; +static guint32 T_roamingNotAllowedCause_value_map[2+0] = {0, 3}; static int dissect_gsm_map_T_roamingNotAllowedCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -14095,6 +14298,7 @@ static const value_string gsm_map_CUG_RejectCause_vals[] = { { 0, NULL } }; +static guint32 CUG_RejectCause_value_map[4+0] = {0, 1, 5, 7}; static int dissect_gsm_map_CUG_RejectCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -14436,6 +14640,7 @@ static const value_string gsm_map_Access_vals[] = { { 0, NULL } }; +static guint32 Access_value_map[3+0] = {1, 2, 3}; static int dissect_gsm_map_Access(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { @@ -14484,7 +14689,7 @@ static void dissect_Component_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree /*--- End of included file: packet-gsm_map-fn.c ---*/ -#line 351 "packet-gsm_map-template.c" +#line 515 "packet-gsm_map-template.c" const value_string gsm_map_opr_code_strings[] = { { 2, "updateLocation" }, @@ -16041,6 +16246,86 @@ void proto_register_gsm_map(void) { { "GSN Address IPv6", "gsm_map.gsnaddress_ipv6", FT_IPv4, BASE_NONE, NULL, 0, "IPAddress IPv6", HFILL }}, + { &hf_geo_loc_type_of_shape, + { "Location estimate","gad.location_estimate", + FT_UINT8,BASE_DEC, VALS(type_of_shape_vals), 0xf0, + "Location estimate", HFILL } + }, + { &hf_geo_loc_sign_of_lat, + { "Sign of latitude","gad.sign_of_latitude", + FT_UINT8,BASE_DEC, VALS(sign_of_latitude_vals), 0x80, + "Sign of latitude", HFILL } + }, + { &hf_geo_loc_deg_of_lat, + { "Degrees of latitude","gad.sign_of_latitude", + FT_UINT32,BASE_DEC, NULL, 0x3fffff, + "Degrees of latitude", HFILL } + }, + { &hf_geo_loc_deg_of_long, + { "Degrees of longitude","gad.sign_of_longitude", + FT_UINT32,BASE_DEC, NULL, 0xffffff, + "Degrees of longitude", HFILL } + }, + { &hf_geo_loc_uncertainty_code, + { "Uncertainty code","gad.uncertainty_code", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty code", HFILL } + }, + { &hf_geo_loc_uncertainty_semi_major, + { "Uncertainty semi-major","gad.uncertainty_semi_major", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty semi-majore", HFILL } + }, + { &hf_geo_loc_uncertainty_semi_minor, + { "Uncertainty semi-minor","gad.uncertainty_semi_minor", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty semi-minor", HFILL } + }, + { &hf_geo_loc_orientation_of_major_axis, + { "Orientation of major axis","gad.orientation_of_major_axis", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Orientation of major axis", HFILL } + }, + { &hf_geo_loc_confidence, + { "Confidence","gad.confidence", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Confidence", HFILL } + }, + { &hf_geo_loc_no_of_points, + { "Number of points","gad.no_of_points", + FT_UINT8,BASE_DEC, NULL, 0x0f, + "Number of points", HFILL } + }, + { &hf_geo_loc_D, + { "D: Direction of Altitude","gad.D", + FT_UINT8,BASE_DEC, VALS(dir_of_alt_vals), 0x8000, + "D: Direction of Altitude", HFILL } + }, + { &hf_geo_loc_altitude, + { "Altitude","gad.altitude", + FT_UINT16,BASE_DEC, NULL, 0x7fff, + "Altitude", HFILL } + }, + { &hf_geo_loc_inner_radius, + { "Inner radius","gad.altitude", + FT_UINT16,BASE_DEC, NULL, 0x0, + "Inner radius", HFILL } + }, + { &hf_geo_loc_uncertainty_radius, + { "Uncertainty radius","gad.no_of_points", + FT_UINT8,BASE_DEC, NULL, 0x7f, + "Uncertainty radius", HFILL } + }, + { &hf_geo_loc_offset_angle, + { "Offset angle","gad.offset_angle", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Offset angle", HFILL } + }, + { &hf_geo_loc_included_angle, + { "Included angle","gad.included_angle", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Included angle", HFILL } + }, /*--- Included file: packet-gsm_map-hfarr.c ---*/ @@ -19319,7 +19604,7 @@ void proto_register_gsm_map(void) { "", HFILL }}, /*--- End of included file: packet-gsm_map-hfarr.c ---*/ -#line 1909 "packet-gsm_map-template.c" +#line 2153 "packet-gsm_map-template.c" }; /* List of subtrees */ @@ -19336,6 +19621,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_pdptypenumber, &ett_gsm_map_RAIdentity, &ett_gsm_map_LAIFixedLength, + &ett_gsm_map_isdn_address_string, /*--- Included file: packet-gsm_map-ettarr.c ---*/ @@ -19738,7 +20024,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_AccessTypePriv, /*--- End of included file: packet-gsm_map-ettarr.c ---*/ -#line 1927 "packet-gsm_map-template.c" +#line 2172 "packet-gsm_map-template.c" }; /* Register protocol */ diff --git a/epan/dissectors/packet-gsm_map.h b/epan/dissectors/packet-gsm_map.h index f67a7a50a2..7fcb3ef4a1 100644 --- a/epan/dissectors/packet-gsm_map.h +++ b/epan/dissectors/packet-gsm_map.h @@ -1,7 +1,7 @@ /* Do not modify this file. */ /* It is created automatically by the ASN.1 to Ethereal dissector compiler */ /* .\packet-gsm_map.h */ -/* ../../tools/asn2eth.py -X -b -e -p gsm_map -c gsmmap.cnf -s packet-gsm_map-template GSMMAP.asn */ +/* ../../tools/asn2eth.py -b -e -p gsm_map -c gsmmap.cnf -s packet-gsm_map-template GSMMAP.asn */ /* Input file: packet-gsm_map-template.h */ @@ -46,6 +46,8 @@ typedef struct _gsm_map_tap_rec_t { ETH_VAR_IMPORT const value_string gsm_map_opr_code_strings[]; char* unpack_digits(tvbuff_t *tvb, int offset); +void dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + extern const value_string ssCode_vals[]; extern const value_string gsm_map_PDP_Type_Organisation_vals[]; extern const value_string gsm_map_ietf_defined_pdp_vals[]; @@ -124,6 +126,6 @@ int dissect_gsm_map_ProtectedPayload(gboolean implicit_tag, tvbuff_t *tvb, int o int dissect_gsm_map_ExtensionContainer(gboolean implicit_tag, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf_index); /*--- End of included file: packet-gsm_map-exp.h ---*/ -#line 46 "packet-gsm_map-template.h" +#line 48 "packet-gsm_map-template.h" #endif /* PACKET_GSM_MAP_H */ diff --git a/epan/dissectors/packet-rrlp.c b/epan/dissectors/packet-rrlp.c index f9d2553fbc..d972951b2a 100644 --- a/epan/dissectors/packet-rrlp.c +++ b/epan/dissectors/packet-rrlp.c @@ -455,8 +455,17 @@ static gint ett_rrlp_Rel_5_ProtocolError_Extension = -1; static int dissect_rrlp_Ext_GeographicalInformation(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) { - offset = dissect_per_octet_string(tvb, offset, pinfo, tree, hf_index, - 1, 20, NULL); +#line 23 "rrlp.cnf" + +tvbuff_t *parameter_tvb = NULL; + + offset = dissect_per_octet_string(tvb, offset, pinfo, tree, hf_index, + 1, 20, ¶meter_tvb); + + + if(parameter_tvb) + dissect_geographical_description(parameter_tvb, pinfo, tree); + return offset; } -- cgit v1.2.3