aboutsummaryrefslogtreecommitdiffstats
path: root/asn1
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-12-13 20:14:22 +0100
committerPascal Quantin <pascal.quantin@gmail.com>2015-12-13 21:57:48 +0000
commit5cbdea74edb1f5cab3b1bb550c79b91466ede5d5 (patch)
tree62f92e6b45f2248107aabaf91796695c451da22d /asn1
parentb0caa0616bc2991468f0119573b9c509edf4287f (diff)
ULP: prettify dissection
Bug: 11039 Change-Id: I1d39367818a0039bc3100cd464baa6268c8863dd Reviewed-on: https://code.wireshark.org/review/12603 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'asn1')
-rw-r--r--asn1/ulp/packet-ulp-template.c294
-rw-r--r--asn1/ulp/ulp.cnf661
2 files changed, 951 insertions, 4 deletions
diff --git a/asn1/ulp/packet-ulp-template.c b/asn1/ulp/packet-ulp-template.c
index 13512f845a..4e35e33a3b 100644
--- a/asn1/ulp/packet-ulp-template.c
+++ b/asn1/ulp/packet-ulp-template.c
@@ -26,6 +26,8 @@
#include "config.h"
+#include "math.h"
+
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/asn1.h>
@@ -62,16 +64,281 @@ static gboolean ulp_desegment = TRUE;
#include "packet-ulp-hf.c"
static int hf_ulp_mobile_directory_number = -1;
+static int hf_ulp_ganssTimeModels_bit0 = -1;
+static int hf_ulp_ganssTimeModels_bit1 = -1;
+static int hf_ulp_ganssTimeModels_bit2 = -1;
+static int hf_ulp_ganssTimeModels_bit3 = -1;
+static int hf_ulp_ganssTimeModels_bit4 = -1;
+static int hf_ulp_ganssTimeModels_spare = -1;
/* Initialize the subtree pointers */
static gint ett_ulp = -1;
static gint ett_ulp_setid = -1;
static gint ett_ulp_thirdPartyId = -1;
+static gint ett_ulp_ganssTimeModels = -1;
#include "packet-ulp-ett.c"
+static const value_string ulp_ganss_id_vals[] = {
+ { 0, "Galileo"},
+ { 1, "SBAS"},
+ { 2, "Modernized GPS"},
+ { 3, "QZSS"},
+ { 4, "GLONASS"},
+ { 5, "BDS"},
+ { 0, NULL},
+};
+
+static const value_string ulp_ganss_sbas_id_vals[] = {
+ { 0, "WAAS"},
+ { 1, "EGNOS"},
+ { 2, "MSAS"},
+ { 3, "GAGAN"},
+ { 0, NULL},
+};
+
+static void
+ulp_ganssDataBitInterval_fmt(gchar *s, guint32 v)
+{
+ if (v == 15) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "Time interval is not specified (15)");
+ } else {
+ double interval = (0.1*pow(2, (double)v));
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%g s (%u)", interval, v);
+ }
+}
+
+static void
+ulp_ExtendedEphemeris_validity_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u h (%u)", 4*v, v);
+}
+
+static void
+ulp_PositionEstimate_latitude_fmt(gchar *s, guint32 v)
+{
+ double latitude = ((double)v*90)/pow(2,23);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%g degrees (%u)", latitude, v);
+}
+
+static void
+ulp_PositionEstimate_longitude_fmt(gchar *s, guint32 v)
+{
+ double longitude = ((double)(gint32)v*360)/pow(2,24);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%g degrees (%u)", longitude, v);
+}
+
+static void
+ulp_NMRelement_rxLev_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RxLev < -110 dBm (0)");
+ } else if (v == 63) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RxLev >= -48 dBm (63)");
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= RxLev < %d dBm (%u)", -111+v, -110+v, v);
+ }
+}
+
+static void
+ulp_UTRA_CarrierRSSI_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSSI < -100 dBm (0)");
+ } else if (v == 76) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSSI >= -25 dBm (76)");
+ } else if (v > 76) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "Spare (%u)", v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= RSSI < %d dBm (%u)", -101+v, -100+v, v);
+ }
+}
+
+static void
+ulp_PrimaryCCPCH_RSCP_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSCP < -115 dBm (0)");
+ } else if (v == 91) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSCP >= -25 dBm (91)");
+ } else if (v > 91) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "Spare (%u)", v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= RSCP < %d dBm (%u)", -116+v, -115+v, v);
+ }
+}
+
+static void
+ulp_CPICH_Ec_N0_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "CPICH Ec/N0 < -24 dB (0)");
+ } else if (v == 49) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "CPICH Ec/N0 >= 0 dB (49)");
+ } else if (v > 49) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "Spare (%u)", v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f dB <= CPICH Ec/N0 < %.1f dB (%u)", -24.5+((float)v/2), -24+((float)v/2), v);
+ }
+}
+
+static void
+ulp_CPICH_RSCP_fmt(gchar *s, guint32 v)
+{
+ if (v == 123) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "CPICH RSCP < -120 dBm (123)");
+ } else if (v > 123) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= CPICH RSCP < %d dBm (%u)", -244+v, -243+v, v);
+ } else if (v == 91) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "CPICH RSCP >= -25 dBm (91)");
+ } else if (v < 91) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm < CPICH RSCP <= %d dBm (%u)", -116+v, -115+v, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "Spare (%u)", v);
+ }
+}
+
+static void
+ulp_QoP_horacc_fmt(gchar *s, guint32 v)
+{
+ double uncertainty = 10*(pow(1.1, (double)v)-1);
+
+ if (uncertainty < 1000) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%u)", uncertainty, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f km (%u)", uncertainty/1000, v);
+ }
+}
+
+static void
+ulp_QoP_veracc_fmt(gchar *s, guint32 v)
+{
+ double uncertainty = 45*(pow(1.025, (double)v)-1);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%u)", uncertainty, v);
+}
+
+static void
+ulp_QoP_delay_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%g s (%u)", pow(2, (double)v), v);
+}
+
+static const true_false_string ulp_vertical_dir_val = {
+ "Downward",
+ "Upward"
+};
+
+static void
+ulp_RelativeTime_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f s (%u)", 0.01*v, v);
+}
+
+static void
+ulp_RSRP_Range_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSRP < -140 dBm (0)");
+ } else if (v == 97) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSRP >= -44 dBm (97)");
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= RSRP < %d dBm (%u)", -141+v, -140+v, v);
+ }
+}
+
+static void
+ulp_RSRQ_Range_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSRQ < -19.5dB (0)");
+ } else if (v == 64) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSRQ >= -3 dB (34)");
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f dB <= RSRQ < %.1f dB (%u)", -20+((float)v/2), -19.5+((float)v/2), v);
+ }
+}
+
+static void
+ulp_SignalDelta_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%s dB (%u)", v ? "0.5" : "0", v);
+}
+
+static void
+ulp_locationAccuracy_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f m (%u)", 0.1*v, v);
+}
+
+static void
+ulp_WimaxRTD_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f us (%u)", 0.01*v, v);
+}
+
+static void
+ulp_WimaxNMR_rssi_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dBm (%u)", -103.75+(0.25*v), v);
+}
+
+static void
+ulp_UTRAN_gpsReferenceTimeUncertainty_fmt(gchar *s, guint32 v)
+{
+ double uncertainty = 0.0022*(pow(1.18, (double)v)-1);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f us (%u)", uncertainty, v);
+}
+
+static const value_string ulp_ganss_time_id_vals[] = {
+ { 0, "Galileo"},
+ { 1, "QZSS"},
+ { 2, "GLONASS"},
+ { 3, "BDS"},
+ { 0, NULL},
+};
+
+static void
+ulp_utran_GANSSTimingOfCell_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f us (%u)", 0.25*v, v);
+}
+
+static void
+ulp_Coordinate_latitude_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f degrees (%u)",
+ ((float)v/8388607.0)*90, v);
+}
+
+static void
+ulp_Coordinate_longitude_fmt(gchar *s, guint32 v)
+{
+ gint32 longitude = (gint32) v;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f degrees (%d)",
+ ((float)longitude/8388608.0)*180, longitude);
+}
+
/* Include constants */
#include "packet-ulp-val.h"
+typedef struct
+{
+ guint8 notif_enc_type;
+ guint8 ganss_req_gen_data_ganss_id;
+} ulp_private_data_t;
+
+static ulp_private_data_t* ulp_get_private_data(asn1_ctx_t *actx)
+{
+ if (actx->private_data == NULL) {
+ actx->private_data = wmem_new0(wmem_packet_scope(), ulp_private_data_t);
+ }
+ return (ulp_private_data_t*)actx->private_data;
+}
#include "packet-ulp-fn.c"
@@ -103,7 +370,31 @@ void proto_register_ulp(void) {
{ &hf_ulp_mobile_directory_number,
{ "Mobile Directory Number", "ulp.mobile_directory_number",
FT_STRING, BASE_NONE, NULL, 0,
- NULL, HFILL }}
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_bit0,
+ { "GPS", "ulp.ganssTimeModels.gps",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x8000,
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_bit1,
+ { "Galileo", "ulp.ganssTimeModels.galileo",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x4000,
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_bit2,
+ { "QZSS", "ulp.ganssTimeModels.qzss",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x2000,
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_bit3,
+ { "GLONASS", "ulp.ganssTimeModels.glonass",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x1000,
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_bit4,
+ { "BDS", "ulp.ganssTimeModels.bds",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0800,
+ NULL, HFILL }},
+ { &hf_ulp_ganssTimeModels_spare,
+ { "Spare", "ulp.ganssTimeModels.spare",
+ FT_UINT16, BASE_HEX, NULL, 0x07ff,
+ NULL, HFILL }},
};
/* List of subtrees */
@@ -111,6 +402,7 @@ void proto_register_ulp(void) {
&ett_ulp,
&ett_ulp_setid,
&ett_ulp_thirdPartyId,
+ &ett_ulp_ganssTimeModels,
#include "packet-ulp-ettarr.c"
};
diff --git a/asn1/ulp/ulp.cnf b/asn1/ulp/ulp.cnf
index 55fec09162..05d8550c14 100644
--- a/asn1/ulp/ulp.cnf
+++ b/asn1/ulp/ulp.cnf
@@ -11,7 +11,6 @@ UNALIGNED
ULP-PDU
#.END
-
#.TYPE_RENAME
FrequencyInfo/modeSpecificInfo FrequencySpecificInfo
#.END
@@ -22,6 +21,8 @@ FrequencyInfo/modeSpecificInfo/fdd fdd_fr
FrequencyInfo/modeSpecificInfo/tdd tdd_fr
SlpSessionID/sessionID sessionSlpID
SETId/min minsi
+Coordinate/latitude CoordinateLatitude
+Coordinate/longitude CoordinateLongitude
#.END
#.FN_HDR ULP-PDU
@@ -49,6 +50,91 @@ guint32 UlpMessage;
#.END
+#.FN_BODY Notification
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+ ulp_priv->notif_enc_type = -1;
+%(DEFAULT_BODY)s
+
+#.FN_BODY EncodingType VAL_PTR=&val
+ guint32 val;
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+%(DEFAULT_BODY)s
+ ulp_priv->notif_enc_type = (guint8) val;
+
+#.FN_BODY Notification/requestorId VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+ switch(ulp_priv->notif_enc_type) {
+ case 0: /* UCS-2 */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb),
+ ENC_UCS_2|ENC_BIG_ENDIAN);
+ break;
+ case 1: /* GSM 7bits */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb), ENC_3GPP_TS_23_038_7BITS|ENC_NA);
+ break;
+ case 2: /* UTF-8 */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb), ENC_UTF_8|ENC_NA);
+ break;
+ default:
+ actx->created_item = proto_tree_add_string(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb),
+ tvb_bytes_to_str(wmem_packet_scope(), val_tvb, 0,
+ tvb_reported_length(val_tvb)));
+ break;
+ }
+ }
+
+#.TYPE_ATTR
+Notification/requestorId TYPE=FT_STRING DISPLAY=STR_UNICODE
+
+#.FN_BODY Notification/clientName VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+ switch(ulp_priv->notif_enc_type) {
+ case 0: /* UCS-2 */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb),
+ ENC_UCS_2|ENC_BIG_ENDIAN);
+ break;
+ case 1: /* GSM 7bits */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb), ENC_3GPP_TS_23_038_7BITS|ENC_NA);
+ break;
+ case 2: /* UTF-8 */
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb), ENC_UTF_8|ENC_NA);
+ break;
+ default:
+ actx->created_item = proto_tree_add_string(tree, hf_index, val_tvb, 0,
+ tvb_reported_length(val_tvb),
+ tvb_bytes_to_str(wmem_packet_scope(), val_tvb, 0,
+ tvb_reported_length(val_tvb)));
+ break;
+ }
+ }
+
+#.TYPE_ATTR
+Notification/clientName TYPE=FT_STRING DISPLAY=STR_UNICODE
+
+#.FN_BODY NavigationModel/gpsToe
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " hr");
+
+#.FN_BODY NavigationModel/toeLimit
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " hr");
+
#.FN_BODY PosPayLoad/rrlpPayload VAL_PTR = &rrlp_tvb
tvbuff_t *rrlp_tvb;
@@ -58,6 +144,153 @@ guint32 UlpMessage;
call_dissector(rrlp_handle, rrlp_tvb, %(ACTX)s->pinfo, tree);
}
+#.FN_BODY PeriodicParams/intervalBetweenFixes
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY PeriodicParams/startTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY AreaEventParams/startTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY AreaEventParams/stopTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY RepeatedReportingParams/minimumIntervalTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY WLANAreaId/apMACAddress VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_item(tree, hf_index, val_tvb, 0, 6, ENC_NA);
+ }
+
+#.TYPE_ATTR
+WLANAreaId/apMACAddress TYPE=FT_ETHER
+
+#.TYPE_ATTR
+GANSSSignalsDescription/ganssId STRINGS=VALS(ulp_ganss_id_vals)
+
+#.FN_BODY TimeStamp/relativeTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY ReportingCriteria/minTimeInterval
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY TimeWindow/startTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " min");
+
+#.FN_BODY TimeWindow/stopTime
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " min");
+
+#.TYPE_ATTR
+GANSSPositionMethod/ganssId STRINGS=VALS(ulp_ganss_id_vals)
+
+#.FN_BODY GANSSPositionMethod/ganssSBASid VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 3, ENC_NA);
+ }
+
+#.TYPE_ATTR
+GANSSPositionMethod/ganssSBASid TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(ulp_ganss_sbas_id_vals)
+
+#.FN_BODY GanssReqGenericData/ganssId VAL_PTR=&val
+ guint32 val;
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+%(DEFAULT_BODY)s
+ ulp_priv->ganss_req_gen_data_ganss_id = (guint8) val;
+
+#.TYPE_ATTR
+GanssReqGenericData/ganssId STRINGS=VALS(ulp_ganss_id_vals)
+
+#.FN_BODY GanssReqGenericData/ganssSBASid VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 3, ENC_NA);
+ }
+
+#.TYPE_ATTR
+GanssReqGenericData/ganssSBASid TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(ulp_ganss_sbas_id_vals)
+
+#.FN_BODY GanssReqGenericData/ganssTimeModels VAL_PTR=&val_tvb
+ tvbuff_t *val_tvb;
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree *subtree = proto_item_add_subtree(actx->created_item, ett_ulp_ganssTimeModels);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_bit0, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_bit1, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_bit2, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_bit3, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_bit4, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_ulp_ganssTimeModels_spare, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ }
+
+#.FN_BODY GanssNavigationModelData/ganssWeek
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+%(DEFAULT_BODY)s
+ if (ulp_priv->ganss_req_gen_data_ganss_id != 4) {
+ /* Not GLONASS */
+ proto_item_append_text(actx->created_item, " wk");
+ } else {
+ proto_item_append_text(actx->created_item, " d");
+ }
+
+#.FN_BODY GanssNavigationModelData/ganssToe VAL_PTR=&val
+ guint32 val;
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+%(DEFAULT_BODY)s
+
+#.FN_FTR GanssNavigationModelData/ganssToe
+ if (ulp_priv->ganss_req_gen_data_ganss_id != 4) {
+ /* Not GLONASS */
+ proto_item_append_text(actx->created_item, " h");
+ } else {
+ proto_item_set_text(actx->created_item, "%u min (%u)", 15*val, val);
+ }
+
+#.FN_BODY GanssNavigationModelData/t-toeLimit VAL_PTR=&val
+ guint32 val;
+ ulp_private_data_t *ulp_priv = ulp_get_private_data(actx);
+
+%(DEFAULT_BODY)s
+
+#.FN_FTR GanssNavigationModelData/t-toeLimit
+ if (ulp_priv->ganss_req_gen_data_ganss_id != 4) {
+ /* Not GLONASS */
+ proto_item_append_text(actx->created_item, " h");
+ } else {
+ proto_item_set_text(actx->created_item, "%u min (%u)", 30*val, val);
+ }
+
+#.FN_BODY GanssDataBits/ganssTODmin
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+ReqDataBitAssistanceList/ganssDataBitInterval DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_ganssDataBitInterval_fmt)
+
+#.TYPE_ATTR
+ExtendedEphemeris/validity DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_ExtendedEphemeris_validity_fmt)
+
#.FN_BODY Ver2-PosPayLoad-extension/lPPPayload/_item VAL_PTR = &lpp_tvb
tvbuff_t *lpp_tvb;
@@ -97,6 +330,397 @@ guint32 UlpMessage;
dissect_e212_imsi(imsi_tvb, actx->pinfo, subtree, 0, 8, FALSE);
}
+#.TYPE_ATTR
+IPAddress/ipv4Address TYPE = FT_IPv4 DISPLAY = BASE_NONE STRINGS = NULL
+IPAddress/ipv6Address TYPE = FT_IPv6 DISPLAY = BASE_NONE STRINGS = NULL
+
+#.TYPE_ATTR
+PositionEstimate/latitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_PositionEstimate_latitude_fmt)
+
+#.TYPE_ATTR
+PositionEstimate/longitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_PositionEstimate_longitude_fmt)
+
+#.TYPE_ATTR
+PositionEstimate/uncertainty/uncertaintySemiMajor DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_horacc_fmt)
+
+#.TYPE_ATTR
+PositionEstimate/uncertainty/uncertaintySemiMinor DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_horacc_fmt)
+
+#.FN_BODY PositionEstimate/uncertainty/orientationMajorAxis
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " degrees");
+
+#.FN_FTR PositionEstimate/confidence
+ proto_item_append_text(actx->created_item, "%%");
+
+#.FN_BODY AltitudeInfo/altitude
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " m");
+
+#.TYPE_ATTR
+AltitudeInfo/altUncertainty DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_veracc_fmt)
+
+#.TYPE_ATTR
+NMRelement/rxLev DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_NMRelement_rxLev_fmt)
+
+#.TYPE_ATTR
+UTRA-CarrierRSSI DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_UTRA_CarrierRSSI_fmt)
+
+#.TYPE_ATTR
+PrimaryCCPCH-RSCP DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_PrimaryCCPCH_RSCP_fmt)
+
+#.TYPE_ATTR
+CPICH-Ec-N0 DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_CPICH_Ec_N0_fmt)
+
+#.TYPE_ATTR
+CPICH-RSCP DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_CPICH_RSCP_fmt)
+
+#.TYPE_ATTR
+QoP/horacc DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_horacc_fmt)
+
+#.TYPE_ATTR
+QoP/veracc DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_veracc_fmt)
+
+#.FN_BODY QoP/maxLocAge
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+QoP/delay DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_QoP_delay_fmt)
+
+#.FN_BODY Horvel/bearing VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 9, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " degrees");
+ }
+
+#.TYPE_ATTR
+Horvel/bearing TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horvel/horspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horvel/horspeed TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandvervel/verdirect VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 1, ENC_NA);
+ }
+
+#.TYPE_ATTR
+Horandvervel/verdirect TYPE=FT_BOOLEAN STRINGS=TFS(&ulp_vertical_dir_val)
+
+#.FN_BODY Horandvervel/bearing VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 9, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " degrees");
+ }
+
+#.TYPE_ATTR
+Horandvervel/bearing TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandvervel/horspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandvervel/horspeed TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandvervel/verspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandvervel/verspeed TYPE=FT_UINT8 DISPLAY=BASE_DEC
+
+#.FN_BODY Horveluncert/bearing VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 9, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " degrees");
+ }
+
+#.TYPE_ATTR
+Horveluncert/bearing TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horveluncert/horspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horveluncert/horspeed TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horveluncert/uncertspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horveluncert/uncertspeed TYPE=FT_UINT8 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandveruncert/verdirect VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 1, ENC_NA);
+ }
+
+#.TYPE_ATTR
+Horandveruncert/verdirect TYPE=FT_BOOLEAN STRINGS=TFS(&ulp_vertical_dir_val)
+
+#.FN_BODY Horandveruncert/bearing VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_bits_item(tree, hf_index, val_tvb, 0, 9, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " degrees");
+ }
+
+#.TYPE_ATTR
+Horandveruncert/bearing TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandveruncert/horspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 2, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandveruncert/horspeed TYPE=FT_UINT16 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandveruncert/verspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandveruncert/verspeed TYPE=FT_UINT8 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandveruncert/horuncertspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandveruncert/horuncertspeed TYPE=FT_UINT8 DISPLAY=BASE_DEC
+
+#.FN_BODY Horandveruncert/veruncertspeed VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, val_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(actx->created_item, " km/h");
+ }
+
+#.TYPE_ATTR
+Horandveruncert/veruncertspeed TYPE=FT_UINT8 DISPLAY=BASE_DEC
+
+#.TYPE_ATTR
+RelativeTime DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_RelativeTime_fmt)
+
+#.FN_BODY SupportedWLANApData/apMACAddress VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_item(tree, hf_index, val_tvb, 0, 6, ENC_NA);
+ }
+
+#.TYPE_ATTR
+SupportedWLANApData/apMACAddress TYPE=FT_ETHER
+
+#.TYPE_ATTR
+RSRP-Range DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_RSRP_Range_fmt)
+
+#.TYPE_ATTR
+RSRQ-Range DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_RSRQ_Range_fmt)
+
+#.FN_BODY WlanAPInformation/apMACAddress VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_item(tree, hf_index, val_tvb, 0, 6, ENC_NA);
+ }
+
+#.TYPE_ATTR
+WlanAPInformation/apMACAddress TYPE=FT_ETHER
+
+#.FN_BODY WlanAPInformation/apTransmitPower
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBm");
+
+#.FN_BODY WlanAPInformation/apAntennaGain
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBi");
+
+#.FN_BODY WlanAPInformation/apSignaltoNoise
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dB");
+
+#.FN_BODY WlanAPInformation/apSignalStrength
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBm");
+
+#.FN_BODY WlanAPInformation/setTransmitPower
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBm");
+
+#.FN_BODY WlanAPInformation/setAntennaGain
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBi");
+
+#.FN_BODY WlanAPInformation/setSignaltoNoise
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dB");
+
+#.FN_BODY WlanAPInformation/setSignalStrength
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dBm");
+
+#.TYPE_ATTR
+WlanAPInformation/apSignalStrengthDelta DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_SignalDelta_fmt)
+
+#.TYPE_ATTR
+WlanAPInformation/apSignaltoNoiseDelta DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_SignalDelta_fmt)
+
+#.TYPE_ATTR
+WlanAPInformation/setSignalStrengthDelta DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_SignalDelta_fmt)
+
+#.TYPE_ATTR
+WlanAPInformation/setSignaltoNoiseDelta DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_SignalDelta_fmt)
+
+#.FN_BODY WlanAPInformation/apSSID VAL_PTR=&ssid_tvb HF_INDEX=-1
+ tvbuff_t *ssid_tvb;
+
+%(DEFAULT_BODY)s
+ if (ssid_tvb) {
+ actx->created_item = proto_tree_add_item(tree, hf_index, ssid_tvb, 0, -1, ENC_ASCII|ENC_NA);
+ }
+
+#.TYPE_ATTR
+WlanAPInformation/apSSID TYPE=FT_STRING DISPLAY=STR_ASCII
+
+#.FN_BODY WlanAPInformation/setMACAddress VAL_PTR=&val_tvb HF_INDEX=-1
+ tvbuff_t *val_tvb;
+
+%(DEFAULT_BODY)s
+ if (val_tvb) {
+ proto_tree_add_item(tree, hf_index, val_tvb, 0, 6, ENC_NA);
+ }
+
+#.TYPE_ATTR
+WlanAPInformation/setMACAddress TYPE=FT_ETHER
+
+#.TYPE_ATTR
+LocationData/locationAccuracy DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_locationAccuracy_fmt)
+
+#.TYPE_ATTR
+WimaxRTD/rtd DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxRTD_fmt)
+
+#.TYPE_ATTR
+WimaxRTD/rTDstd DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxRTD_fmt)
+
+#.TYPE_ATTR
+WimaxNMR/relDelay DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxRTD_fmt)
+
+#.TYPE_ATTR
+WimaxNMR/relDelaystd DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxRTD_fmt)
+
+#.TYPE_ATTR
+WimaxNMR/rssi DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxNMR_rssi_fmt)
+
+#.FN_BODY WimaxNMR/rSSIstd
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dB");
+
+#.TYPE_ATTR
+WimaxNMR/bSTxPower DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_WimaxNMR_rssi_fmt)
+
+#.FN_BODY WimaxNMR/cinr
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dB");
+
+#.FN_BODY WimaxNMR/cINRstd
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " dB");
+
+#.TYPE_ATTR
+UTRAN-GPSReferenceTimeAssistance/gpsReferenceTimeUncertainty DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_UTRAN_gpsReferenceTimeUncertainty_fmt)
+
+#.TYPE_ATTR
+UTRAN-GPSReferenceTimeResult/gpsReferenceTimeUncertainty DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_UTRAN_gpsReferenceTimeUncertainty_fmt)
+
+#.TYPE_ATTR
+UTRAN-GANSSReferenceTimeAssistance/ganssTimeID STRINGS=VALS(ulp_ganss_time_id_vals)
+
+#.FN_BODY UTRAN-GANSSReferenceTime/ganssTOD
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+UTRAN-GANSSReferenceTime/utran-GANSSTimingOfCell DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_utran_GANSSTimingOfCell_fmt)
+
+#.TYPE_ATTR
+UTRAN-GANSSReferenceTime/ganss-TODUncertainty DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_UTRAN_gpsReferenceTimeUncertainty_fmt)
+
+#.TYPE_ATTR
+UTRAN-GANSSReferenceTimeResult/ganssTimeID STRINGS=VALS(ulp_ganss_time_id_vals)
+
+#.TYPE_ATTR
+SET-GANSSReferenceTime/ganss-TODUncertainty ulp_UTRAN_gpsReferenceTimeUncertainty_fmtulp_UTRAN_gpsReferenceTimeUncertainty_fmt)
+
#.FN_BODY ThirdPartyID/msisdn VAL_PTR=&msisdn_tvb
tvbuff_t *msisdn_tvb;
%(DEFAULT_BODY)s
@@ -133,7 +757,38 @@ guint32 UlpMessage;
1, 255, FALSE, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./-_~%%#", 69,
NULL);
+#.FN_BODY ReportingCap/minInt
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_BODY ReportingCap/maxInt
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " min");
+
#.TYPE_ATTR
-IPAddress/ipv4Address TYPE = FT_IPv4 DISPLAY = BASE_NONE STRINGS = NULL
-IPAddress/ipv6Address TYPE = FT_IPv6 DISPLAY = BASE_NONE STRINGS = NULL
+Coordinate/latitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_Coordinate_latitude_fmt)
+
+#.TYPE_ATTR
+Coordinate/longitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ulp_Coordinate_longitude_fmt)
+
+#.FN_BODY CircularArea/radius
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " m");
+
+#.FN_BODY EllipticalArea/semiMajor
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " m");
+
+#.FN_BODY EllipticalArea/semiMinor
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " m");
+
+#.FN_BODY EllipticalArea/angle
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " degrees");
+
+#.FN_BODY PolygonArea/polygonHysteresis
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " m");
+
#.END