aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Kukosa <kukosa@herman.cz>2021-08-31 13:12:47 +0200
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-08-31 16:55:52 +0000
commit16b1cdb23fa9b164879592d7e30020a114e757f9 (patch)
tree87d27330673b63eb1bc66eb4d78a087d6f74cfe8
parenta728da1f2880a1014de086251b300765c1bffd28 (diff)
IEEE1609dot2: use custom formatters for better readability
-rw-r--r--epan/dissectors/asn1/ieee1609dot2/IEEE1609dot12.asn2
-rw-r--r--epan/dissectors/asn1/ieee1609dot2/ieee1609dot2.cnf12
-rw-r--r--epan/dissectors/asn1/ieee1609dot2/packet-ieee1609dot2-template.c63
-rw-r--r--epan/dissectors/packet-geonw.c3
-rw-r--r--epan/dissectors/packet-ieee1609dot2.c110
-rw-r--r--epan/dissectors/packet-ieee1609dot2.h1
6 files changed, 161 insertions, 30 deletions
diff --git a/epan/dissectors/asn1/ieee1609dot2/IEEE1609dot12.asn b/epan/dissectors/asn1/ieee1609dot2/IEEE1609dot12.asn
index 44b77465f4..7cd75a4b83 100644
--- a/epan/dissectors/asn1/ieee1609dot2/IEEE1609dot12.asn
+++ b/epan/dissectors/asn1/ieee1609dot2/IEEE1609dot12.asn
@@ -69,6 +69,8 @@ psid-traffic-light-control-status-service Psid ::= 637
psid-certificate-revocation-list-application Psid ::= 256 -- CAMP
+psid-collective-perception-service Psid ::= 8319 -- ETSI-TS-103-324
+
-- 0x01-01 to 0x3E-7F 0p80-81 to 0pBD-FF Not allocated
-- 0x3E-80 to 0x40-1F 0pBE-00 to 0pBF-9F Reserved IEEE P1609 WG 416
-- 0x40-20 to 0x40-5F 0pBF-A0 to 0pBF-DF Private used IEEE P1609 WG 64
diff --git a/epan/dissectors/asn1/ieee1609dot2/ieee1609dot2.cnf b/epan/dissectors/asn1/ieee1609dot2/ieee1609dot2.cnf
index 1d113e5fd5..4fa376b8b7 100644
--- a/epan/dissectors/asn1/ieee1609dot2/ieee1609dot2.cnf
+++ b/epan/dissectors/asn1/ieee1609dot2/ieee1609dot2.cnf
@@ -21,6 +21,10 @@ Ieee1609Dot2Data
#.NO_EMIT
+#.NO_EMIT ONLY_VALS
+NinetyDegreeInt
+OneEightyDegreeInt
+
#.OMIT_ASSIGNMENT
# Get rid of unused code warnings
TestCertificate
@@ -66,6 +70,13 @@ EncryptedDataEncryptionKey/eciesNistP256 edeEciesNistP256
EncryptedDataEncryptionKey/eciesBrainpoolP256r1 edekEciesBrainpoolP256r1
+#.TYPE_ATTR
+NinetyDegreeInt DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ieee1609dot2_NinetyDegreeInt_fmt)
+OneEightyDegreeInt DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ieee1609dot2_OneEightyDegreeInt_fmt)
+ElevInt DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ieee1609dot2_ElevInt_fmt)
+Time32 DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ieee1609dot2_Time32_fmt)
+Time64 DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(ieee1609dot2_Time64_fmt)
+
#.FIELD_ATTR
SspRange/opaque ABBREV=srRange.opaque
@@ -172,6 +183,7 @@ psid-infrastructure-to-vehicle-information-service Psid
psid-traffic-light-control-service Psid
psid-geonetworking-management-communications Psid
psid-certificate-revocation-list-application Psid
+psid-collective-perception-service Psid
psid-vehicle-initiated-distress-notivication Psid
psid-fast-service-advertisement-protocol Psid
psid-its-station-internal-management-communications-protocol Psid
diff --git a/epan/dissectors/asn1/ieee1609dot2/packet-ieee1609dot2-template.c b/epan/dissectors/asn1/ieee1609dot2/packet-ieee1609dot2-template.c
index 5b95e87bfe..1ad34ce75e 100644
--- a/epan/dissectors/asn1/ieee1609dot2/packet-ieee1609dot2-template.c
+++ b/epan/dissectors/asn1/ieee1609dot2/packet-ieee1609dot2-template.c
@@ -15,6 +15,8 @@
#include "config.h"
+#include <time.h>
+
#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/oids.h>
@@ -57,6 +59,67 @@ ieee1609dot2_set_next_default_psid(packet_info *pinfo, guint32 psid)
#include "packet-ieee1609dot2-fn.c"
+static void
+ieee1609dot2_NinetyDegreeInt_fmt(gchar *s, guint32 v)
+{
+ gint32 lat = (gint32)v;
+ if (lat == 900000001) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lat);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
+ abs(lat) / 10000000,
+ abs(lat) % 10000000 * 6 / 1000000,
+ abs(lat) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
+ (lat >= 0) ? 'N' : 'S',
+ lat);
+ }
+}
+
+static void
+ieee1609dot2_OneEightyDegreeInt_fmt(gchar *s, guint32 v)
+{
+ gint32 lng = (gint32)v;
+ if (lng == 1800000001) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lng);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
+ abs(lng) / 10000000,
+ abs(lng) % 10000000 * 6 / 1000000,
+ abs(lng) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
+ (lng >= 0) ? 'E' : 'W',
+ lng);
+ }
+}
+
+static void
+ieee1609dot2_ElevInt_fmt(gchar *s, guint32 v)
+{
+ // Range is from -4096 to 61439 in units of one-tenth of a meter
+ gint32 alt = (gint32)v - 4096;
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%u)", alt * 0.1, v);
+}
+
+static void
+ieee1609dot2_Time32_fmt(gchar *s, guint32 v)
+{
+ time_t secs = v + 1072915200 - 5;
+ struct tm *tm = gmtime(&secs);
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u-%02u-%02u %02u:%02u:%02u (%" G_GUINT64_FORMAT ")",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, v
+ );
+}
+
+static void
+ieee1609dot2_Time64_fmt(gchar *s, guint64 v)
+{
+ time_t secs = v / 1000000 + 1072915200 - 5;
+ guint32 usecs = v % 1000000;
+ struct tm *tm = gmtime(&secs);
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u-%02u-%02u %02u:%02u:%02u.%06u (%" G_GUINT64_FORMAT ")",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, usecs, v
+ );
+}
+
/*--- proto_register_ieee1609dot2 ----------------------------------------------*/
void proto_register_ieee1609dot2(void) {
diff --git a/epan/dissectors/packet-geonw.c b/epan/dissectors/packet-geonw.c
index de00dd6377..27876d2a36 100644
--- a/epan/dissectors/packet-geonw.c
+++ b/epan/dissectors/packet-geonw.c
@@ -3650,7 +3650,10 @@ proto_reg_handoff_geonw(void)
dissector_add_uint("ieee1609dot2.psid", psid_road_and_lane_topology_service, sgeonw_handle_);
dissector_add_uint("ieee1609dot2.psid", psid_infrastructure_to_vehicle_information_service, sgeonw_handle_);
dissector_add_uint("ieee1609dot2.psid", psid_traffic_light_control_requests_service, sgeonw_handle_);
+ dissector_add_uint("ieee1609dot2.psid", psid_geonetworking_management_communications, sgeonw_handle_);
dissector_add_uint("ieee1609dot2.psid", psid_traffic_light_control_status_service, sgeonw_handle_);
+ dissector_add_uint("ieee1609dot2.psid", psid_collective_perception_service, sgeonw_handle_);
+
}
/*
diff --git a/epan/dissectors/packet-ieee1609dot2.c b/epan/dissectors/packet-ieee1609dot2.c
index 04c9436f56..cdb12c5a8c 100644
--- a/epan/dissectors/packet-ieee1609dot2.c
+++ b/epan/dissectors/packet-ieee1609dot2.c
@@ -23,6 +23,8 @@
#include "config.h"
+#include <time.h>
+
#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/oids.h>
@@ -213,7 +215,7 @@ static int hf_ieee1609dot2_EndEntityType_app = -1;
static int hf_ieee1609dot2_EndEntityType_enrol = -1;
/*--- End of included file: packet-ieee1609dot2-hf.c ---*/
-#line 38 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+#line 40 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
/* Initialize the subtree pointers */
static int ett_ieee1609dot2_ssp = -1;
@@ -290,7 +292,7 @@ static gint ett_ieee1609dot2_SubjectPermissions = -1;
static gint ett_ieee1609dot2_VerificationKeyIndicator = -1;
/*--- End of included file: packet-ieee1609dot2-ett.c ---*/
-#line 42 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+#line 44 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
static dissector_table_t unsecured_data_subdissector_table;
static dissector_table_t ssp_subdissector_table;
@@ -490,13 +492,6 @@ dissect_ieee1609dot2_ValidityPeriod(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_
}
-static const value_string ieee1609dot2_NinetyDegreeInt_vals[] = {
- { -900000000, "min" },
- { 900000000, "max" },
- { 900000001, "unknown" },
- { 0, NULL }
-};
-
static int
dissect_ieee1609dot2_NinetyDegreeInt(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
@@ -516,13 +511,6 @@ dissect_ieee1609dot2_Latitude(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act
}
-static const value_string ieee1609dot2_OneEightyDegreeInt_vals[] = {
- { -1799999999, "min" },
- { 1800000000, "max" },
- { 1800000001, "unknown" },
- { 0, NULL }
-};
-
static int
dissect_ieee1609dot2_OneEightyDegreeInt(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
@@ -1165,6 +1153,7 @@ const val64_string ieee1609dot2_Psid_vals[] = {
{ psid_geonetworking_management_communications, "psid-geonetworking-management-communications" },
{ psid_traffic_light_control_status_service, "psid-traffic-light-control-status-service" },
{ psid_certificate_revocation_list_application, "psid-certificate-revocation-list-application" },
+ { psid_collective_perception_service, "psid-collective-perception-service" },
{ psid_vehicle_initiated_distress_notivication, "psid-vehicle-initiated-distress-notivication" },
{ psid_fast_service_advertisement_protocol, "psid-fast-service-advertisement-protocol" },
{ psid_its_station_internal_management_communications_protocol, "psid-its-station-internal-management-communications-protocol" },
@@ -1191,7 +1180,7 @@ dissect_ieee1609dot2_Psid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U
static int
dissect_ieee1609dot2_T_psPsid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 111 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
+#line 122 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
offset = dissect_oer_constrained_integer_64b_no_ub(tvb, offset, actx, tree, hf_index,
0U, NO_BOUND, &((ieee1609_private_data_t*)actx->private_data)->psidssp, FALSE);
@@ -1204,7 +1193,7 @@ dissect_ieee1609dot2_T_psPsid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act
static int
dissect_ieee1609dot2_T_opaque(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 115 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
+#line 126 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
tvbuff_t *ssp;
ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
@@ -1469,7 +1458,7 @@ dissect_ieee1609dot2_GroupLinkageValue(tvbuff_t *tvb _U_, int offset _U_, asn1_c
static int
dissect_ieee1609dot2_T_unsecuredData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 77 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
+#line 88 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
@@ -1495,7 +1484,7 @@ dissect_ieee1609dot2_T_unsecuredData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx
static int
dissect_ieee1609dot2_T_hiPsid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 96 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
+#line 107 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
guint64 psid;
ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
@@ -2058,7 +2047,7 @@ static const oer_sequence_t Ieee1609Dot2Data_sequence[] = {
static int
dissect_ieee1609dot2_Ieee1609Dot2Data(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 73 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
+#line 84 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
actx->private_data = (void*)wmem_new0(actx->pinfo->pool, ieee1609_private_data_t);
offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
@@ -2114,8 +2103,69 @@ static int dissect_Ieee1609Dot2Data_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U
/*--- End of included file: packet-ieee1609dot2-fn.c ---*/
-#line 58 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+#line 60 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+
+
+static void
+ieee1609dot2_NinetyDegreeInt_fmt(gchar *s, guint32 v)
+{
+ gint32 lat = (gint32)v;
+ if (lat == 900000001) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lat);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
+ abs(lat) / 10000000,
+ abs(lat) % 10000000 * 6 / 1000000,
+ abs(lat) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
+ (lat >= 0) ? 'N' : 'S',
+ lat);
+ }
+}
+
+static void
+ieee1609dot2_OneEightyDegreeInt_fmt(gchar *s, guint32 v)
+{
+ gint32 lng = (gint32)v;
+ if (lng == 1800000001) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lng);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
+ abs(lng) / 10000000,
+ abs(lng) % 10000000 * 6 / 1000000,
+ abs(lng) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
+ (lng >= 0) ? 'E' : 'W',
+ lng);
+ }
+}
+static void
+ieee1609dot2_ElevInt_fmt(gchar *s, guint32 v)
+{
+ // Range is from -4096 to 61439 in units of one-tenth of a meter
+ gint32 alt = (gint32)v - 4096;
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%u)", alt * 0.1, v);
+}
+
+static void
+ieee1609dot2_Time32_fmt(gchar *s, guint32 v)
+{
+ time_t secs = v + 1072915200 - 5;
+ struct tm *tm = gmtime(&secs);
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u-%02u-%02u %02u:%02u:%02u (%" G_GUINT64_FORMAT ")",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, v
+ );
+}
+
+static void
+ieee1609dot2_Time64_fmt(gchar *s, guint64 v)
+{
+ time_t secs = v / 1000000 + 1072915200 - 5;
+ guint32 usecs = v % 1000000;
+ struct tm *tm = gmtime(&secs);
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u-%02u-%02u %02u:%02u:%02u.%06u (%" G_GUINT64_FORMAT ")",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, usecs, v
+ );
+}
/*--- proto_register_ieee1609dot2 ----------------------------------------------*/
void proto_register_ieee1609dot2(void) {
@@ -2143,7 +2193,7 @@ void proto_register_ieee1609dot2(void) {
NULL, HFILL }},
{ &hf_ieee1609dot2_start,
{ "start", "ieee1609dot2.start",
- FT_UINT32, BASE_DEC, NULL, 0,
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(ieee1609dot2_Time32_fmt), 0,
"Time32", HFILL }},
{ &hf_ieee1609dot2_duration,
{ "duration", "ieee1609dot2.duration",
@@ -2219,11 +2269,11 @@ void proto_register_ieee1609dot2(void) {
NULL, HFILL }},
{ &hf_ieee1609dot2_latitude,
{ "latitude", "ieee1609dot2.latitude",
- FT_INT32, BASE_DEC, VALS(ieee1609dot2_NinetyDegreeInt_vals), 0,
+ FT_INT32, BASE_CUSTOM, CF_FUNC(ieee1609dot2_NinetyDegreeInt_fmt), 0,
NULL, HFILL }},
{ &hf_ieee1609dot2_longitude,
{ "longitude", "ieee1609dot2.longitude",
- FT_INT32, BASE_DEC, VALS(ieee1609dot2_OneEightyDegreeInt_vals), 0,
+ FT_INT32, BASE_CUSTOM, CF_FUNC(ieee1609dot2_OneEightyDegreeInt_fmt), 0,
NULL, HFILL }},
{ &hf_ieee1609dot2_countryOnly,
{ "countryOnly", "ieee1609dot2.countryOnly",
@@ -2267,7 +2317,7 @@ void proto_register_ieee1609dot2(void) {
NULL, HFILL }},
{ &hf_ieee1609dot2_elevation,
{ "elevation", "ieee1609dot2.elevation",
- FT_UINT32, BASE_DEC, NULL, 0,
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(ieee1609dot2_ElevInt_fmt), 0,
NULL, HFILL }},
{ &hf_ieee1609dot2_ecdsaNistP256Signature,
{ "ecdsaNistP256Signature", "ieee1609dot2.ecdsaNistP256Signature_element",
@@ -2543,11 +2593,11 @@ void proto_register_ieee1609dot2(void) {
"T_hiPsid", HFILL }},
{ &hf_ieee1609dot2_generationTime,
{ "generationTime", "ieee1609dot2.generationTime",
- FT_UINT64, BASE_DEC, NULL, 0,
+ FT_UINT64, BASE_CUSTOM, CF_FUNC(ieee1609dot2_Time64_fmt), 0,
"Time64", HFILL }},
{ &hf_ieee1609dot2_expiryTime,
{ "expiryTime", "ieee1609dot2.expiryTime",
- FT_UINT64, BASE_DEC, NULL, 0,
+ FT_UINT64, BASE_CUSTOM, CF_FUNC(ieee1609dot2_Time64_fmt), 0,
"Time64", HFILL }},
{ &hf_ieee1609dot2_generationLocation,
{ "generationLocation", "ieee1609dot2.generationLocation_element",
@@ -2787,7 +2837,7 @@ void proto_register_ieee1609dot2(void) {
NULL, HFILL }},
/*--- End of included file: packet-ieee1609dot2-hfarr.c ---*/
-#line 66 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+#line 129 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
};
/* List of subtrees */
@@ -2865,7 +2915,7 @@ void proto_register_ieee1609dot2(void) {
&ett_ieee1609dot2_VerificationKeyIndicator,
/*--- End of included file: packet-ieee1609dot2-ettarr.c ---*/
-#line 71 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
+#line 134 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
&ett_ieee1609dot2_ssp,
};
diff --git a/epan/dissectors/packet-ieee1609dot2.h b/epan/dissectors/packet-ieee1609dot2.h
index eadc56ac4b..3b9f811f83 100644
--- a/epan/dissectors/packet-ieee1609dot2.h
+++ b/epan/dissectors/packet-ieee1609dot2.h
@@ -84,6 +84,7 @@ typedef enum _Psid_enum {
psid_geonetworking_management_communications = 141,
psid_traffic_light_control_status_service = 637,
psid_certificate_revocation_list_application = 256,
+ psid_collective_perception_service = 8319,
psid_vehicle_initiated_distress_notivication = 16514,
psid_fast_service_advertisement_protocol = 2113664,
psid_its_station_internal_management_communications_protocol = 2113665,