aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/mms/mms.cnf
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/asn1/mms/mms.cnf')
-rw-r--r--epan/dissectors/asn1/mms/mms.cnf134
1 files changed, 134 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/mms/mms.cnf b/epan/dissectors/asn1/mms/mms.cnf
new file mode 100644
index 0000000000..b348c6ad6b
--- /dev/null
+++ b/epan/dissectors/asn1/mms/mms.cnf
@@ -0,0 +1,134 @@
+# mms.cnf
+# mms conformation file
+
+#.MODULE_IMPORT
+ISO-8650-ACSE-1 acse
+
+#.IMPORT ../acse/acse-exp.cnf
+
+#.EXPORTS
+MMSpdu
+
+#.PDU
+
+#.NO_EMIT
+
+#.TYPE_RENAME
+
+#.TYPE_ATTR
+TimeOfDay TYPE = FT_STRING DISPLAY = BASE_NONE
+UtcTime TYPE = FT_STRING DISPLAY = BASE_NONE
+
+#.FIELD_RENAME
+
+#.FN_BODY ApplicationReference/ap-title
+ offset=dissect_acse_AP_title(FALSE, tvb, offset, actx, tree, hf_mms_ap_title);
+
+#.FN_BODY ApplicationReference/ap-invocation-id
+ offset=dissect_acse_AP_invocation_identifier(FALSE, tvb, offset, actx, tree, hf_mms_ap_invocation_id);
+
+#.FN_BODY ApplicationReference/ae-qualifier
+ offset=dissect_acse_AE_qualifier(FALSE, tvb, offset, actx, tree, hf_mms_ae_qualifier);
+
+#.FN_BODY ApplicationReference/ae-invocation-id
+ offset=dissect_acse_AE_invocation_identifier(FALSE, tvb, offset, actx, tree, hf_mms_ae_invocation_id);
+
+#.FN_BODY MMSpdu VAL_PTR=&branch_taken
+ gint branch_taken;
+
+%(DEFAULT_BODY)s
+
+ if( (branch_taken!=-1) && mms_MMSpdu_vals[branch_taken].strptr ){
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, "%%s ", mms_MMSpdu_vals[branch_taken].strptr);
+ }
+
+
+
+#.FN_BODY TimeOfDay
+
+ guint32 len;
+ guint32 milliseconds;
+ guint16 days;
+ gchar * ptime;
+ nstime_t ts;
+
+ len = tvb_reported_length_remaining(tvb, offset);
+
+ if(len == 4)
+ {
+ milliseconds = tvb_get_ntohl(tvb, offset);
+ ptime = time_msecs_to_str(wmem_packet_scope(), milliseconds);
+
+ if(hf_index >= 0)
+ {
+ proto_tree_add_string(tree, hf_index, tvb, offset, len, ptime);
+ }
+ return offset;
+ }
+
+ if(len == 6)
+ {
+ milliseconds = tvb_get_ntohl(tvb, offset);
+ days = tvb_get_ntohs(tvb, offset+4);
+
+ /* 5113 days between 01-01-1970 and 01-01-1984 */
+ /* 86400 seconds in one day */
+
+ ts.secs = (days + 5113) * 86400 + milliseconds / 1000;
+ ts.nsecs = (milliseconds %% 1000) * 1000000U;
+
+ ptime = abs_time_to_str(wmem_packet_scope(), &ts, ABSOLUTE_TIME_UTC, TRUE);
+ if(hf_index >= 0)
+ {
+ proto_tree_add_string(tree, hf_index, tvb, offset, len, ptime);
+ }
+
+ return offset;
+ }
+
+ proto_tree_add_expert_format(tree, actx->pinfo, &ei_mms_mal_timeofday_encoding,
+ tvb, offset, len, "BER Error: malformed TimeOfDay encoding, length must be 4 or 6 bytes");
+ if(hf_index >= 0)
+ {
+ proto_tree_add_string(tree, hf_index, tvb, offset, len, "????");
+ }
+ return offset;
+
+
+#.FN_BODY UtcTime
+
+ guint32 len;
+ guint32 seconds;
+ guint32 fraction;
+ guint32 nanoseconds;
+ nstime_t ts;
+ gchar * ptime;
+
+ len = tvb_reported_length_remaining(tvb, offset);
+
+ if(len != 8)
+ {
+ proto_tree_add_expert_format(tree, actx->pinfo, &ei_mms_mal_utctime_encoding,
+ tvb, offset, len, "BER Error: malformed IEC61850 UTCTime encoding, length must be 8 bytes");
+ if(hf_index >= 0)
+ {
+ proto_tree_add_string(tree, hf_index, tvb, offset, len, "????");
+ }
+ return offset;
+ }
+
+ seconds = tvb_get_ntohl(tvb, offset);
+ fraction = tvb_get_ntoh24(tvb, offset+4) * 0x100; /* Only 3 bytes are recommended */
+ nanoseconds = (guint32)( ((guint64)fraction * G_GUINT64_CONSTANT(1000000000)) / G_GUINT64_CONSTANT(0x100000000) ) ;
+
+ ts.secs = seconds;
+ ts.nsecs = nanoseconds;
+
+ ptime = abs_time_to_str(wmem_packet_scope(), &ts, ABSOLUTE_TIME_UTC, TRUE);
+
+ if(hf_index >= 0)
+ {
+ proto_tree_add_string(tree, hf_index, tvb, offset, len, ptime);
+ }
+
+ return offset;